From a54e1c189bf21d7fdbbb08b7d0bc8004c52a36bc Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Tue, 2 Sep 2025 12:42:06 -0700 Subject: [PATCH 1/2] Stop referencing removed setting --- .../labkey/test/pages/core/admin/CustomizeSitePage.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/org/labkey/test/pages/core/admin/CustomizeSitePage.java b/src/org/labkey/test/pages/core/admin/CustomizeSitePage.java index 2660ee999c..70e81bf3e3 100644 --- a/src/org/labkey/test/pages/core/admin/CustomizeSitePage.java +++ b/src/org/labkey/test/pages/core/admin/CustomizeSitePage.java @@ -75,12 +75,6 @@ public String getBaseServerUrl() return elementCache().baseServerUrl.get(); } - public CustomizeSitePage setContainerRelativeUrl(boolean enable) - { - elementCache().containerRelativeUrl.set(enable); - return this; - } - public CustomizeSitePage setUsageReportingLevel(ReportingLevel level) { elementCache().usageReportingLevel(level).check(); @@ -233,7 +227,6 @@ protected class ElementCache extends LabKeyPage.ElementCache // Site URLs protected final Input defaultDomain = Input(Locator.id("defaultDomain"), getDriver()).findWhenNeeded(this); protected final Input baseServerUrl = Input(Locator.id("baseServerURL"), getDriver()).findWhenNeeded(this); - protected final Checkbox containerRelativeUrl = Checkbox(Locator.id("useContainerRelativeURL")).findWhenNeeded(this); // Usage Reporting protected RadioButton usageReportingLevel(ReportingLevel level) From 5e059a1762e0e2c7e3f8a2386f109c0c24f3e69c Mon Sep 17 00:00:00 2001 From: labkey-tchad Date: Fri, 5 Sep 2025 17:28:36 -0700 Subject: [PATCH 2/2] Make crawler log any controller-first URLs it finds --- src/org/labkey/test/TestProperties.java | 5 ++++ src/org/labkey/test/WebDriverWrapper.java | 19 +++++++++++++++ src/org/labkey/test/util/Crawler.java | 28 +++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/src/org/labkey/test/TestProperties.java b/src/org/labkey/test/TestProperties.java index 83d56286fc..033adb1e59 100644 --- a/src/org/labkey/test/TestProperties.java +++ b/src/org/labkey/test/TestProperties.java @@ -262,6 +262,11 @@ public static boolean isCheckerFatal() return "true".equals(System.getProperty("webtest.checker.fatal")); } + public static boolean isControllerFirstUrlFatal() + { + return getBooleanProperty("webtest.fatalControllerFirstUrl", false); + } + public static boolean isAssayProductFeatureAvailable() { return isProductFeatureAvailable("assay"); diff --git a/src/org/labkey/test/WebDriverWrapper.java b/src/org/labkey/test/WebDriverWrapper.java index 1aa4c3b1f9..facaf7550d 100644 --- a/src/org/labkey/test/WebDriverWrapper.java +++ b/src/org/labkey/test/WebDriverWrapper.java @@ -1206,6 +1206,25 @@ public long beginAt(String url, int millis, boolean acceptAlerts) logMessage = "Navigating to " + relativeURL; } + if (WebTestHelper.isUseContainerRelativeUrl()) + { + try + { + if (new Crawler.ControllerActionId(relativeURL).isControllerFirstUrl()) + { + RuntimeException ex = new RuntimeException("Controller first url found in URL: " + relativeURL); + if (TestProperties.isControllerFirstUrlFatal()) + throw ex; + else + TestLogger.log().warn(ex.getMessage(), ex); + } + } + catch (IllegalArgumentException e) + { + TestLogger.warn("Unable to parse URL: " + relativeURL, e); + } + } + final String fullURL = WebTestHelper.getBaseURL() + relativeURL; final boolean expectPageLoad = expectPageLoad(fullURL); diff --git a/src/org/labkey/test/util/Crawler.java b/src/org/labkey/test/util/Crawler.java index fc3717aea6..3da61dd9d5 100644 --- a/src/org/labkey/test/util/Crawler.java +++ b/src/org/labkey/test/util/Crawler.java @@ -527,6 +527,8 @@ else if (urlText.startsWith("?")) p += (_prioritizeAdminPages ? -1 : 1); priority = p + random.nextFloat(); + checkControllerRelativeUrl(); + try { isVisitableURL(); @@ -605,6 +607,18 @@ public boolean underCreatedProject() return _projects.contains(currentProject); } + private void checkControllerRelativeUrl() + { + if (_actionId != null && _actionId.isControllerFirstUrl() && WebTestHelper.isUseContainerRelativeUrl()) + { + RuntimeException ex = new RuntimeException("Found a controller-first URL (%s) on %s".formatted(getUrlText(), getOrigin())); + if (TestProperties.isControllerFirstUrlFatal()) + throw ex; + else + TestLogger.warn(ex.getMessage(), ex); + } + } + public boolean isVisitableURL() { if (StringUtils.isBlank(getRelativeURL())) @@ -677,12 +691,14 @@ public static class ControllerActionId @NotNull private final String _controller; @NotNull private String _action = ""; private final String _containerPath; + private final boolean _controllerFirstUrl; public ControllerActionId(@NotNull String controller, @NotNull String action) { _controller = controller; _action = action; _containerPath = null; + _controllerFirstUrl = false; } public ControllerActionId(@NotNull String url) @@ -691,6 +707,7 @@ public ControllerActionId(@NotNull String url) if (rootRelativeURL.startsWith("_webdav/")) { + _controllerFirstUrl = false; _controller = "_webdav"; String path = EscapeUtil.decode(rootRelativeURL.substring("_webdav/".length())); if (path.startsWith("@")) @@ -711,6 +728,7 @@ public ControllerActionId(@NotNull String url) } if (rootRelativeURL.startsWith("_webfiles/")) { + _controllerFirstUrl = false; _controller = "_webfiles"; _containerPath = EscapeUtil.decode(rootRelativeURL.substring("_webfiles/".length())); return; @@ -735,6 +753,7 @@ public ControllerActionId(@NotNull String url) int dash = _action.lastIndexOf("-"); _controller = _action.substring(0,dash); _action = _action.substring(dash+1); + _controllerFirstUrl = false; } else { @@ -744,6 +763,7 @@ public ControllerActionId(@NotNull String url) throw new IllegalArgumentException("Unable to parse folder out of relative URL: \"" + rootRelativeURL + "\""); _controller = rootRelativeURL.substring(0, postControllerSlashIdx); rootRelativeURL = rootRelativeURL.substring(postControllerSlashIdx+1); + _controllerFirstUrl = true; } _containerPath = EscapeUtil.decode(StringUtils.strip(rootRelativeURL, "/")); } @@ -768,6 +788,14 @@ public String getContainerPath() return _containerPath; } + /** + * Allows us to track down pages that still create controller-first URLs + */ + public boolean isControllerFirstUrl() + { + return _controllerFirstUrl; + } + @Override public String toString() {