From 899810b4fc42f4d9cfb2062f30bed497057735c8 Mon Sep 17 00:00:00 2001 From: Susan Hert Date: Fri, 28 Nov 2025 09:19:46 -0800 Subject: [PATCH 1/3] Use the specific project name for audit log filtering so other failed tests don't interfere here (#2795) --- src/org/labkey/test/util/AuditLogHelper.java | 26 ++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/org/labkey/test/util/AuditLogHelper.java b/src/org/labkey/test/util/AuditLogHelper.java index 82c01a8f64..1c599f6f9a 100644 --- a/src/org/labkey/test/util/AuditLogHelper.java +++ b/src/org/labkey/test/util/AuditLogHelper.java @@ -188,10 +188,16 @@ public DataRegionTable goToAuditEventView(String eventType) */ public SelectRowsResponse getAuditLogsFromLKS(String containerPath, AuditEvent auditEventName, List columnNames, @Nullable List filters, @Nullable Integer maxRows, @Nullable ContainerFilter containerFilter) throws IOException, CommandException + { + return getAuditLogsFromLKS(containerPath, _wrapper.getCurrentProject(), auditEventName, columnNames, filters, maxRows, containerFilter); + } + + public SelectRowsResponse getAuditLogsFromLKS(String containerPath, @NotNull String projectName, AuditEvent auditEventName, List columnNames, + @Nullable List filters, @Nullable Integer maxRows, @Nullable ContainerFilter containerFilter) throws IOException, CommandException { SelectRowsCommand cmd = new SelectRowsCommand("auditLog", auditEventName.getName()); cmd.setColumns(columnNames); - cmd.addFilter("ProjectId/Name", _wrapper.getCurrentProject(), Filter.Operator.EQUAL); + cmd.addFilter("ProjectId/Name", projectName, Filter.Operator.EQUAL); if (filters != null) filters.forEach(cmd::addFilter); if (maxRows != null) @@ -208,7 +214,7 @@ public List> getAuditLogsForTransactionId(String containerPa } public List> getAuditLogsForTransactionId(String containerPath, AuditEvent auditEventName, List columnNames, - Integer transactionId, List eventFilters, @Nullable ContainerFilter containerFilter) throws IOException, CommandException + Integer transactionId, @Nullable List eventFilters, @Nullable ContainerFilter containerFilter) throws IOException, CommandException { List transactionFilter = new ArrayList<>(); if (transactionId != null) @@ -218,6 +224,22 @@ public List> getAuditLogsForTransactionId(String containerPa return getAuditLogsFromLKS(containerPath, auditEventName, columnNames, transactionFilter, null, containerFilter).getRows(); } + public List> getAuditLogsForTransactionId(String containerPath, + AuditEvent auditEventName, + List columnNames, + String projectName, + Integer transactionId, + List eventFilters, + @Nullable ContainerFilter containerFilter) throws IOException, CommandException + { + List transactionFilter = new ArrayList<>(); + if (transactionId != null) + transactionFilter.add(new Filter("TransactionId", transactionId, Filter.Operator.EQUAL)); + if (eventFilters != null && !eventFilters.isEmpty()) + transactionFilter.addAll(eventFilters); + return getAuditLogsFromLKS(containerPath, projectName, auditEventName, columnNames, transactionFilter, null, containerFilter).getRows(); + } + public void checkAuditEventValuesForTransactionId(String containerPath, AuditEvent auditEventName, Integer transactionId, int rowCount, Map expectedValues) throws IOException, CommandException { checkAuditEventValuesForTransactionId(containerPath, auditEventName, transactionId, null, rowCount, expectedValues); From e8758c5fb71e776a5518373b24803dbc91cefaa9 Mon Sep 17 00:00:00 2001 From: Trey Chadick Date: Tue, 2 Dec 2025 08:24:21 -0800 Subject: [PATCH 2/3] Update BaseUpgradeTest to use local enlistment version (#2796) --- src/org/labkey/test/TestProperties.java | 39 +++++++++++++++++++ .../test/tests/upgrade/BaseUpgradeTest.java | 4 +- src/org/labkey/test/util/Version.java | 29 ++++++++++++-- src/org/labkey/test/util/VersionRange.java | 4 +- 4 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/org/labkey/test/TestProperties.java b/src/org/labkey/test/TestProperties.java index 651e6d14b1..007619f3d7 100644 --- a/src/org/labkey/test/TestProperties.java +++ b/src/org/labkey/test/TestProperties.java @@ -20,6 +20,7 @@ import org.labkey.serverapi.reader.Readers; import org.labkey.test.util.CspLogUtil; import org.labkey.test.util.TestLogger; +import org.labkey.test.util.Version; import org.openqa.selenium.Dimension; import java.io.File; @@ -73,6 +74,31 @@ public abstract class TestProperties TestLogger.error("Failed to load " + propFile.getName() + " file. Running with hard-coded defaults"); ioe.printStackTrace(System.err); } + + final List gradleProperties = List.of("labkeyVersion"); + final File serverPropFile = new File(TestFileUtils.getLabKeyRoot(), "gradle.properties"); + if (serverPropFile.exists()) + { + try (Reader propReader = Readers.getReader(serverPropFile)) + { + TestLogger.log("Loading properties from " + serverPropFile.getName()); + Properties properties = new Properties(); + properties.load(propReader); + for (String key : gradleProperties) + { + if (properties.containsKey(key)) + { + System.setProperty(key, properties.getProperty(key)); + } + } + } + catch (IOException ioe) + { + TestLogger.error("Failed to load " + serverPropFile.getName() + " file."); + ioe.printStackTrace(System.err); + } + } + } private static ZoneId browserZoneId = null; @@ -83,6 +109,19 @@ public static void load() CspLogUtil.init(); } + /// Get the local enlistment version, stripping everything past the minor version. + /// - `"25.11.0"` -> `"25.11"` + /// - `"25.11-SNAPSHOT"` -> `"25.11"` + /// @return Enlistment Version or `null` if unable to determine + public static Version getProductVersion() + { + Version version = new Version(System.getProperty("labkeyVersion", "1")); + if (version.size() >= 2) + return version.trim(2); + else + return null; + } + public static boolean isTestCleanupSkipped() { return !getBooleanProperty("clean", false); diff --git a/src/org/labkey/test/tests/upgrade/BaseUpgradeTest.java b/src/org/labkey/test/tests/upgrade/BaseUpgradeTest.java index 3daaec5540..33fe474029 100644 --- a/src/org/labkey/test/tests/upgrade/BaseUpgradeTest.java +++ b/src/org/labkey/test/tests/upgrade/BaseUpgradeTest.java @@ -36,7 +36,7 @@ public abstract class BaseUpgradeTest extends BaseWebDriverTest protected static final boolean isUpgradeSetupPhase = TestProperties.getBooleanProperty("webtest.upgradeSetup", true); protected static final Version previousVersion = Optional.ofNullable(trimToNull(System.getProperty("webtest.upgradePreviousVersion"))) - .map(Version::new).orElse(null); + .map(Version::new).orElse(TestProperties.getProductVersion()); @Override protected boolean skipCleanup(boolean afterTest) @@ -114,7 +114,7 @@ private static class UpgradeVersionCheck implements TestRule @Override public void evaluate() throws Throwable { - Assume.assumeTrue("Test doesn't support upgrading from version: " + previousVersion, + Assume.assumeTrue("Test not valid when upgrading from version: " + previousVersion, VersionRange.versionRange(earliestVersion, latestVersion).contains(previousVersion) ); base.evaluate(); diff --git a/src/org/labkey/test/util/Version.java b/src/org/labkey/test/util/Version.java index cef81cd705..d67bc37eba 100644 --- a/src/org/labkey/test/util/Version.java +++ b/src/org/labkey/test/util/Version.java @@ -15,14 +15,22 @@ public class Version implements Comparable { private final List _version; - public Version(Integer... version) + private Version(List version) { _version = validate(version); } + public Version(Integer... version) + { + this(List.of(version)); + } + public Version(String version) { - this(Arrays.stream(version.split("\\.")).map(Integer::parseInt).toArray(Integer[]::new)); + this(Arrays.stream(version + .split("-", 2)[0] // Remove snapshot suffix + .split("\\.")) // Split the version into major, minor, patch, etc. parts + .map(Integer::parseInt).toList()); } public Version(Double version) @@ -30,9 +38,9 @@ public Version(Double version) this(version.toString()); } - private static List validate(Integer... versionParts) + private static List validate(List versionParts) { - List partList = List.of(versionParts); + List partList = List.copyOf(versionParts); if (partList.isEmpty()) { throw new IllegalArgumentException("Version must have at least one part"); @@ -47,6 +55,19 @@ private static List validate(Integer... versionParts) return partList; } + public Version trim(int maxParts) + { + if (maxParts == _version.size()) + return this; + else + return new Version(_version.subList(0, maxParts)); + } + + public int size() + { + return _version.size(); + } + @Override public int compareTo(@NotNull Version o) { diff --git a/src/org/labkey/test/util/VersionRange.java b/src/org/labkey/test/util/VersionRange.java index 123b9a987d..0fe8220e5a 100644 --- a/src/org/labkey/test/util/VersionRange.java +++ b/src/org/labkey/test/util/VersionRange.java @@ -23,7 +23,9 @@ public static VersionRange until(String version) public static VersionRange versionRange(String earliestVersion, String latestVersion) { - return new VersionRange(new Version(earliestVersion), new Version(latestVersion)); + Version earliest = earliestVersion == null ? null : new Version(earliestVersion); + Version latest = latestVersion == null ? null : new Version(latestVersion); + return new VersionRange(earliest, latest); } public boolean contains(Version version) From 6a4b98666602b749b0cde45cba283e44dd81ac46 Mon Sep 17 00:00:00 2001 From: Trey Chadick Date: Wed, 3 Dec 2025 10:23:08 -0800 Subject: [PATCH 3/3] Avoid creating screenshots with illegal characters (#2790) --- src/org/labkey/test/util/ArtifactCollector.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/org/labkey/test/util/ArtifactCollector.java b/src/org/labkey/test/util/ArtifactCollector.java index cfd10f23f1..62694cd0a0 100644 --- a/src/org/labkey/test/util/ArtifactCollector.java +++ b/src/org/labkey/test/util/ArtifactCollector.java @@ -49,22 +49,18 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; -import java.util.regex.Pattern; import static org.labkey.test.TestProperties.isTestRunningOnTeamCity; import static org.labkey.test.WebTestHelper.isLocalServer; public class ArtifactCollector { - private static final Map _shotCounters = new HashMap<>(); - private static final Pattern _illegalFileCharactersPattern = SystemUtils.IS_OS_WINDOWS - ? Pattern.compile("[\\\\/:*?|\"<>]") - : Pattern.compile("/"); + private static final Map _shotCounters = new ConcurrentHashMap<>(); private final WebDriverWrapper _driver; private final String _dumpDirName; @@ -172,7 +168,7 @@ public static void dumpThreads() private String buildBaseName(@NotNull String suffix) { - return getAndIncrementShotCounter() + "_" + _illegalFileCharactersPattern.matcher(suffix).replaceAll("_"); + return TestFileUtils.makeLegalFileName(getAndIncrementShotCounter() + "_" + suffix); } private int getAndIncrementShotCounter()