Skip to content

Commit d1a75f2

Browse files
authored
Add parameter to set the logging level for TestLogger (#2873)
- Add parameter (`webtest.log.level`) to set the logging level for TestLogger - Remove circular static initialization dependency between `TestLogger` and `TestProperties` - Adjust `WebDriverWrapper.waitForPageToLoad` to work better on Chrome
1 parent ee14590 commit d1a75f2

5 files changed

Lines changed: 37 additions & 23 deletions

File tree

src/org/labkey/test/TestProperties.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@
1717

1818
import org.apache.commons.lang3.StringUtils;
1919
import org.apache.commons.lang3.SystemUtils;
20+
import org.apache.logging.log4j.LogManager;
21+
import org.apache.logging.log4j.Logger;
2022
import org.labkey.serverapi.reader.Readers;
2123
import org.labkey.test.util.CachingSupplier;
2224
import org.labkey.test.util.CspLogUtil;
2325
import org.labkey.test.util.TestDataGenerator;
24-
import org.labkey.test.util.TestLogger;
2526
import org.labkey.test.util.Version;
2627
import org.openqa.selenium.Dimension;
2728

@@ -42,41 +43,41 @@
4243
import java.util.Objects;
4344
import java.util.Optional;
4445
import java.util.Properties;
45-
import java.util.Random;
4646
import java.util.stream.Collectors;
4747
import java.util.stream.Stream;
4848

4949
public abstract class TestProperties
5050
{
51+
private static final Logger LOG = LogManager.getLogger(TestProperties.class);
52+
5153
static
5254
{
5355
final File propFile = new File(TestFileUtils.getTestRoot(), "test.properties");
5456
final File propFileTemplate = new File(TestFileUtils.getTestRoot(), "test.properties.template");
5557
if (!propFile.exists())
5658
{
57-
TestLogger.log(String.format("'%s' does not exist. Creating default from '%s'", propFile.getName(), propFileTemplate.getName()));
59+
LOG.info("'{}' does not exist. Creating default from '{}'", propFile.getName(), propFileTemplate.getName());
5860
try (Stream<String> propStream = Files.lines(propFileTemplate.toPath()))
5961
{
6062
final Iterator<String> iterator = propStream.filter(line -> !line.startsWith("#!!")).iterator();
6163
Files.write(propFile.toPath(), (Iterable<String>) () -> iterator, StandardOpenOption.CREATE_NEW);
6264
}
6365
catch (IOException e)
6466
{
65-
TestLogger.error(e.getMessage());
67+
LOG.error(e.getMessage(), e);
6668
}
6769
}
6870
try (Reader propReader = Readers.getReader(propFile))
6971
{
70-
TestLogger.log("Loading properties from " + propFile.getName());
72+
LOG.info("Loading properties from {}", propFile.getName());
7173
Properties properties = new Properties();
7274
properties.load(propReader);
7375
properties.putAll(System.getProperties());
7476
System.setProperties(properties);
7577
}
7678
catch (IOException ioe)
7779
{
78-
TestLogger.error("Failed to load " + propFile.getName() + " file. Running with hard-coded defaults");
79-
ioe.printStackTrace(System.err);
80+
LOG.error("Failed to load {} file. Running with hard-coded defaults", propFile.getName(), ioe);
8081
}
8182

8283
final List<String> gradleProperties = List.of("labkeyVersion");
@@ -85,7 +86,7 @@ public abstract class TestProperties
8586
{
8687
try (Reader propReader = Readers.getReader(serverPropFile))
8788
{
88-
TestLogger.log("Loading properties from " + serverPropFile.getName());
89+
LOG.info("Loading properties from {}", serverPropFile.getName());
8990
Properties properties = new Properties();
9091
properties.load(propReader);
9192
for (String key : gradleProperties)
@@ -98,8 +99,7 @@ public abstract class TestProperties
9899
}
99100
catch (IOException ioe)
100101
{
101-
TestLogger.error("Failed to load " + serverPropFile.getName() + " file.");
102-
ioe.printStackTrace(System.err);
102+
LOG.error("Failed to load {} file.", serverPropFile.getName(), ioe);
103103
}
104104
}
105105

@@ -298,9 +298,9 @@ public static boolean isTroubleshootingStacktracesEnabled()
298298
return getBooleanProperty("webtest.troubleshooting.stacktraces", false);
299299
}
300300

301-
public static boolean isDebugLoggingEnabled()
301+
public static String getTestLogLevel()
302302
{
303-
return getBooleanProperty("webtest.logging.debug", false);
303+
return System.getProperty("webtest.log.level");
304304
}
305305

306306
public static boolean isPrimaryUserAppAdmin()
@@ -432,7 +432,7 @@ public static File getDumpDir()
432432
"Tried system properties failure.output.dir and java.io.tmpdir");
433433
}
434434

