You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2022/05/28 00:02:54 UTC
[logging-log4j2] 05/05: Add TestProperties JUnit 5 extension
This is an automated email from the ASF dual-hosted git repository.
mattsicker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 1d533574162c51e40f0bef16d1f73b15f9e3f59e
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Fri May 27 19:02:27 2022 -0500
Add TestProperties JUnit 5 extension
This also updates several tests that were using system properties to use this extension instead.
Signed-off-by: Matt Sicker <ma...@apache.org>
---
.../logging/log4j/test/junit/PropertyTester.java | 67 ++++++++++++++++++++++
.../logging/log4j/test/junit/TestProperties.java | 45 +++++++++++++++
.../logging/log4j/NoopThreadContextTest.java | 30 +++-------
.../log4j/ThreadContextInheritanceTest.java | 56 ++++++------------
.../log4j/spi/DefaultThreadContextMapTest.java | 17 ++----
.../logging/log4j/spi/ThreadContextMapFactory.java | 5 +-
.../log4j/core/EventParameterMemoryLeakTest.java | 25 +++-----
.../apache/logging/log4j/core/Log4j1222Test.java | 10 ++--
.../logging/log4j/core/LogbackSubstitution.java | 20 +------
.../log4j/core/appender/ConsoleAppenderTest.java | 23 ++------
...ollingRandomAccessFileAppenderRolloverTest.java | 10 +---
.../async/AsyncAppenderConfigTest_LOG4J2_2032.java | 34 +++++------
.../log4j/core/async/AsyncLoggerConfig4Test.java | 9 +--
.../core/async/AsyncLoggerConfigAutoFlushTest.java | 38 +++++-------
.../core/async/AsyncLoggerConfigErrorOnFormat.java | 49 ++++++----------
.../logging/log4j/core/time/ClockFactoryTest.java | 22 +++----
16 files changed, 224 insertions(+), 236 deletions(-)
diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/PropertyTester.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/PropertyTester.java
new file mode 100644
index 0000000000..2fc401f5dc
--- /dev/null
+++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/PropertyTester.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+
+package org.apache.logging.log4j.test.junit;
+
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Properties;
+
+class PropertyTester implements BeforeAllCallback, BeforeEachCallback {
+ @Override
+ public void beforeAll(final ExtensionContext context) throws Exception {
+ final TestProperties testProperties = context.getRequiredTestClass().getAnnotation(TestProperties.class);
+ if (testProperties != null) {
+ context.getStore(ExtensionContext.Namespace.create(TestProperties.class, context.getRequiredTestClass()))
+ .put(PropertiesSession.class, new PropertiesSession(testProperties));
+ }
+ }
+
+ @Override
+ public void beforeEach(final ExtensionContext context) throws Exception {
+ final TestProperties testProperties = context.getRequiredTestMethod().getAnnotation(TestProperties.class);
+ if (testProperties != null) {
+ context.getStore(ExtensionContext.Namespace.create(TestProperties.class, context.getRequiredTestInstance()))
+ .put(PropertiesSession.class, new PropertiesSession(testProperties));
+ }
+ }
+
+ private static class PropertiesSession implements ExtensionContext.Store.CloseableResource {
+ private final Properties properties = new Properties();
+
+ private PropertiesSession(final TestProperties testProperties) throws IOException {
+ for (final String testProperty : testProperties.value()) {
+ properties.load(new StringReader(testProperty));
+ }
+ for (final String propertyName : properties.stringPropertyNames()) {
+ System.setProperty(propertyName, properties.getProperty(propertyName));
+ }
+ }
+
+ @Override
+ public void close() throws Throwable {
+ for (final String propertyName : properties.stringPropertyNames()) {
+ System.clearProperty(propertyName);
+ }
+ properties.clear();
+ }
+ }
+}
diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/TestProperties.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/TestProperties.java
new file mode 100644
index 0000000000..c1ded404ae
--- /dev/null
+++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/TestProperties.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+
+package org.apache.logging.log4j.test.junit;
+
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.parallel.ResourceLock;
+import org.junit.jupiter.api.parallel.Resources;
+
+import java.io.Reader;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * JUnit 5 extension for setting Log4j properties for an annotated test class or test method.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Documented
+@ExtendWith(PropertyTester.class)
+@ResourceLock(Resources.SYSTEM_PROPERTIES)
+public @interface TestProperties {
+ /**
+ * Properties to set in the test provided in a {@link java.util.Properties#load(Reader)}-compatible syntax.
+ * This syntax includes key/value pairs as {@code key=value}, {@code key:value}, and {@code key value}.
+ */
+ String[] value();
+}
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/NoopThreadContextTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/NoopThreadContextTest.java
index 6a3859884b..fdf40b740c 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/NoopThreadContextTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/NoopThreadContextTest.java
@@ -16,37 +16,24 @@
*/
package org.apache.logging.log4j;
+import org.apache.logging.log4j.test.junit.TestProperties;
import org.apache.logging.log4j.test.junit.UsingThreadContextMap;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.ResourceLock;
-import org.junit.jupiter.api.parallel.Resources;
import static org.junit.jupiter.api.Assertions.assertNull;
/**
* Tests {@link ThreadContext}.
*/
-@ResourceLock(Resources.SYSTEM_PROPERTIES)
@UsingThreadContextMap
+@TestProperties({
+ "disableThreadContext = true",
+ "disableThreadContextMap = true"
+})
public class NoopThreadContextTest {
-
- private static final String TRUE = "true";
- private static final String PROPERY_KEY_ALL = "disableThreadContext";
- private static final String PROPERY_KEY_MAP = "disableThreadContextMap";
-
- @BeforeAll
- public static void before() {
- System.setProperty(PROPERY_KEY_ALL, TRUE);
- System.setProperty(PROPERY_KEY_MAP, TRUE);
- ThreadContext.init();
- }
-
- @AfterAll
- public static void after() {
- System.clearProperty(PROPERY_KEY_ALL);
- System.clearProperty(PROPERY_KEY_MAP);
+ @BeforeEach
+ void setUp() {
ThreadContext.init();
}
@@ -57,5 +44,4 @@ public class NoopThreadContextTest {
assertNull(value, "value was saved");
}
-
}
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/ThreadContextInheritanceTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/ThreadContextInheritanceTest.java
index 51f8a5966e..87f993a37c 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/ThreadContextInheritanceTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/ThreadContextInheritanceTest.java
@@ -16,15 +16,12 @@
*/
package org.apache.logging.log4j;
+import org.apache.logging.log4j.spi.DefaultThreadContextMap;
import org.apache.logging.log4j.test.ThreadContextUtilityClass;
+import org.apache.logging.log4j.test.junit.TestProperties;
import org.apache.logging.log4j.test.junit.UsingAnyThreadContext;
-import org.apache.logging.log4j.spi.DefaultThreadContextMap;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.ResourceLock;
-import org.junit.jupiter.api.parallel.Resources;
import static org.junit.jupiter.api.Assertions.*;
@@ -32,21 +29,9 @@ import static org.junit.jupiter.api.Assertions.*;
* Tests {@link ThreadContext}.
*/
@UsingAnyThreadContext
-@ResourceLock(Resources.SYSTEM_PROPERTIES)
+@TestProperties(DefaultThreadContextMap.INHERITABLE_MAP + " = true")
public class ThreadContextInheritanceTest {
- @BeforeAll
- public static void setupClass() {
- System.setProperty(DefaultThreadContextMap.INHERITABLE_MAP, "true");
- ThreadContext.init();
- }
-
- @AfterAll
- public static void tearDownClass() {
- System.clearProperty(DefaultThreadContextMap.INHERITABLE_MAP);
- ThreadContext.init();
- }
-
@Test
public void testPush() {
ThreadContext.push("Hello");
@@ -58,26 +43,19 @@ public class ThreadContextInheritanceTest {
@Test
public void testInheritanceSwitchedOn() throws Exception {
- System.setProperty(DefaultThreadContextMap.INHERITABLE_MAP, "true");
- ThreadContext.init();
- try {
- ThreadContext.clearMap();
- ThreadContext.put("Greeting", "Hello");
- StringBuilder sb = new StringBuilder();
- TestThread thread = new TestThread(sb);
- thread.start();
- thread.join();
- String str = sb.toString();
- assertEquals("Hello", str, "Unexpected ThreadContext value. Expected Hello. Actual " + str);
- sb = new StringBuilder();
- thread = new TestThread(sb);
- thread.start();
- thread.join();
- str = sb.toString();
- assertEquals("Hello", str, "Unexpected ThreadContext value. Expected Hello. Actual " + str);
- } finally {
- System.clearProperty(DefaultThreadContextMap.INHERITABLE_MAP);
- }
+ ThreadContext.put("Greeting", "Hello");
+ StringBuilder sb = new StringBuilder();
+ TestThread thread = new TestThread(sb);
+ thread.start();
+ thread.join();
+ String str = sb.toString();
+ assertEquals("Hello", str, "Unexpected ThreadContext value. Expected Hello. Actual " + str);
+ sb = new StringBuilder();
+ thread = new TestThread(sb);
+ thread.start();
+ thread.join();
+ str = sb.toString();
+ assertEquals("Hello", str, "Unexpected ThreadContext value. Expected Hello. Actual " + str);
}
@Test
@@ -123,7 +101,6 @@ public class ThreadContextInheritanceTest {
@Test
public void testRemove() {
- ThreadContext.clearMap();
assertNull(ThreadContext.get("testKey"));
ThreadContext.put("testKey", "testValue");
assertEquals("testValue", ThreadContext.get("testKey"));
@@ -135,7 +112,6 @@ public class ThreadContextInheritanceTest {
@Test
public void testContainsKey() {
- ThreadContext.clearMap();
assertFalse(ThreadContext.containsKey("testKey"));
ThreadContext.put("testKey", "testValue");
assertTrue(ThreadContext.containsKey("testKey"));
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/DefaultThreadContextMapTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/DefaultThreadContextMapTest.java
index a7a12147ab..621d381c46 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/DefaultThreadContextMapTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/DefaultThreadContextMapTest.java
@@ -16,10 +16,9 @@
*/
package org.apache.logging.log4j.spi;
+import org.apache.logging.log4j.test.junit.TestProperties;
import org.apache.logging.log4j.test.junit.UsingThreadContextMap;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.ResourceLock;
-import org.junit.jupiter.api.parallel.Resources;
import java.util.HashMap;
import java.util.Map;
@@ -215,23 +214,17 @@ public class DefaultThreadContextMapTest {
}
@Test
- @ResourceLock(Resources.SYSTEM_PROPERTIES)
+ @TestProperties(DefaultThreadContextMap.INHERITABLE_MAP + " = false")
public void testThreadLocalNotInheritableByDefault() {
- System.clearProperty(DefaultThreadContextMap.INHERITABLE_MAP);
final ThreadLocal<Map<String, String>> threadLocal = DefaultThreadContextMap.createThreadLocalMap(true);
assertFalse(threadLocal instanceof InheritableThreadLocal<?>);
}
@Test
- @ResourceLock(Resources.SYSTEM_PROPERTIES)
+ @TestProperties(DefaultThreadContextMap.INHERITABLE_MAP + " = true")
public void testThreadLocalInheritableIfConfigured() {
- System.setProperty(DefaultThreadContextMap.INHERITABLE_MAP, "true");
ThreadContextMapFactory.init();
- try {
- final ThreadLocal<Map<String, String>> threadLocal = DefaultThreadContextMap.createThreadLocalMap(true);
- assertTrue(threadLocal instanceof InheritableThreadLocal<?>);
- } finally {
- System.clearProperty(DefaultThreadContextMap.INHERITABLE_MAP);
- }
+ final ThreadLocal<Map<String, String>> threadLocal = DefaultThreadContextMap.createThreadLocalMap(true);
+ assertTrue(threadLocal instanceof InheritableThreadLocal<?>);
}
}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java
index edbe49d23e..60d69b35b8 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java
@@ -23,6 +23,7 @@ import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Constants;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.apache.logging.log4j.util.ProviderUtil;
+import org.apache.logging.log4j.util.ReflectionUtil;
/**
* Creates the ThreadContextMap instance used by the ThreadContext.
@@ -88,7 +89,7 @@ public final class ThreadContextMapFactory {
try {
final Class<?> clazz = cl.loadClass(ThreadContextMapName);
if (ThreadContextMap.class.isAssignableFrom(clazz)) {
- result = (ThreadContextMap) clazz.newInstance();
+ result = ReflectionUtil.instantiate(clazz.asSubclass(ThreadContextMap.class));
}
} catch (final ClassNotFoundException cnfe) {
LOGGER.error("Unable to locate configured ThreadContextMap {}", ThreadContextMapName);
@@ -103,7 +104,7 @@ public final class ThreadContextMapFactory {
final Class<? extends ThreadContextMap> clazz = provider.loadThreadContextMap();
if (clazz != null) {
try {
- result = clazz.newInstance();
+ result = ReflectionUtil.instantiate(clazz);
break;
} catch (final Exception e) {
LOGGER.error("Unable to locate or load configured ThreadContextMap {}",
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
index 9caa340acb..f39da32001 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
@@ -18,15 +18,15 @@ package org.apache.logging.log4j.core;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.test.CoreLoggerContexts;
-import org.junit.jupiter.api.BeforeAll;
+import org.apache.logging.log4j.test.junit.TestProperties;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
+import java.lang.ref.Cleaner;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -36,14 +36,9 @@ import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@Tag("functional")
+@TestProperties({"log4j2.enable.direct.encoders = true", "log4j.configurationFile = EventParameterMemoryLeakTest.xml"})
public class EventParameterMemoryLeakTest {
- @BeforeAll
- public static void beforeClass() {
- System.setProperty("log4j2.enable.direct.encoders", "true");
- System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "EventParameterMemoryLeakTest.xml");
- }
-
@Test
@SuppressWarnings("UnusedAssignment") // parameter set to null to allow garbage collection
public void testParametersAreNotLeaked() throws Exception {
@@ -52,7 +47,9 @@ public class EventParameterMemoryLeakTest {
final Logger log = LogManager.getLogger("com.foo.Bar");
CountDownLatch latch = new CountDownLatch(1);
- Object parameter = new ParameterObject("paramValue", latch);
+ final Cleaner cleaner = Cleaner.create();
+ Object parameter = new ParameterObject("paramValue");
+ cleaner.register(parameter, latch::countDown);
log.info("Message with parameter {}", parameter);
log.info(parameter);
log.info("test", new ObjectThrowable(parameter));
@@ -80,22 +77,14 @@ public class EventParameterMemoryLeakTest {
private static final class ParameterObject {
private final String value;
- private final CountDownLatch latch;
- ParameterObject(String value, CountDownLatch latch) {
+ ParameterObject(String value) {
this.value = value;
- this.latch = latch;
}
@Override
public String toString() {
return value;
}
-
- @Override
- protected void finalize() throws Throwable {
- latch.countDown();
- super.finalize();
- }
}
private static final class ObjectThrowable extends RuntimeException {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/Log4j1222Test.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/Log4j1222Test.java
index b22b2d0f1d..36d1bd2f3a 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/Log4j1222Test.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/Log4j1222Test.java
@@ -19,10 +19,11 @@ package org.apache.logging.log4j.core;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.test.TestLogger;
+import org.apache.logging.log4j.test.junit.TestProperties;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Tests logging during shutdown.
@@ -32,9 +33,8 @@ public class Log4j1222Test
{
@Test
- public void homepageRendersSuccessfully()
- {
- System.setProperty("log4j.configurationFile", "log4j2-console.xml");
+ @TestProperties("log4j.configurationFile = log4j2-console.xml")
+ public void homepageRendersSuccessfully() {
Runtime.getRuntime().addShutdownHook(new ShutdownHook());
}
@@ -53,7 +53,7 @@ public class Log4j1222Test
private void trigger() {
Holder.LOGGER.info("Attempt to trigger");
- assertTrue("Logger is of type " + Holder.LOGGER.getClass().getName(), Holder.LOGGER instanceof TestLogger);
+ assertTrue(Holder.LOGGER instanceof TestLogger, "Logger is of type " + Holder.LOGGER.getClass().getName());
if (((TestLogger) Holder.LOGGER).getEntries().size() == 0) {
System.out.println("Logger contains no messages");
}
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/LogbackSubstitution.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/LogbackSubstitution.java
index 570340df07..4b9549fd90 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/LogbackSubstitution.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/LogbackSubstitution.java
@@ -16,32 +16,18 @@
*/
package org.apache.logging.log4j.core;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.apache.logging.log4j.test.junit.TestProperties;
+import org.junit.jupiter.api.Test;
import org.slf4j.LoggerFactory;
/**
*
*/
+@TestProperties("logback.configurationFile = logback-subst.xml")
public class LogbackSubstitution {
- private static final String LOGBACK_CONF = "logback.configurationFile";
- private static final String LOGBACK_CONFIG = "logback-subst.xml";
private final org.slf4j.Logger logger = LoggerFactory.getLogger(LogbackSubstitution.class);
-
-
- @BeforeClass
- public static void setupClass() {
- System.setProperty(LOGBACK_CONF, LOGBACK_CONFIG);
- }
-
- @AfterClass
- public static void cleanupClass() {
- System.clearProperty(LOGBACK_CONF);
- }
-
@Test
public void testSubst() {
logger.debug("Hello, {}", "Log4j {}");
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
index 7582c287c8..85ec10c271 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
@@ -16,9 +16,6 @@
*/
package org.apache.logging.log4j.core.appender;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
@@ -26,15 +23,17 @@ import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.test.junit.TestProperties;
import org.apache.logging.log4j.util.Strings;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -42,20 +41,9 @@ import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.atLeastOnce;
@ExtendWith(MockitoExtension.class)
+@TestProperties("log4j.skipJansi = true")
public class ConsoleAppenderTest {
- private static final String LOG4J_SKIP_JANSI = "log4j.skipJansi";
-
- @AfterAll
- public static void afterClass() {
- System.clearProperty(LOG4J_SKIP_JANSI);
- }
-
- @BeforeAll
- public static void beforeClass() {
- System.setProperty(LOG4J_SKIP_JANSI, "true");
- }
-
ByteArrayOutputStream baos;
@Mock
@@ -63,7 +51,6 @@ public class ConsoleAppenderTest {
@BeforeEach
public void before() {
- System.setProperty(LOG4J_SKIP_JANSI, "true");
baos = new ByteArrayOutputStream();
}
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppenderRolloverTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppenderRolloverTest.java
index 5b12f52f6a..203634b79f 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppenderRolloverTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppenderRolloverTest.java
@@ -18,9 +18,8 @@ package org.apache.logging.log4j.core.appender;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.test.CoreLoggerContexts;
-import org.junit.jupiter.api.BeforeAll;
+import org.apache.logging.log4j.test.junit.TestProperties;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@@ -33,14 +32,9 @@ import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.*;
@Tag("sleepy")
+@TestProperties("log4j.configurationFile = RollingRandomAccessFileAppenderTest.xml")
public class RollingRandomAccessFileAppenderRolloverTest {
- @BeforeAll
- public static void beforeClass() {
- System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY,
- "RollingRandomAccessFileAppenderTest.xml");
- }
-
@Test
@Disabled
public void testRollover() throws Exception {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncAppenderConfigTest_LOG4J2_2032.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncAppenderConfigTest_LOG4J2_2032.java
index f0e1685cb9..ac947f62c5 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncAppenderConfigTest_LOG4J2_2032.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncAppenderConfigTest_LOG4J2_2032.java
@@ -16,35 +16,33 @@
*/
package org.apache.logging.log4j.core.async;
-import static org.junit.Assert.assertTrue;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.test.categories.AsyncLoggers;
import org.apache.logging.log4j.core.test.CoreLoggerContexts;
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.apache.logging.log4j.test.junit.CleanUpFiles;
+import org.apache.logging.log4j.test.junit.TestProperties;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-@Category(AsyncLoggers.class)
-public class AsyncAppenderConfigTest_LOG4J2_2032 {
+import static org.junit.jupiter.api.Assertions.assertTrue;
- @BeforeClass
- public static void beforeClass() {
- System.setProperty("Log4jLogEventFactory", "org.apache.logging.log4j.core.impl.ReusableLogEventFactory");
- System.setProperty("log4j2.messageFactory", "org.apache.logging.log4j.message.ReusableMessageFactory");
- System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "AsyncAppenderConfigTest-LOG4J2-2032.xml");
- }
+@Tag("async")
+@TestProperties({
+ "log4j2.logEventFactory = org.apache.logging.log4j.core.impl.ReusableLogEventFactory",
+ "log4j2.messageFactory = org.apache.logging.log4j.message.ReusableMessageFactory",
+ "log4j2.configurationFile = AsyncAppenderConfigTest-LOG4J2-2032.xml"
+})
+public class AsyncAppenderConfigTest_LOG4J2_2032 {
@Test
+ @CleanUpFiles("target/AsyncAppenderConfigTest-LOG4J2-2032.log")
public void doNotProcessPlaceholdersTwice() throws Exception {
final File file = new File("target", "AsyncAppenderConfigTest-LOG4J2-2032.log");
- assertTrue("Deleted old file before test", !file.exists() || file.delete());
+ assertTrue(!file.exists() || file.delete(), "Deleted old file before test");
final Logger log = LogManager.getLogger("com.foo.Bar");
log.info("Text containing curly braces: {}", "Curly{}");
@@ -53,9 +51,7 @@ public class AsyncAppenderConfigTest_LOG4J2_2032 {
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
final String line1 = reader.readLine();
System.out.println(line1);
- assertTrue("line1 correct", line1.contains(" Text containing curly braces: Curly{} "));
- } finally {
- file.delete();
+ assertTrue(line1.contains(" Text containing curly braces: Curly{} "), "line1 correct");
}
}
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.java
index 70f3402675..5d8d98811b 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.java
@@ -18,9 +18,8 @@ package org.apache.logging.log4j.core.async;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.test.CoreLoggerContexts;
-import org.junit.jupiter.api.BeforeAll;
+import org.apache.logging.log4j.test.junit.TestProperties;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@@ -34,13 +33,9 @@ import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@Tag("async")
+@TestProperties("log4j2.configurationFile = AsyncLoggerConfigTest4.xml")
public class AsyncLoggerConfig4Test {
- @BeforeAll
- public static void beforeClass() {
- System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "AsyncLoggerConfigTest4.xml");
- }
-
@Test
public void testParameters() throws Exception {
final File file = new File("target", "AsyncLoggerConfigTest4.log");
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java
index 71c4df4eec..17cca4bdc5 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java
@@ -16,44 +16,34 @@
*/
package org.apache.logging.log4j.core.async;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.test.categories.AsyncLoggers;
import org.apache.logging.log4j.core.test.CoreLoggerContexts;
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.apache.logging.log4j.test.junit.CleanUpFiles;
+import org.apache.logging.log4j.test.junit.TestProperties;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.nio.file.Files;
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.assertTrue;
-@Category(AsyncLoggers.class)
+@Tag("async")
+@TestProperties("log4j2.configurationFile = AsyncLoggerConfigAutoFlushTest.xml")
public class AsyncLoggerConfigAutoFlushTest {
- @BeforeClass
- public static void beforeClass() {
- System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY,
- "AsyncLoggerConfigAutoFlushTest.xml");
- }
-
@Test
+ @CleanUpFiles("target/AsyncLoggerConfigAutoFlushTest.log")
public void testFlushAtEndOfBatch() throws Exception {
final File file = new File("target", "AsyncLoggerConfigAutoFlushTest.log");
- assertTrue("Deleted old file before test", !file.exists() || file.delete());
+ assertTrue(!file.exists() || file.delete(), "Deleted old file before test");
final Logger log = LogManager.getLogger("com.foo.Bar");
final String msg = "Message flushed with immediate flush=false";
log.info(msg);
CoreLoggerContexts.stopLoggerContext(file); // stop async thread
- final BufferedReader reader = new BufferedReader(new FileReader(file));
- final String line1 = reader.readLine();
- reader.close();
- file.delete();
- assertNotNull("line1", line1);
- assertTrue("line1 correct", line1.contains(msg));
+ final String contents = Files.readString(file.toPath());
+ assertTrue(contents.contains(msg), "line1 correct");
}
}
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java
index 3602a6eb61..4c3c90762b 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java
@@ -18,57 +18,46 @@ package org.apache.logging.log4j.core.async;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
-import org.apache.logging.log4j.core.impl.DefaultLogEventFactory;
import org.apache.logging.log4j.core.test.CoreLoggerContexts;
-import org.apache.logging.log4j.core.test.categories.AsyncLoggers;
import org.apache.logging.log4j.message.AsynchronouslyFormattable;
import org.apache.logging.log4j.message.Message;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.apache.logging.log4j.test.junit.CleanUpFiles;
+import org.apache.logging.log4j.test.junit.TestProperties;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
-import java.io.BufferedReader;
import java.io.File;
-import java.io.FileReader;
+import java.nio.file.Files;
+import java.util.List;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.hasSize;
+import static org.junit.jupiter.api.Assertions.assertTrue;
-@Category(AsyncLoggers.class)
+@Tag("async")
+@TestProperties({
+ "log4j2.configurationFile = AsyncLoggerConfigErrorOnFormat.xml",
+ "log4j2.logEventFactory = org.apache.logging.log4j.core.impl.DefaultLogEventFactory"
+})
public class AsyncLoggerConfigErrorOnFormat {
- @BeforeClass
- public static void beforeClass() {
- System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "AsyncLoggerConfigErrorOnFormat.xml");
- // Log4jLogEvent.toString invokes message.toString
- System.setProperty("log4j2.logEventFactory", DefaultLogEventFactory.class.getName());
- }
-
- @AfterClass
- public static void afterClass() {
- System.clearProperty("log4j2.logEventFactory");
- }
-
@Test
+ @CleanUpFiles("target/AsyncLoggerConfigErrorOnFormat.log")
public void testError() throws Exception {
final File file = new File("target", "AsyncLoggerConfigErrorOnFormat.log");
- assertTrue("Deleted old file before test", !file.exists() || file.delete());
+ assertTrue(!file.exists() || file.delete(), "Deleted old file before test");
final Logger log = LogManager.getLogger("com.foo.Bar");
log.info(new ThrowsErrorOnFormatMessage());
log.info("Second message");
CoreLoggerContexts.stopLoggerContext(file); // stop async thread
- final BufferedReader reader = new BufferedReader(new FileReader(file));
- final String line1 = reader.readLine();
- final String line2 = reader.readLine();
- reader.close();
- file.delete();
+ final List<String> lines = Files.readAllLines(file.toPath());
+ final String line1 = lines.get(0);
assertThat(line1, containsString("Second message"));
- assertNull("Expected only one line", line2);
+ assertThat(lines, hasSize(1));
}
@AsynchronouslyFormattable // Shouldn't call getFormattedMessage early
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java
index 3e10ee30e6..5f4773b2b3 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.core.time.internal.CoarseCachedClock;
import org.apache.logging.log4j.core.time.internal.SystemClock;
import org.apache.logging.log4j.plugins.di.DI;
import org.apache.logging.log4j.plugins.di.Injector;
-import org.junit.jupiter.api.BeforeEach;
+import org.apache.logging.log4j.test.junit.TestProperties;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.OS;
@@ -33,56 +33,50 @@ public class ClockFactoryTest {
private final Injector injector = DI.createInjector();
- @BeforeEach
- public void setUp() throws Exception {
- System.clearProperty(ClockFactory.PROPERTY_NAME);
- }
-
@Test
public void testDefaultIsSystemClock() {
- System.clearProperty(ClockFactory.PROPERTY_NAME);
injector.init();
assertThat(injector.getInstance(Clock.class)).isInstanceOf(SystemClock.class);
}
@Test
+ @TestProperties("log4j.Clock = SystemClock")
public void testSpecifySystemClockShort() {
- System.setProperty(ClockFactory.PROPERTY_NAME, "SystemClock");
injector.init();
assertThat(injector.getInstance(Clock.class)).isInstanceOf(SystemClock.class);
}
@Test
+ @TestProperties("log4j.Clock = org.apache.logging.log4j.core.time.internal.SystemClock")
public void testSpecifySystemClockLong() {
- System.setProperty(ClockFactory.PROPERTY_NAME, SystemClock.class.getName());
injector.init();
assertThat(injector.getInstance(Clock.class)).isInstanceOf(SystemClock.class);
}
@Test
+ @TestProperties("log4j.Clock = CachedClock")
public void testSpecifyCachedClockShort() {
- System.setProperty(ClockFactory.PROPERTY_NAME, "CachedClock");
injector.init();
assertThat(injector.getInstance(Clock.class)).isInstanceOf(CachedClock.class);
}
@Test
+ @TestProperties("log4j.Clock = org.apache.logging.log4j.core.time.internal.CachedClock")
public void testSpecifyCachedClockLong() {
- System.setProperty(ClockFactory.PROPERTY_NAME, CachedClock.class.getName());
injector.init();
assertThat(injector.getInstance(Clock.class)).isInstanceOf(CachedClock.class);
}
@Test
+ @TestProperties("log4j.Clock = CoarseCachedClock")
public void testSpecifyCoarseCachedClockShort() {
- System.setProperty(ClockFactory.PROPERTY_NAME, "CoarseCachedClock");
injector.init();
assertThat(injector.getInstance(Clock.class)).isInstanceOf(CoarseCachedClock.class);
}
@Test
+ @TestProperties("log4j.Clock = org.apache.logging.log4j.core.time.internal.CoarseCachedClock")
public void testSpecifyCoarseCachedClockLong() {
- System.setProperty(ClockFactory.PROPERTY_NAME, CoarseCachedClock.class.getName());
injector.init();
assertThat(injector.getInstance(Clock.class)).isInstanceOf(CoarseCachedClock.class);
}
@@ -95,8 +89,8 @@ public class ClockFactoryTest {
}
@Test
+ @TestProperties("log4j.Clock = org.apache.logging.log4j.core.time.ClockFactoryTest$MyClock")
public void testCustomClock() {
- System.setProperty(ClockFactory.PROPERTY_NAME, MyClock.class.getName());
injector.init();
assertThat(injector.getInstance(Clock.class)).isInstanceOf(MyClock.class);
}