This is an automated email from the ASF dual-hosted git repository. pkarwasz pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 6e20963d91d3f7fb3efdda1b54de783bff49c88b Author: Piotr P. Karwasz <piotr.git...@karwasz.org> AuthorDate: Mon Jun 20 21:49:57 2022 +0200 Marks tests that reinitialize the ThreadContextFactory A JUnit5 extension is provided to restore the default ThreadContextFactory after the test finishes. --- .../{test => }/ThreadContextUtilityClass.java | 16 ++++++++++---- ...ntextMap.java => InitializesThreadContext.java} | 21 +++++++++--------- .../log4j/test/junit/ThreadContextInitializer.java | 25 ++++++++++++++++++++++ .../test/junit/ThreadContextMapExtension.java | 7 +++--- .../log4j/test/junit/UsingThreadContextMap.java | 3 +++ .../logging/log4j/NoopThreadContextTest.java | 13 +++++------ .../log4j/ThreadContextInheritanceTest.java | 10 ++++++--- .../logging/log4j/test/ThreadContextTest.java | 1 + 8 files changed, 66 insertions(+), 30 deletions(-) diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/ThreadContextUtilityClass.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/ThreadContextUtilityClass.java similarity index 90% rename from log4j-api-test/src/main/java/org/apache/logging/log4j/test/ThreadContextUtilityClass.java rename to log4j-api-test/src/main/java/org/apache/logging/log4j/ThreadContextUtilityClass.java index 6db64a048f..92dc394309 100644 --- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/ThreadContextUtilityClass.java +++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/ThreadContextUtilityClass.java @@ -14,14 +14,18 @@ * See the license for the specific language governing permissions and * limitations under the license. */ -package org.apache.logging.log4j.test; +package org.apache.logging.log4j; -import org.apache.logging.log4j.ThreadContext; -import org.apache.logging.log4j.util.Timer; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Map; -import static org.junit.jupiter.api.Assertions.*; +import org.apache.logging.log4j.util.Timer; public class ThreadContextUtilityClass { @@ -112,4 +116,8 @@ public class ThreadContextUtilityClass { ThreadContext.put("testKey", "testValue"); assertEquals("testValue", ThreadContext.get("testKey")); } + + public static void reset() { + ThreadContext.init(); + } } diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/UsingThreadContextMap.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/InitializesThreadContext.java similarity index 72% copy from log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/UsingThreadContextMap.java copy to log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/InitializesThreadContext.java index ab1bddd7cf..493d6b9bf5 100644 --- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/UsingThreadContextMap.java +++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/InitializesThreadContext.java @@ -17,9 +17,6 @@ package org.apache.logging.log4j.test.junit; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.ReadsSystemProperty; - import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; @@ -27,17 +24,19 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.apache.logging.log4j.ThreadContext; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.parallel.ResourceAccessMode; +import org.junit.jupiter.api.parallel.ResourceLock; + /** - * Marks a test class as using {@link org.apache.logging.log4j.spi.ThreadContextMap} APIs. This will automatically clear and - * restore the thread context map (MDC) for each test invocation. - * - * @since 2.14.0 + * Marks a test class that initializes the {@link ThreadContext} class; */ @Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) +@Target(ElementType.TYPE) @Documented @Inherited -@ExtendWith(ThreadContextMapExtension.class) -@ReadsSystemProperty -public @interface UsingThreadContextMap { +@ExtendWith(ThreadContextInitializer.class) +@ResourceLock(value = Resources.THREAD_CONTEXT, mode = ResourceAccessMode.READ_WRITE) +public @interface InitializesThreadContext { } diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ThreadContextInitializer.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ThreadContextInitializer.java new file mode 100644 index 0000000000..ed246d4386 --- /dev/null +++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ThreadContextInitializer.java @@ -0,0 +1,25 @@ +package org.apache.logging.log4j.test.junit; + +import org.apache.logging.log4j.ThreadContext; +import org.apache.logging.log4j.ThreadContextUtilityClass; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ExtensionContext.Store.CloseableResource; + +class ThreadContextInitializer implements BeforeAllCallback { + + @Override + public void beforeAll(ExtensionContext context) throws Exception { + ThreadContextUtilityClass.reset(); + // We use `CloseableResource` instead of `afterAll` to reset the ThreadContextFactory + // *after* the `@SetSystemProperty` extension has restored the properties + ExtensionContextAnchor.setAttribute(ThreadContext.class, new CloseableResource() { + @Override + public void close() throws Throwable { + ThreadContextUtilityClass.reset(); + } + + }, context); + } + +} diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ThreadContextMapExtension.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ThreadContextMapExtension.java index 35089acf02..cb68eb295d 100644 --- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ThreadContextMapExtension.java +++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ThreadContextMapExtension.java @@ -17,12 +17,11 @@ package org.apache.logging.log4j.test.junit; +import java.util.Map; + import org.apache.logging.log4j.ThreadContext; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.api.extension.ExtensionContext.Namespace; - -import java.util.Map; class ThreadContextMapExtension implements BeforeEachCallback { private static class ThreadContextMapStore implements ExtensionContext.Store.CloseableResource { @@ -42,7 +41,7 @@ class ThreadContextMapExtension implements BeforeEachCallback { @Override public void beforeEach(final ExtensionContext context) throws Exception { - context.getStore(Namespace.create(ThreadContext.class, context.getRequiredTestClass(), context.getRequiredTestInstance())) + context.getStore(ExtensionContextAnchor.LOG4J2_NAMESPACE) .getOrComputeIfAbsent(ThreadContextMapStore.class); } } diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/UsingThreadContextMap.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/UsingThreadContextMap.java index ab1bddd7cf..41ba316e9a 100644 --- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/UsingThreadContextMap.java +++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/UsingThreadContextMap.java @@ -18,6 +18,8 @@ package org.apache.logging.log4j.test.junit; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.parallel.ResourceAccessMode; +import org.junit.jupiter.api.parallel.ResourceLock; import org.junitpioneer.jupiter.ReadsSystemProperty; import java.lang.annotation.Documented; @@ -39,5 +41,6 @@ import java.lang.annotation.Target; @Inherited @ExtendWith(ThreadContextMapExtension.class) @ReadsSystemProperty +@ResourceLock(value = Resources.THREAD_CONTEXT, mode = ResourceAccessMode.READ) public @interface UsingThreadContextMap { } 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 7f4455cbd5..d3aeaad755 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,24 +16,21 @@ */ package org.apache.logging.log4j; +import static org.junit.jupiter.api.Assertions.assertNull; + +import org.apache.logging.log4j.test.junit.InitializesThreadContext; import org.apache.logging.log4j.test.junit.UsingThreadContextMap; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junitpioneer.jupiter.SetSystemProperty; -import static org.junit.jupiter.api.Assertions.assertNull; - /** * Tests {@link ThreadContext}. */ -@UsingThreadContextMap @SetSystemProperty(key = "disableThreadContext", value = "true") @SetSystemProperty(key = "disableThreadContextMap", value = "true") +@InitializesThreadContext +@UsingThreadContextMap public class NoopThreadContextTest { - @BeforeEach - void setUp() { - ThreadContext.init(); - } @Test public void testNoop() { 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 5fcd84f223..ba93cafe89 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,20 +16,24 @@ */ package org.apache.logging.log4j; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.apache.logging.log4j.spi.DefaultThreadContextMap; -import org.apache.logging.log4j.test.ThreadContextUtilityClass; +import org.apache.logging.log4j.test.junit.InitializesThreadContext; import org.apache.logging.log4j.test.junit.UsingThreadContextMap; import org.apache.logging.log4j.test.junit.UsingThreadContextStack; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junitpioneer.jupiter.SetSystemProperty; -import static org.junit.jupiter.api.Assertions.*; - /** * Tests {@link ThreadContext}. */ @SetSystemProperty(key = DefaultThreadContextMap.INHERITABLE_MAP, value = "true") +@InitializesThreadContext public class ThreadContextInheritanceTest { @Test diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/ThreadContextTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/test/ThreadContextTest.java similarity index 99% rename from log4j-api-test/src/main/java/org/apache/logging/log4j/test/ThreadContextTest.java rename to log4j-api-test/src/test/java/org/apache/logging/log4j/test/ThreadContextTest.java index 75bb691ba4..56c7241c6f 100644 --- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/ThreadContextTest.java +++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/test/ThreadContextTest.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.Map; import org.apache.logging.log4j.ThreadContext; +import org.apache.logging.log4j.ThreadContextUtilityClass; import org.apache.logging.log4j.test.junit.UsingAnyThreadContext; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test;