435-
TestLogger.log("Using " + dumpDir + " to store test output");
435+
LOG.info("Using {} to store test output", dumpDir);
436436
}
437437
return dumpDir;
438438
}
@@ -475,7 +475,7 @@ public static int getIntegerProperty(String key, int def)
475475
}
476476
catch (NumberFormatException e)
477477
{
478-
TestLogger.warn("Invalid value for property %s: '%s'".formatted(key, prop), e);
478+
LOG.warn("Invalid value for property {}: '{}'", key, prop, e);
479479
}
480480
}
481481
return def;
@@ -499,7 +499,7 @@ public static double getDoubleProperty(String key, double def)
499499
}
500500
catch (NumberFormatException e)
501501
{
502-
TestLogger.warn("Invalid value for property %s: '%s'".formatted(key, prop), e);
502+
LOG.warn("Invalid value for property {}: '{}'", key, prop, e);
503503
}
504504
}
505505
return def;

src/org/labkey/test/WebDriverWrapper.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ protected Pair<WebDriver, DriverService> createNewWebDriver(@NotNull Pair<WebDri
355355
profile.setPreference("extensions.update.enabled", false);
356356
profile.setPreference("dom.max_script_run_time", 0);
357357
profile.setPreference("dom.max_chrome_script_run_time", 0);
358+
//profile.setPreference("dom.reporting.enabled", true); // Enable support for CSP report-to
358359

359360
// Prevent crawler from hanging on '_print=1' pages
360361
profile.setPreference("print.always_print_silent", true);
@@ -1997,19 +1998,18 @@ private void waitForPageToLoad(WebElement toBeStale, Timer timer)
19971998
{
19981999
try
19992000
{
2000-
toBeStale.isEnabled();
20012001
new WebDriverWait(getDriver(), timer.timeRemaining())
20022002
.withMessage("waiting for browser to navigate")
20032003
.until(ExpectedConditions.stalenessOf(toBeStale));
20042004
}
2005-
catch (StaleElementReferenceException | NoSuchElementException | NullPointerException ignore)
2006-
{
2007-
// `ExpectedConditions.stalenessOf(toBeStale)` sometimes chokes when coming from a blank page (about:blank)
2008-
}
20092005
catch (TimeoutException ex)
20102006
{
20112007
throw new TestTimeoutException(ex); // Triggers thread dump.
20122008
}
2009+
catch (WebDriverException | NullPointerException ignore)
2010+
{
2011+
// `ExpectedConditions.stalenessOf(toBeStale)` sometimes chokes when coming from a blank page (about:blank)
2012+
}
20132013

20142014
// WebDriver usually does this automatically, but not always.
20152015
new WebDriverWait(getDriver(), timer.timeRemaining())

src/org/labkey/test/aspects/MethodLoggingAspect.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public void beforeLoggedMethod(JoinPoint joinPoint, LogMethod logMethod)
7272

7373
String argsString = getArgsString(loggedParameters);
7474

75-
if (logMethod.quiet())
75+
if (logMethod.quiet() && !TestLogger.log().isDebugEnabled())
7676
{
7777
TestLogger.suppressLogging(true);
7878
quietMethods.add(method);
@@ -108,7 +108,7 @@ private void logMethodEnd(JoinPoint joinPoint, LogMethod logMethod, String logPr
108108

109109
String argString = " done";
110110

111-
if (logMethod.quiet())
111+
if (logMethod.quiet() && !TestLogger.log().isDebugEnabled())
112112
{
113113
quietMethods.pop();
114114
argString = quietMethodsArgStrings.pop();

src/org/labkey/test/util/TestLogger.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,29 @@
1616
package org.labkey.test.util;
1717

1818
import org.apache.commons.lang3.StringUtils;
19+
import org.apache.logging.log4j.Level;
1920
import org.apache.logging.log4j.LogManager;
2021
import org.apache.logging.log4j.Logger;
2122
import org.apache.logging.log4j.ThreadContext;
23+
import org.apache.logging.log4j.core.config.Configurator;
2224
import org.jetbrains.annotations.Contract;
2325
import org.jetbrains.annotations.NotNull;
2426

2527
import java.util.concurrent.TimeUnit;
2628

29+
import static org.labkey.test.TestProperties.getTestLogLevel;
30+
2731
public class TestLogger
2832
{
2933
private static final Logger LOG = LogManager.getLogger(TestLogger.class);
3034
private static final Logger NO_OP = LogManager.getLogger("NoOpLogger");
3135

36+
static
37+
{
38+
if (getTestLogLevel() != null)
39+
Configurator.setLevel(LOG, Level.toLevel(getTestLogLevel()));
40+
}
41+
3242
private static final int indentStep = 2;
3343
private static final int MAX_INDENT = 20;
3444

test.properties.template

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ test.credentials.file=
6464
webtest.timeout.multiplier=1.0
6565
## Runs just the cleanup steps of the specified tests/suites
6666
cleanOnly=false
67+
## Set logging level for Selenium tests (default: INFO)
68+
#webtest.log.level=DEBUG
69+
## Set whether DeferredErrorCollector should fail immediately when errors are encountered (default: false)
70+
#webtest.checker.fatal=true
6771

6872

6973
#==============================================================================
@@ -131,7 +135,7 @@ labkey.contextpath=
131135
#==============================================================================
132136
# Server configuration properties
133137
#
134-
# These define certain Tomcat startup properties. Mostly only used by TeamCity
138+
# These inform tests of certain LabKey startup properties. Mostly only used by TeamCity
135139
#==============================================================================
136140
disableAssertions=false
137141
devMode=true

0 commit comments

Comments
 (0)