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> getReadableContainersErrors(Boolean includeSubfolders, Integer depth, Object container) @@ -214,7 +214,7 @@ private T executeGetReadableContainers(Boolean includeSubfolders, Integer de if (depth != null) config.put("depth", depth); if (container != null) - config.put("container", container); + config.put("container", "/" + container); String script = "var config = arguments[0];\n" + "config.success = callback;\n" + diff --git a/src/org/labkey/test/util/APITestHelper.java b/src/org/labkey/test/util/APITestHelper.java index 0b2fd1301e..fac7c8ca25 100644 --- a/src/org/labkey/test/util/APITestHelper.java +++ b/src/org/labkey/test/util/APITestHelper.java @@ -145,7 +145,8 @@ private static ApiTestCase parseTestCase(TestCaseType element, boolean strictTyp String response = element.getResponse(); if (response != null) - testCase.setResponse(StringUtils.trim(response)); + testCase.setResponse(StringUtils.trim(response) + .replaceAll("%contextPath%", WebTestHelper.getContextPath())); String formData = element.getFormData(); if (formData != null)