diff --git a/data/api/http-api.xml b/data/api/http-api.xml
index 8f005f524b..cc793fbe37 100644
--- a/data/api/http-api.xml
+++ b/data/api/http-api.xml
@@ -1,7 +1,7 @@
-
+
{ "schemaName": "lists",
"queryName": "Test List",
"command": "insert",
@@ -31,7 +31,7 @@
-
+
-
+
{ "schemaName": "lists",
"queryName": "Test List",
"command": "insert",
@@ -225,7 +225,7 @@
-
+
-
+
{ "schemaName": "lists",
"queryName": "Test List",
"command": "insert",
@@ -402,7 +402,7 @@
-
+
-
+
{ "schemaName": "lists",
"queryName": "Test List",
"command": "delete",
@@ -568,7 +568,7 @@
-
+
-
+
{
"schemaName": "lists",
"queryName": "Test List",
@@ -704,7 +704,7 @@
"value" : "2000-04-01 00:00:00.000"
},
"Like" : {
- "url" : "/labkey/HTTPApiVerifyProject/list-details.view?name=Test%20List&pk=Gray",
+ "url" : "%contextPath%/HTTPApiVerifyProject/list-details.view?name=Test%20List&pk=Gray",
"value" : "Black"
},
"Color" : {
@@ -716,7 +716,7 @@
},
"links" : {
"edit" : {
- "href" : "/labkey/HTTPApiVerifyProject/query-updateQueryRow.view?schemaName=lists&query.queryName=Test%20List&Color=Gray",
+ "href" : "%contextPath%/HTTPApiVerifyProject/query-updateQueryRow.view?schemaName=lists&query.queryName=Test%20List&Color=Gray",
"title" : "edit"
}
}
@@ -727,7 +727,7 @@
-
+
{
"schemaName": "lists",
"queryName": "Test List",
@@ -753,7 +753,7 @@
},
"links" : {
"edit" : {
- "href" : "/labkey/HTTPApiVerifyProject/query-updateQueryRow.view?schemaName=lists&query.queryName=Test%20List&Color=Gray",
+ "href" : "%contextPath%/HTTPApiVerifyProject/query-updateQueryRow.view?schemaName=lists&query.queryName=Test%20List&Color=Gray",
"title" : "edit"
}
}
diff --git a/data/api/security-api.xml b/data/api/security-api.xml
index 0cc3686c8c..02c06bd77f 100644
--- a/data/api/security-api.xml
+++ b/data/api/security-api.xml
@@ -1,7 +1,7 @@
- security/Security%20API%20Test%20Project/getGroupPerms.view?
+ Security%20API%20Test%20Project/security-getGroupPerms.view?
{"container":
{
@@ -135,7 +135,7 @@
- security/Security%20Api%20Test%20Project/getGroupsForCurrentUser.view?
+ Security%20Api%20Test%20Project/security-getGroupsForCurrentUser.view?
{"groups": [
{
@@ -162,7 +162,7 @@
- security/Security%20Api%20Test%20Project/ensureLogin.view?
+ Security%20Api%20Test%20Project/security-ensureLogin.view?
{"currentUser":
{
diff --git a/data/api/study-api.xml b/data/api/study-api.xml
index d71ffc5335..87269cb02c 100644
--- a/data/api/study-api.xml
+++ b/data/api/study-api.xml
@@ -123,7 +123,7 @@
label: 'Non Controller',
}
- participant-group/StudyVerifyProject/My%20Study/deleteParticipantCategory.view?
+ StudyVerifyProject/My%20Study/participant-group-deleteParticipantCategory.view?
{"success": true}
diff --git a/data/api/timechart-api.xml b/data/api/timechart-api.xml
index 9f062ab574..6c6762b828 100644
--- a/data/api/timechart-api.xml
+++ b/data/api/timechart-api.xml
@@ -1,6 +1,6 @@
- visualization/TimeChartTest%20Project%E2%98%83~%21%40%24%26%28%29_%2B%7B%7D-%3D%5B%5D%2C.%23%C3%A4%C3%B6%C3%BC%C3%85/Demo%20Study/getVisualizationTypes.view?
+ TimeChartTest%20Project%E2%98%83~%21%40%24%26%28%29_%2B%7B%7D-%3D%5B%5D%2C.%23%C3%A4%C3%B6%C3%BC%C3%85/Demo%20Study/visualization-getVisualizationTypes.view?
{
"types": [
{
@@ -34,7 +34,7 @@
}
- visualization/TimeChartTest%20Project%E2%98%83~%21%40%24%26%28%29_%2B%7B%7D-%3D%5B%5D%2C.%23%C3%A4%C3%B6%C3%BC%C3%85/Demo%20Visit%20Study/getVisualizationTypes.view?
+ TimeChartTest%20Project%E2%98%83~%21%40%24%26%28%29_%2B%7B%7D-%3D%5B%5D%2C.%23%C3%A4%C3%B6%C3%BC%C3%85/Demo%20Visit%20Study/visualization-getVisualizationTypes.view?
{
"types": [
{
diff --git a/src/org/labkey/test/Runner.java b/src/org/labkey/test/Runner.java
index d28b7dc918..a819628849 100644
--- a/src/org/labkey/test/Runner.java
+++ b/src/org/labkey/test/Runner.java
@@ -31,6 +31,10 @@
import org.apache.commons.lang3.mutable.MutableBoolean;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.commons.lang3.time.FastDateFormat;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.protocol.HttpContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
@@ -39,9 +43,6 @@
import org.junit.runner.manipulation.Filter;
import org.junit.runner.manipulation.Filterable;
import org.junit.runner.manipulation.NoTestsRemainException;
-import org.junit.runner.manipulation.Orderable;
-import org.junit.runner.manipulation.Sortable;
-import org.junit.runner.manipulation.Sorter;
import org.labkey.junit.runner.WebTestProperties;
import org.labkey.serverapi.reader.Readers;
import org.labkey.serverapi.writer.PrintWriters;
@@ -56,9 +57,9 @@
import org.labkey.test.util.ExportDiagnosticsPseudoTest;
import org.labkey.test.util.NonWindowsTest;
import org.labkey.test.util.PostgresOnlyTest;
-import org.labkey.test.util.Order;
import org.labkey.test.util.SqlserverOnlyTest;
import org.labkey.test.util.TestLogger;
+import org.labkey.test.util.Timer;
import org.labkey.test.util.WindowsOnlyTest;
import java.io.BufferedReader;
@@ -404,8 +405,10 @@ private static TestSuite getSuite(List> testClasses, boolean cleanOnly)
return suite;
}
- private static void addTests(TestSuite suite, Set> testClasses)
+ private static void addTests(TestSuite suite, Set> testClasses) throws IOException
{
+ waitForTomcat();
+
boolean foundServerSideTest = false;
for (Class> testClass : testClasses)
{
@@ -556,6 +559,7 @@ else if (specifiedSuite.startsWith("?") && specifiedSuite.length() > 1)
}
// for error reporting
+ @SuppressWarnings("JUnitMalformedDeclaration")
public static class ErrorTest extends TestCase
{
Throwable t;
@@ -1113,6 +1117,36 @@ private static Class> getTestClass(Test test)
else
return test.getClass();
}
+
+ private static void waitForTomcat() throws IOException
+ {
+ Duration timeout = Duration.ofSeconds(TestProperties.getServerStartupTimeout());
+ LOG.info("Waiting for server to respond");
+ Timer timer = new Timer(timeout);
+ HttpContext context = WebTestHelper.getBasicHttpContext();
+ do {
+ try (CloseableHttpClient client = WebTestHelper.getHttpClient())
+ {
+ HttpGet method = new HttpGet(WebTestHelper.getBaseURL());
+ client.execute(method, context, response -> {
+ EntityUtils.consumeQuietly(response.getEntity());
+ return response.getCode();
+ });
+ // Any response is ok.
+ LOG.info("Server started after: " + formatDuration(timer.elapsed().toMillis()));
+ return;
+ }
+ catch (IOException e)
+ {
+ if (timer.isTimedOut())
+ {
+ LOG.info("Server failed to start after: " + formatDuration(timeout.toMillis()));
+ throw e;
+ }
+ WebDriverWrapper.sleep(1000);
+ }
+ } while(true);
+ }
}
class BatchInfo
diff --git a/src/org/labkey/test/TestProperties.java b/src/org/labkey/test/TestProperties.java
index 5c15d264cb..23d9c63740 100644
--- a/src/org/labkey/test/TestProperties.java
+++ b/src/org/labkey/test/TestProperties.java
@@ -284,7 +284,7 @@ public static int getServerStartupTimeout()
}
catch (NumberFormatException nfe)
{
- return 60;
+ return 120;
}
}
diff --git a/src/org/labkey/test/WebTestHelper.java b/src/org/labkey/test/WebTestHelper.java
index 64ba4aa2f5..af89898ac4 100644
--- a/src/org/labkey/test/WebTestHelper.java
+++ b/src/org/labkey/test/WebTestHelper.java
@@ -108,6 +108,8 @@ public class WebTestHelper
private static final Map> savedCookies = new HashMap<>();
private static final Map savedSessionKeys = new HashMap<>();
+ static { TestProperties.load(); }
+
public static void setUseContainerRelativeUrl(boolean useContainerRelativeUrl)
{
USE_CONTAINER_RELATIVE_URL = useContainerRelativeUrl;
@@ -226,7 +228,7 @@ public static Integer getWebPort()
if (_webPort == null)
{
String webPortStr = System.getProperty("labkey.port");
- if (webPortStr == null || webPortStr.trim().length() == 0)
+ if (webPortStr == null || StringUtils.isBlank(webPortStr))
{
LOG.info("Using default labkey port (" + DEFAULT_WEB_PORT +
").\nThis can be changed by setting the property 'labkey.port=[yourport]'.");
@@ -246,10 +248,10 @@ public static String getTargetServer()
{
synchronized (SERVER_LOCK)
{
- if (_targetServer == null || !_targetServer.equals(System.getProperty("labkey.server")))
+ if (_targetServer == null)
{
_targetServer = System.getProperty("labkey.server");
- if (_targetServer == null || _targetServer.length() == 0)
+ if (_targetServer == null || _targetServer.isEmpty())
{
LOG.info("Using default target server (" + DEFAULT_TARGET_SERVER +
").\nThis can be changed by setting the property 'labkey.server=[yourserver]'.");
@@ -537,7 +539,7 @@ public static void logToServer(@NotNull String message, Connection connection)
String [] splitMessage = message.split("\n");
for (String thisMessage: splitMessage)
{
- if (thisMessage.length() > 0)
+ if (!thisMessage.isEmpty())
logToServer(thisMessage, connection);
}
return;
diff --git a/src/org/labkey/test/tests/JUnitTest.java b/src/org/labkey/test/tests/JUnitTest.java
index 1cc391cbd4..03e14314c5 100644
--- a/src/org/labkey/test/tests/JUnitTest.java
+++ b/src/org/labkey/test/tests/JUnitTest.java
@@ -354,6 +354,7 @@ else if (responseBody.contains("Upgrade Status") ||
}
}
+ @SuppressWarnings("JUnitMalformedDeclaration")
public static class RemoteTest extends TestCase
{
String _remoteClass;
diff --git a/src/org/labkey/test/tests/core/security/GetReadableContainersAPITest.java b/src/org/labkey/test/tests/core/security/GetReadableContainersAPITest.java
index c3ebebd47b..59018784dc 100644
--- a/src/org/labkey/test/tests/core/security/GetReadableContainersAPITest.java
+++ b/src/org/labkey/test/tests/core/security/GetReadableContainersAPITest.java
@@ -23,7 +23,7 @@
@Category({Daily.class})
public class GetReadableContainersAPITest extends BaseWebDriverTest
{
- private static final String PROJECT_PREFIX = "/GetReadableContainersAPITest";
+ private static final String PROJECT_PREFIX = "GetReadableContainersAPITest";
private static final String READABLE_PROJECT = PROJECT_PREFIX + " Readable";
private static final String UNREADABLE_PROJECT = PROJECT_PREFIX + " Unreadable";
private static final String USER = "reader@containersapi.test";
@@ -190,7 +190,7 @@ private String getPathToFolder(boolean projectReadable, boolean... foldersReadab
private Set getReadableContainers(Boolean includeSubfolders, Integer depth, Object container)
{
List response = executeGetReadableContainers(includeSubfolders, depth, container, List.class);
- return response.stream().filter(path -> path.startsWith(PROJECT_PREFIX)).collect(Collectors.toSet());
+ return response.stream().filter(path -> path.startsWith("/" + PROJECT_PREFIX)).collect(Collectors.toSet());
}
private List