diff --git a/src/org/labkey/remoteapi/admin/ClearCachesCommand.java b/src/org/labkey/remoteapi/admin/ClearCachesCommand.java new file mode 100644 index 0000000000..a9851f2e64 --- /dev/null +++ b/src/org/labkey/remoteapi/admin/ClearCachesCommand.java @@ -0,0 +1,31 @@ +package org.labkey.remoteapi.admin; + +import org.labkey.remoteapi.CommandResponse; +import org.labkey.remoteapi.PostCommand; + +import java.util.HashMap; +import java.util.Map; + +public class ClearCachesCommand extends PostCommand +{ + private final boolean _clearCaches; + private final boolean _gc; + + public ClearCachesCommand(boolean clearCaches, boolean gc) + { + super("admin", "clearCaches"); + _clearCaches = clearCaches; + _gc = gc; + } + + @Override + protected Map createParameterMap() + { + Map params = new HashMap<>(); + if (_clearCaches) + params.put("clearCaches", true); + if (_gc) + params.put("gc", true); + return params; + } +} diff --git a/src/org/labkey/test/BaseWebDriverTest.java b/src/org/labkey/test/BaseWebDriverTest.java index 33b8704765..01cd0e2eb1 100644 --- a/src/org/labkey/test/BaseWebDriverTest.java +++ b/src/org/labkey/test/BaseWebDriverTest.java @@ -44,6 +44,7 @@ import org.labkey.remoteapi.CommandException; import org.labkey.remoteapi.CommandResponse; import org.labkey.remoteapi.Connection; +import org.labkey.remoteapi.admin.ClearCachesCommand; import org.labkey.remoteapi.SimpleGetCommand; import org.labkey.remoteapi.SimplePostCommand; import org.labkey.remoteapi.collections.CaseInsensitiveHashMap; @@ -99,7 +100,6 @@ import org.labkey.test.util.UIPermissionsHelper; import org.labkey.test.util.core.webdav.WebDavUploadHelper; import org.labkey.test.util.ext4cmp.Ext4FieldRef; -import org.labkey.test.util.query.QueryUtils; import org.labkey.test.util.selenium.WebDriverUtils; import org.openqa.selenium.By; import org.openqa.selenium.ElementClickInterceptedException; @@ -1174,6 +1174,7 @@ public void dumpHeap() // Use dumpHeapAction rather that touching file so that we can get file name and publish artifact. beginAt(WebTestHelper.buildURL("admin", "dumpHeap")); + clickButton("OK"); String dumpMsg = Locators.bodyPanel().childTag("div").findElement(getDriver()).getText(); String filePrefix = "Heap dumped to "; int prefixIndex = dumpMsg.indexOf(filePrefix); @@ -1389,6 +1390,22 @@ public static File getDownloadDir() return SingletonWebDriver.getInstance().getDownloadDir(); } + /** + * Clears all server caches and runs garbage collection via the admin ClearCachesAction. + * Leaves the browser on the MemTracker page. + */ + protected void clearCaches() + { + try + { + new ClearCachesCommand(true, true).execute(createDefaultConnection(), "/"); + } + catch (IOException | CommandException e) + { + throw new RuntimeException("Failed to clear caches", e); + } + } + protected void checkLeaks() { if (isLeakCheckSkipped()) @@ -1415,7 +1432,8 @@ protected void checkLeaks() } } msSinceTestStart = System.currentTimeMillis() - previousLeakCheck; - beginAt(WebTestHelper.buildURL("admin", "memTracker", Map.of("gc", 1, "clearCaches", 1)), 120000); + clearCaches(); + beginAt(WebTestHelper.buildURL("admin", "memTracker")); if (!isTextPresent("In-Use Objects")) throw new IllegalStateException("Asserts must be enabled to track memory leaks; add -ea to your server VM params and restart or add -DmemCheck=false to your test VM params."); leakCount = getImageWithAltTextCount("expand/collapse"); @@ -2375,12 +2393,6 @@ public void validateQueries(boolean validateSubfolders) validateQueries(validateSubfolders, 120000); } - @Deprecated - public void deleteAllRows(String projectName, String schema, String table) throws IOException, CommandException - { - QueryUtils.truncateTable(projectName, schema, table); - } - // This class makes it easier to start a specimen import early in a test and wait for completion later. public class SpecimenImporter { diff --git a/src/org/labkey/test/pages/LabkeyErrorPage.java b/src/org/labkey/test/pages/LabkeyErrorPage.java index 49937d6cb4..b9b415419d 100644 --- a/src/org/labkey/test/pages/LabkeyErrorPage.java +++ b/src/org/labkey/test/pages/LabkeyErrorPage.java @@ -51,6 +51,12 @@ public String getErrorImage() { return elementCache().errorImage.getAttribute("src"); } + + public boolean isShowDetailsPresent() + { + return !Locator.button("View Details").findElements(getDriver()).isEmpty(); + } + @Override protected ElementCache newElementCache() { diff --git a/src/org/labkey/test/tests/LabkeyErrorPageTest.java b/src/org/labkey/test/tests/LabkeyErrorPageTest.java index 4f05da9bb2..0cbfddf7fe 100644 --- a/src/org/labkey/test/tests/LabkeyErrorPageTest.java +++ b/src/org/labkey/test/tests/LabkeyErrorPageTest.java @@ -45,6 +45,8 @@ public void testGeneralErrors() checker().verifyEquals("Incorrect error heading message", "404: page not found", errorPage.getErrorHeading()); checker().verifyThat("Incorrect error image", errorPage.getErrorImage(), CoreMatchers.containsString(imageTitle)); + checker().verifyTrue("'Show Details' button should appear on not found error page", + errorPage.isShowDetailsPresent()); beginAt(WebTestHelper.buildRelativeUrl("project", getCurrentContainerPath(), "beginning")); errorPage = new LabkeyErrorPage(getDriver()); @@ -88,6 +90,8 @@ public void testServerConfigurationErrors() checker().verifyEquals("Incorrect error sub-heading message", "The requested page cannot be found. You have a configuration problem.", errorPage.getSubErrorHeading()); checker().verifyThat("Incorrect error image", errorPage.getErrorImage(), CoreMatchers.containsString(imageTitle)); + checker().verifyTrue("'Show Details' button should appear on configuration error page", + errorPage.isShowDetailsPresent()); checkExpectedErrors(1); } @@ -103,9 +107,11 @@ public void testExecutionErrors() checker().verifyEquals("Incorrect error heading message", "Oops! An error has occurred.", errorPage.getErrorHeading()); checker().verifyEquals("Incorrect error instructions", "You can find help resources here and may " + - "find troubleshooting hints by reading the full stack trace in the View Details section below.", + "find troubleshooting hints by reading the full stack trace in the server logs.", errorPage.getErrorInstruction()); checker().verifyThat("Incorrect error image", errorPage.getErrorImage(), CoreMatchers.containsString(imageTitle)); + checker().verifyFalse("'Show Details' button should not appear on execution error page", + errorPage.isShowDetailsPresent()); checkExpectedErrors(2); } diff --git a/src/org/labkey/test/tests/filecontent/FilesQueryTest.java b/src/org/labkey/test/tests/filecontent/FilesQueryTest.java index b5d957f7fe..1dadc516dc 100644 --- a/src/org/labkey/test/tests/filecontent/FilesQueryTest.java +++ b/src/org/labkey/test/tests/filecontent/FilesQueryTest.java @@ -173,7 +173,7 @@ public void testNonFileBrowserFileRecords() private void ensureFilesUpToDate() { log("Clear cache so that exp.files will do a sync immediately"); - beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", "1")), 120000); + clearCaches(); goToProjectHome(); } diff --git a/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java b/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java index af48928236..05a938bcfa 100644 --- a/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java +++ b/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java @@ -88,7 +88,7 @@ private long[] studyBaselineEmptyCache() { long[] emptyCacheOpenStudyTimes = new long[5]; // run tests for (int x = 0 ; x < 5; x++) { - beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", 1)), 120000); + clearCaches(); goToHome(); clickProject(getProjectName()); goToSchemaBrowser(); @@ -103,7 +103,7 @@ private long[] studyBaselineEmptyCache() { private long[] studyBaselineFullCache() { long[] fullCacheOpenStudyTimes = new long[5]; // prepare cache - beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", 1)), 120000); + clearCaches(); goToHome(); clickProject(getProjectName()); goToSchemaBrowser(); @@ -125,7 +125,7 @@ private long[] studyBaselineFullCache() { private long[] studyDataBaselineFullCache() { long[] emptyCacheOpenStudyDataTimes = new long[5]; // prepare cache - beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", 1)), 120000); + clearCaches(); goToHome(); clickProject(getProjectName()); goToSchemaBrowser();