Stabilized admin-tests
- stop-removefiles-start principle replaced by asadmin commands (junit extension)
- discovery: detached jobs don't survive restarting domain, synchronous do.
Signed-off-by: David Matějček <dmatej@seznam.cz>
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/ClusterITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/ClusterITest.java
index 9794619..aaaa56c 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/ClusterITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/ClusterITest.java
@@ -90,8 +90,8 @@
@Test
@Order(3)
public void startInstancesTest() {
- assertThat(ASADMIN.exec(30_000, false, "start-local-instance", INSTANCE_NAME_1), asadminOK());
- assertThat(ASADMIN.exec(30_000, false, "start-local-instance", INSTANCE_NAME_2), asadminOK());
+ assertThat(ASADMIN.exec(30_000, "start-local-instance", INSTANCE_NAME_1), asadminOK());
+ assertThat(ASADMIN.exec(30_000, "start-local-instance", INSTANCE_NAME_2), asadminOK());
}
@Test
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/DetachAttachITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/DetachAttachITest.java
index 0c7d3e5..58de9a9 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/DetachAttachITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/DetachAttachITest.java
@@ -19,28 +19,26 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import java.util.StringTokenizer;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-import java.util.concurrent.ThreadFactory;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.glassfish.main.admin.test.tool.asadmin.Asadmin;
import org.glassfish.main.admin.test.tool.asadmin.AsadminResult;
+import org.glassfish.main.admin.test.tool.asadmin.DetachedTerseAsadminResult;
import org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import static org.glassfish.main.admin.test.tool.AsadminResultMatcher.asadminOK;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.stringContainsInOrder;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -51,10 +49,12 @@
/**
* @author martinmares
*/
+@ExtendWith(JobTestExtension.class)
public class DetachAttachITest {
private static final Logger LOG = Logger.getLogger(DetachAttachITest.class.getName());
private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
@Test
public void uptimePeriodically() throws Exception {
Set<String> ids = new HashSet<>();
@@ -62,9 +62,9 @@
LOG.log(Level.FINE, "detachAndAttachUptimePeriodically(): round " + i);
final String id;
{
- AsadminResult result = ASADMIN.execDetached("--terse", "uptime");
+ DetachedTerseAsadminResult result = ASADMIN.execDetached("uptime");
assertThat(result, asadminOK());
- id = parseJobIdFromEchoTerse(result.getStdOut());
+ id = result.getJobId();
assertTrue(ids.add(id));
}
Thread.sleep(1000L);
@@ -79,47 +79,36 @@
@Test
public void commandWithProgressStatus() throws Exception {
- AsadminResult result = ASADMIN.execDetached("--terse", "progress-custom", "6x1");
- assertThat(result, asadminOK());
- String id = parseJobIdFromEchoTerse(result.getStdOut());
+ final DetachedTerseAsadminResult detached = ASADMIN.execDetached("progress-custom", "6x1");
+ assertThat(detached, asadminOK());
Thread.sleep(2000L);
- // Now attach running
- result = ASADMIN.exec("attach", id);
- assertThat(result, asadminOK());
- assertThat(result.getStdOut(), stringContainsInOrder("progress-custom"));
- List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
+ final AsadminResult attachResult = ASADMIN.exec("attach", detached.getJobId());
+ assertThat(attachResult, asadminOK());
+ assertThat(attachResult.getStdOut(), stringContainsInOrder("progress-custom"));
+ List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(attachResult.getStdOut());
assertFalse(prgs.isEmpty());
assertThat(prgs.get(0).getValue(), greaterThan(0));
assertEquals(100, prgs.get(prgs.size() - 1).getValue());
// Now attach finished - must NOT exist - seen progress job is removed
- assertThat(ASADMIN.exec("attach", id), not(asadminOK()));
+ assertThat(ASADMIN.exec("attach", detached.getJobId()), not(asadminOK()));
}
@Test
public void detachOnesAttachMulti() throws Exception {
- ExecutorService pool = Executors.newCachedThreadPool(new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- Thread result = new Thread(r);
- result.setDaemon(true);
- return result;
- }
+ ExecutorService pool = Executors.newCachedThreadPool(r -> {
+ Thread result = new Thread(r);
+ result.setDaemon(true);
+ return result;
});
- AsadminResult result = ASADMIN.execDetached("--terse", "progress-custom", "8x1");
+ final DetachedTerseAsadminResult result = ASADMIN.execDetached("progress-custom", "8x1");
assertThat(result, asadminOK());
- final String id = parseJobIdFromEchoTerse(result.getStdOut());
- assertNotNull(id, "id");
+ assertNotNull(result.getJobId(), "id");
Thread.sleep(1500L);
final int attachCount = 3;
Collection<Callable<AsadminResult>> attaches = new ArrayList<>(attachCount);
for (int i = 0; i < attachCount; i++) {
- attaches.add(new Callable<AsadminResult>() {
- @Override
- public AsadminResult call() throws Exception {
- return ASADMIN.exec("attach", id);
- }
- });
+ attaches.add(() -> ASADMIN.exec("attach", result.getJobId()));
}
List<Future<AsadminResult>> results = pool.invokeAll(attaches);
for (Future<AsadminResult> fRes : results) {
@@ -132,10 +121,4 @@
assertEquals(100, prgs.get(prgs.size() - 1).getValue());
}
}
-
- private String parseJobIdFromEchoTerse(String str) {
- List<Object> stok = Collections.list(new StringTokenizer(str));
- assertThat(stok, hasSize(1));
- return (String) stok.get(0);
- }
}
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/JobManagerITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/JobManagerITest.java
index 40ba44a..8e6bfc4 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/JobManagerITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/JobManagerITest.java
@@ -19,19 +19,17 @@
import org.glassfish.main.admin.test.tool.asadmin.Asadmin;
import org.glassfish.main.admin.test.tool.asadmin.AsadminResult;
-import org.junit.jupiter.api.BeforeEach;
+import org.glassfish.main.admin.test.tool.asadmin.DetachedTerseAsadminResult;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
-
-import static org.glassfish.main.admin.test.tool.AsadminResultMatcher.asadminOK;
-import static org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment.deleteJobsFile;
-import static org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment.deleteOsgiDirectory;
-import static org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment.getAsadmin;
-
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import static org.glassfish.main.admin.test.tool.AsadminResultMatcher.asadminOK;
+import static org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment.getAsadmin;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.matchesPattern;
import static org.hamcrest.Matchers.stringContainsInOrder;
/**
@@ -40,19 +38,13 @@
* @author Bhakti Mehta
* @author David Matejcek
*/
+@ExtendWith(JobTestExtension.class)
@TestMethodOrder(OrderAnnotation.class)
public class JobManagerITest {
private static final String COMMAND_PROGRESS_SIMPLE = "progress-simple";
private static final Asadmin ASADMIN = getAsadmin();
- @BeforeEach
- public void setUp() throws Exception {
- assertThat(ASADMIN.exec("stop-domain"), asadminOK());
- deleteJobsFile();
- deleteOsgiDirectory();
- assertThat(ASADMIN.exec("start-domain"), asadminOK());
- }
@Test
@Order(1)
@@ -66,46 +58,37 @@
@Test
@Order(2)
public void jobSurvivesRestart() throws Exception {
- assertThat(ASADMIN.exec("--terse", "progress-simple"), asadminOK());
- assertThat(ASADMIN.exec("list-jobs").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
- assertThat(ASADMIN.exec("list-jobs", "1").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
-
+ assertThat(ASADMIN.exec(COMMAND_PROGRESS_SIMPLE), asadminOK());
assertThat(ASADMIN.exec("stop-domain"), asadminOK());
assertThat(ASADMIN.exec("start-domain"), asadminOK());
- AsadminResult result = ASADMIN.exec("list-jobs", "1");
- assertThat(result, asadminOK());
- assertThat(result.getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
+ assertThat(ASADMIN.exec("list-jobs").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
}
@Test
@Order(3)
public void detachAndAttach() throws Exception {
- assertThat(ASADMIN.execDetached(COMMAND_PROGRESS_SIMPLE).getStdOut(), stringContainsInOrder("Job ID: "));
- assertThat(ASADMIN.exec("list-jobs", "1").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
- assertThat(ASADMIN.exec("attach", "1"), asadminOK());
+ DetachedTerseAsadminResult detached = ASADMIN.execDetached(COMMAND_PROGRESS_SIMPLE);
+ assertThat(detached.getJobId(), matchesPattern("[1-9][0-9]*"));
+ assertThat(ASADMIN.exec("list-jobs", detached.getJobId()).getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
+ assertThat(ASADMIN.exec("attach", detached.getJobId()), asadminOK());
// list-jobs and it should be purged since the user
// starting is the same as the user who attached to it
- assertThat(ASADMIN.exec("list-jobs").getOutput(), stringContainsInOrder("Nothing to list"));
+ assertThat(ASADMIN.exec("list-jobs", detached.getJobId()).getOutput(), stringContainsInOrder("Nothing to list"));
}
@Test
@Order(4)
- public void runConfigureManagedJobsTest() throws Exception {
- assertThat(ASADMIN.exec("configure-managed-jobs", "--job-retention-period=60s", "--cleanup-initial-delay=1s", "--cleanup-poll-interval=1s"), asadminOK());
+ public void runSynchronously() throws Exception {
assertThat(ASADMIN.exec(COMMAND_PROGRESS_SIMPLE), asadminOK());
- assertThat(ASADMIN.exec("list-jobs", "1").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
+ assertThat(ASADMIN.exec("list-jobs").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
- // FIXME: Random race condition on Linux caused by some bug in restart-domain; 4848 port is then blocked for start-domain in setUp();
- assertThat(ASADMIN.exec("stop-domain"), asadminOK());
- assertThat(ASADMIN.exec("start-domain"), asadminOK());
- assertThat(ASADMIN.exec("list-jobs", "1").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
-
- assertThat(ASADMIN.exec("configure-managed-jobs", "--job-retention-period=1s", "--cleanup-initial-delay=1s", "--cleanup-poll-interval=1s"), asadminOK());
- Thread.sleep(2100L);
- assertThat(ASADMIN.exec("list-jobs").getOutput(), stringContainsInOrder("Nothing to list"));
- assertThat(ASADMIN.exec("configure-managed-jobs", "--job-retention-period=1h", "--cleanup-initial-delay=5m", "--cleanup-poll-interval=20m"), asadminOK());
+ assertThat(ASADMIN.exec("configure-managed-jobs", "--job-retention-period=1s", "--cleanup-initial-delay=1s",
+ "--cleanup-poll-interval=1s"), asadminOK());
+ Thread.sleep(1100L);
+ assertThat("Completed jobs should be removed", ASADMIN.exec("list-jobs").getOutput(),
+ stringContainsInOrder("Nothing to list"));
}
}
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/JobTestExtension.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/JobTestExtension.java
new file mode 100644
index 0000000..b052df2
--- /dev/null
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/JobTestExtension.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2022 Eclipse Foundation and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.main.admin.test.progress;
+
+import org.glassfish.main.admin.test.tool.asadmin.Asadmin;
+import org.glassfish.main.admin.test.tool.asadmin.AsadminResult;
+import org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment;
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
+import org.junit.jupiter.api.extension.ExtensionContext.Store;
+
+import static java.util.function.Function.identity;
+import static org.glassfish.main.admin.test.tool.AsadminResultMatcher.asadminOK;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.stringContainsInOrder;
+import static org.junit.jupiter.api.Assertions.fail;
+
+
+/**
+ * @author David Matejcek
+ */
+public class JobTestExtension implements BeforeAllCallback, AfterAllCallback {
+
+ private static final String ORIG_POLL_INTERVAL = "origPollInterval";
+ private static final String ORIG_INITIAL_DELAY = "origInitialDelay";
+ private static final String ORIG_RETENTION_PERIOD = "origRetentionPeriod";
+
+ private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
+ @Override
+ public void beforeAll(ExtensionContext context) throws Exception {
+ Namespace namespaceClass = Namespace.create(context.getRequiredTestClass());
+ Store store = context.getStore(namespaceClass);
+ store.put(ORIG_RETENTION_PERIOD, ASADMIN.getValue("managed-job-config.job-retention-period", identity()).getValue());
+ store.put(ORIG_INITIAL_DELAY, ASADMIN.getValue("managed-job-config.initial-delay", identity()).getValue());
+ store.put(ORIG_POLL_INTERVAL, ASADMIN.getValue("managed-job-config.poll-interval", identity()).getValue());
+ }
+
+ @Override
+ public void afterAll(ExtensionContext context) throws Exception {
+ waitForCompletition();
+
+ // minimal possible values.
+ assertThat(ASADMIN.exec("configure-managed-jobs",
+ "--job-retention-period=1s",
+ "--cleanup-initial-delay=1s",
+ "--cleanup-poll-interval=1s"), asadminOK());
+
+ Thread.sleep(1100L);
+ // cleanup should be finished.
+ AsadminResult result = ASADMIN.exec("list-jobs");
+ assertThat(result.getOutput(), stringContainsInOrder("Nothing to list"));
+
+ Namespace namespaceClass = Namespace.create(context.getRequiredTestClass());
+ Store store = context.getStore(namespaceClass);
+ // reset original configuration
+ assertThat(ASADMIN.exec("configure-managed-jobs",
+ "--job-retention-period=" + store.get(ORIG_RETENTION_PERIOD),
+ "--cleanup-initial-delay=" + store.get(ORIG_INITIAL_DELAY),
+ "--cleanup-poll-interval=" + store.get(ORIG_POLL_INTERVAL)), asadminOK());
+ }
+
+
+ private void waitForCompletition() throws Exception {
+ final long start = System.currentTimeMillis();
+ while (true) {
+ AsadminResult result = ASADMIN.exec("list-jobs");
+ assertThat(result, asadminOK());
+ if (!result.getStdOut().contains("RUNNING")) {
+ return;
+ }
+ if (System.currentTimeMillis() > start + 10000L) {
+ fail("Timed out waiting for completition of all jobs.");
+ }
+ Thread.sleep(500);
+ }
+ }
+
+
+}
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusBasicITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusBasicITest.java
index 6ba8b05..0902128 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusBasicITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusBasicITest.java
@@ -23,6 +23,7 @@
import org.glassfish.main.admin.test.tool.asadmin.AsadminResult;
import org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import static org.glassfish.main.admin.test.progress.ProgressMessage.isIncreasing;
import static org.glassfish.main.admin.test.tool.AsadminResultMatcher.asadminOK;
@@ -35,10 +36,12 @@
/**
* @author martinmares
*/
+@ExtendWith(JobTestExtension.class)
public class ProgressStatusBasicITest {
private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
@Test
public void simple() {
AsadminResult result = ASADMIN.exec("progress-simple");
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusComplexITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusComplexITest.java
index 3b7ae11..ed060e7 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusComplexITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusComplexITest.java
@@ -23,6 +23,7 @@
import org.glassfish.main.admin.test.tool.asadmin.AsadminResult;
import org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import static org.glassfish.main.admin.test.progress.ProgressMessage.grepProgressMessages;
import static org.glassfish.main.admin.test.progress.ProgressMessage.isIncreasing;
@@ -41,13 +42,15 @@
/**
* @author martinmares
*/
+@ExtendWith(JobTestExtension.class)
public class ProgressStatusComplexITest {
private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
@Test
public void executeCommandFromCommand() {
- AsadminResult result = ASADMIN.exec(30_000, false, "progress-exec-other");
+ AsadminResult result = ASADMIN.exec(30_000, "progress-exec-other");
assertThat(result, asadminOK());
assertArrayEquals(new String[] {
"Starting", "Preparing", "Parsing", "Working on main part",
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusFailITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusFailITest.java
index 0ed4266..b6ad40c 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusFailITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusFailITest.java
@@ -23,6 +23,7 @@
import org.glassfish.main.admin.test.tool.asadmin.AsadminResult;
import org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import static org.glassfish.main.admin.test.tool.AsadminResultMatcher.asadminOK;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -33,6 +34,7 @@
/**
* @author martinmares
*/
+@ExtendWith(JobTestExtension.class)
public class ProgressStatusFailITest {
private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
@@ -41,14 +43,14 @@
public void failDuringExecution() {
AsadminResult result = ASADMIN.exec("progress-fail-in-half");
assertThat(result, not(asadminOK()));
- List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
- assertFalse(prgs.isEmpty());
- assertEquals(50, prgs.get(prgs.size() - 1).getValue());
+ List<ProgressMessage> messages = ProgressMessage.grepProgressMessages(result.getStdOut());
+ assertFalse(messages.isEmpty());
+ assertEquals(50, messages.get(messages.size() - 1).getValue());
}
@Test
public void timeout() {
- AsadminResult result = ASADMIN.exec(6_000, false, "progress-custom", "3x1", "1x8", "2x1");
+ AsadminResult result = ASADMIN.exec(6_000, "progress-custom", "3x1", "1x8", "2x1");
assertThat(result, not(asadminOK()));
List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
assertFalse(prgs.isEmpty());
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusSpecialITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusSpecialITest.java
index e5a8bef..576e949 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusSpecialITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/progress/ProgressStatusSpecialITest.java
@@ -24,6 +24,7 @@
import org.glassfish.main.admin.test.tool.asadmin.AsadminResult;
import org.glassfish.main.admin.test.tool.asadmin.GlassFishTestEnvironment;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import static org.glassfish.main.admin.test.progress.ProgressMessage.isIncreasing;
import static org.glassfish.main.admin.test.tool.AsadminResultMatcher.asadminOK;
@@ -36,10 +37,12 @@
/**
* @author martinmares
*/
+@ExtendWith(JobTestExtension.class)
public class ProgressStatusSpecialITest {
private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
@Test
public void stepBackCommand() {
AsadminResult result = ASADMIN.exec("progress-step-back");
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/rest/JobsResourceITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/rest/JobsResourceITest.java
index b20bb43..cd7c57c 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/rest/JobsResourceITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/rest/JobsResourceITest.java
@@ -80,11 +80,11 @@
JSONObject json = response.readEntity(JSONObject.class);
JSONArray resources = json.getJSONArray("resources");
assertNotNull(resources);
- assertThat(resources.length(), equalTo(1));
+ assertThat(resources.toString(), resources.length(), equalTo(1));
JSONArray items = json.getJSONArray("items");
assertNotNull(items);
- assertThat(items.length(), equalTo(1));
+ assertThat(items.toString(), items.length(), equalTo(1));
// unlike most resources that also return a parent link,
// the jobs resource only returns child links.
@@ -112,7 +112,7 @@
resources = json.getJSONArray("resources");
assertNotNull(resources);
- assertThat(resources.length(), equalTo(1));
+ assertThat(resources.toString(), resources.length(), equalTo(1));
resource = resources.getJSONObject(0);
assertEquals("parent", resource.getString("rel"));
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/Asadmin.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/Asadmin.java
index e40e999..b18ca6d 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/Asadmin.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/Asadmin.java
@@ -22,11 +22,17 @@
import java.io.File;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
+import java.util.stream.Collectors;
import static java.util.Arrays.asList;
+import static org.glassfish.main.admin.test.tool.AsadminResultMatcher.asadminOK;
+import static org.hamcrest.MatcherAssert.assertThat;
/**
* Tool for executing asadmin/asadmin.bat commands.
@@ -37,7 +43,14 @@
public class Asadmin {
private static final Logger LOG = Logger.getLogger(Asadmin.class.getName());
- private static final int DEFAULT_TIMEOUT_MSEC = 10 * 1000;
+ private static final int DEFAULT_TIMEOUT_MSEC = 30 * 1000;
+ private static final Function<String, KeyAndValue<String>> KEYVAL_SPLITTER = s -> {
+ int equalSignPos = s.indexOf('=');
+ if (equalSignPos <= 0 || equalSignPos == s.length() - 1) {
+ return null;
+ }
+ return new KeyAndValue<>(s.substring(0, equalSignPos), s.substring(equalSignPos + 1, s.length()));
+ };
private final File asadmin;
private final String adminUser;
@@ -66,6 +79,27 @@
}
+ public <T> KeyAndValue<T> getValue(final String key, final Function<String, T> transformer) {
+ List<KeyAndValue<T>> result = get(key, transformer);
+ if (result.isEmpty()) {
+ return null;
+ }
+ if (result.size() > 1) {
+ throw new IllegalArgumentException("The key is not concrete enough to get a single value: " + key);
+ }
+ return result.get(0);
+ }
+
+
+ public <T> List<KeyAndValue<T>> get(final String key, final Function<String, T> transformer) {
+ AsadminResult result = exec("get", key);
+ assertThat(result, asadminOK());
+ return Arrays.stream(result.getStdOut().split(System.lineSeparator())).map(KEYVAL_SPLITTER)
+ .filter(Objects::nonNull).map(kv -> new KeyAndValue<>(kv.getKey(), transformer.apply(kv.getValue())))
+ .collect(Collectors.toList());
+ }
+
+
/**
* Executes the command with arguments asynchronously with {@value #DEFAULT_TIMEOUT_MSEC} ms timeout.
* The command can be attached by the attach command.
@@ -74,8 +108,8 @@
* @param args
* @return {@link AsadminResult} never null.
*/
- public AsadminResult execDetached(final String... args) {
- return exec(DEFAULT_TIMEOUT_MSEC, true, args);
+ public DetachedTerseAsadminResult execDetached(final String... args) {
+ return (DetachedTerseAsadminResult) exec(DEFAULT_TIMEOUT_MSEC, true, args);
}
/**
@@ -87,40 +121,51 @@
public AsadminResult exec(final String... args) {
return exec(DEFAULT_TIMEOUT_MSEC, false, args);
}
-
+ /**
+ * Executes the command with arguments synchronously with given timeout in millis.
+ *
+ * @param timeout
+ * @param args
+ * @return {@link AsadminResult} never null.
+ */
+ public AsadminResult exec(final int timeout, final String... args) {
+ return exec(timeout, false, args);
+ }
/**
* Executes the command with arguments.
*
* @param timeout timeout in millis
- * @param detached - detached command is executed asynchronously, can be attached later by the attach command.
+ * @param detachedAndTerse - detached command is executed asynchronously, can be attached later by the attach command.
* @param args - command and arguments.
* @return {@link AsadminResult} never null.
*/
- public AsadminResult exec(final int timeout, final boolean detached, final String... args) {
+ private AsadminResult exec(final int timeout, final boolean detachedAndTerse, final String... args) {
final List<String> parameters = asList(args);
- LOG.log(Level.INFO, "exec(timeout={0}, detached={1}, args={2})", new Object[] {timeout, detached, parameters});
+ LOG.log(Level.INFO, "exec(timeout={0}, detached={1}, args={2})",
+ new Object[] {timeout, detachedAndTerse, parameters});
final List<String> command = new ArrayList<>();
command.add(asadmin.getAbsolutePath());
command.add("--user");
command.add(adminUser);
command.add("--passwordfile");
command.add(adminPasswordFile.getAbsolutePath());
- if (detached) {
+ if (detachedAndTerse) {
+ command.add("--terse");
command.add("--detach");
}
command.addAll(parameters);
- final ProcessManager pm = new ProcessManager(command);
- pm.setTimeoutMsec(timeout);
- pm.setEcho(false);
+ final ProcessManager processManager = new ProcessManager(command);
+ processManager.setTimeoutMsec(timeout);
+ processManager.setEcho(false);
int exitCode;
String asadminErrorMessage = "";
try {
- exitCode = pm.execute();
+ exitCode = processManager.execute();
} catch (final ProcessManagerTimeoutException e) {
- asadminErrorMessage = "ProcessManagerTimeoutException: command timed stdOut after " + timeout + " ms.\n";
+ asadminErrorMessage = "ProcessManagerTimeoutException: command timed out after " + timeout + " ms.\n";
exitCode = 1;
} catch (final ProcessManagerException e) {
LOG.log(Level.SEVERE, "The execution failed.", e);
@@ -128,16 +173,14 @@
exitCode = 1;
}
- final String stdErr = pm.getStderr() + '\n' + asadminErrorMessage;
- final AsadminResult ret = new AsadminResult(args[0], exitCode, pm.getStdout(), stdErr);
- writeToStdOut(ret.getOutput());
- return ret;
- }
-
-
- private static void writeToStdOut(final String text) {
- if (!text.isEmpty()) {
- System.out.print(text);
+ final String stdErr = processManager.getStderr() + '\n' + asadminErrorMessage;
+ final AsadminResult result;
+ if (detachedAndTerse) {
+ result = new DetachedTerseAsadminResult(args[0], exitCode, processManager.getStdout(), stdErr);
+ } else {
+ result = new AsadminResult(args[0], exitCode, processManager.getStdout(), stdErr);
}
+ System.out.print(result.getStdOut());
+ return result;
}
}
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/AsadminResult.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/AsadminResult.java
index e11433b..e7e09a0 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/AsadminResult.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/AsadminResult.java
@@ -31,13 +31,13 @@
/**
* Creates a value object instance.
*
- * @param cmd - command name
+ * @param commandName
* @param exitCode
* @param stdOut
* @param stdErr
*/
- public AsadminResult(final String cmd, final int exitCode, final String stdOut, final String stdErr) {
- this.error = exitCode != 0 || containsError(stdOut, String.format("Command %s failed.", cmd));
+ public AsadminResult(final String commandName, final int exitCode, final String stdOut, final String stdErr) {
+ this.error = exitCode != 0 || containsError(stdOut, String.format("Command %s failed.", commandName));
this.stdOut = stdOut;
this.stdErr = stdErr;
this.output = this.stdOut + this.stdErr;
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/DetachedTerseAsadminResult.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/DetachedTerseAsadminResult.java
new file mode 100644
index 0000000..3f3daf1
--- /dev/null
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/DetachedTerseAsadminResult.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 Eclipse Foundation and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.main.admin.test.tool.asadmin;
+
+import java.util.Arrays;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.arrayWithSize;
+
+/**
+ * @author David Matejcek
+ */
+public class DetachedTerseAsadminResult extends AsadminResult {
+
+ private final String jobId;
+
+ public DetachedTerseAsadminResult(String commandName, int exitCode, String stdOut, String stdErr) {
+ super(commandName, exitCode, stdOut, stdErr);
+ this.jobId = parseJobId(stdOut);
+ }
+
+
+ public String getJobId() {
+ return jobId;
+ }
+
+
+ private static String parseJobId(String stdOut) {
+ String[] lines = stdOut.split(System.lineSeparator());
+ assertThat(Arrays.toString(lines), lines, arrayWithSize(1));
+ return Integer.valueOf(lines[0]).toString();
+ }
+}
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/GlassFishTestEnvironment.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/GlassFishTestEnvironment.java
index b41b7b3..33aa6c1 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/GlassFishTestEnvironment.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/GlassFishTestEnvironment.java
@@ -28,7 +28,6 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Comparator;
import java.util.HashMap;
import java.util.Locale;
import java.util.logging.Level;
@@ -66,10 +65,10 @@
LOG.log(Level.INFO, "Expected GlassFish directory: {0}", GF_ROOT);
changePassword();
Thread hook = new Thread(() -> {
- getAsadmin().exec(10_000, false, "stop-domain", "--kill", "--force");
+ getAsadmin().exec(10_000, "stop-domain", "--kill", "--force");
});
Runtime.getRuntime().addShutdownHook(hook);
- assertThat(getAsadmin().exec(30_000, false, "start-domain"), AsadminResultMatcher.asadminOK());
+ assertThat(getAsadmin().exec(30_000, "start-domain"), AsadminResultMatcher.asadminOK());
}
/**
@@ -130,28 +129,6 @@
/**
- * osgi-cache workaround
- */
- public static void deleteOsgiDirectory() {
- Path osgiCacheDir = GF_ROOT.toPath().resolve(Paths.get("domains", "domain1", "osgi-cache"));
- try {
- Files.list(osgiCacheDir).forEach(GlassFishTestEnvironment::deleteSubpaths);
- } catch (IOException e) {
- throw new IllegalStateException(e);
- }
- }
-
-
- public static void deleteSubpaths(final Path path) {
- try {
- Files.walk(path).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
- } catch (Exception e) {
- throw new IllegalStateException("Cannot delete path recursively: " + path, e);
- }
- }
-
-
- /**
* Useful for a heuristic inside Eclipse and other environments.
*
* @return Absolute path to the glassfish directory.
@@ -203,7 +180,7 @@
private static void changePassword() {
final Asadmin asadmin = new Asadmin(ASADMIN, ADMIN_USER, PASSWORD_FILE_FOR_UPDATE);
- final AsadminResult result = asadmin.exec(5_000, false, "change-admin-password");
+ final AsadminResult result = asadmin.exec(5_000, "change-admin-password");
if (result.isError()) {
// probably changed by previous execution without maven clean
System.out.println("Admin password NOT changed.");
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/KeyAndValue.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/KeyAndValue.java
new file mode 100644
index 0000000..a5ee39c
--- /dev/null
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/main/admin/test/tool/asadmin/KeyAndValue.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2022 Eclipse Foundation and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.main.admin.test.tool.asadmin;
+
+import java.util.Comparator;
+import java.util.Objects;
+
+import static java.util.Comparator.comparing;
+
+/**
+ * @param <T> value type
+ *
+ * @author David Matejcek
+ */
+public class KeyAndValue<T> implements Comparable<KeyAndValue<?>> {
+
+
+ // note: toString should be fast.
+ private static final Comparator<Object> NULL_SAFE_COMPARATOR = comparing(o -> o == null ? "" : o.toString(),
+ String::compareTo);
+
+ private final String key;
+ private final T value;
+
+ public KeyAndValue(final String key, final T value) {
+ this.key = key;
+ this.value = value;
+ }
+
+
+ public String getKey() {
+ return key;
+ }
+
+
+ public T getValue() {
+ return value;
+ }
+
+
+ @Override
+ public String toString() {
+ return getKey() + '=' + getValue();
+ }
+
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof KeyAndValue<?>) {
+ KeyAndValue<?> another = (KeyAndValue<?>) object;
+ return Objects.equals(key, another.key) && Objects.equals(value, another.value);
+ }
+ return false;
+ }
+
+
+ @Override
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+
+ @Override
+ public int compareTo(KeyAndValue<?> o) {
+ int keysComparisonResult = key.compareTo(o.key);
+ if (keysComparisonResult != 0) {
+ return keysComparisonResult;
+ }
+ return Objects.compare(value, o.value, NULL_SAFE_COMPARATOR);
+ }
+}