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 2020/09/07 19:14:20 UTC

[logging-log4j2] branch master updated (4054886 -> d017766)

This is an automated email from the ASF dual-hosted git repository.

mattsicker pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git.


    from 4054886  Migrate some parameterized tests to JUnit 5
     new 018f72a  Fix Windows file removal errors
     new 1fb8aae  Support shutdown timeout in JUnit 5 extension
     new d017766  Migrate more tests to JUnit 5

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../core/appender/AsyncAppenderNoLocationTest.java |  85 -----------
 .../appender/AsyncAppenderQueueFullPolicyTest.java |  44 +++---
 .../appender/AsyncAppenderShutdownTimeoutTest.java |  42 ------
 .../log4j/core/appender/AsyncAppenderTest.java     | 167 ++++++++++++---------
 .../core/appender/ConsoleAppenderBuilderTest.java  |  13 +-
 .../log4j/core/appender/ConsoleAppenderTest.java   |  40 +++--
 .../log4j/core/appender/FailoverAppenderTest.java  |  60 ++++----
 .../core/appender/FileAppenderBuilderTest.java     |   7 +-
 .../core/appender/FileAppenderPermissionsTest.java | 136 ++++++++---------
 .../FileAppenderPermissionsXmlConfigTest.java      |  66 --------
 .../log4j/core/appender/FileAppenderTest.java      |  13 +-
 .../core/config/ConfigurationFactoryTest.java      |  18 ++-
 .../logging/log4j/junit/LoggerContextResolver.java |  95 ++++++++----
 .../logging/log4j/junit/LoggerContextRule.java     |   3 +
 .../logging/log4j/junit/LoggerContextSource.java   |  11 ++
 15 files changed, 324 insertions(+), 476 deletions(-)
 delete mode 100644 log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderNoLocationTest.java
 delete mode 100644 log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderShutdownTimeoutTest.java
 delete mode 100644 log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsXmlConfigTest.java


[logging-log4j2] 03/03: Migrate more tests to JUnit 5

Posted by ma...@apache.org.
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 d0177664a386800ed45ac3bd35345a474d66e1ea
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Mon Sep 7 14:13:48 2020 -0500

    Migrate more tests to JUnit 5
    
    Signed-off-by: Matt Sicker <bo...@gmail.com>
---
 .../core/appender/AsyncAppenderNoLocationTest.java |  85 -----------
 .../appender/AsyncAppenderQueueFullPolicyTest.java |  44 +++---
 .../appender/AsyncAppenderShutdownTimeoutTest.java |  42 ------
 .../log4j/core/appender/AsyncAppenderTest.java     | 167 ++++++++++++---------
 .../core/appender/ConsoleAppenderBuilderTest.java  |  13 +-
 .../log4j/core/appender/ConsoleAppenderTest.java   |  40 +++--
 .../log4j/core/appender/FailoverAppenderTest.java  |  60 ++++----
 .../core/appender/FileAppenderBuilderTest.java     |   7 +-
 .../core/appender/FileAppenderPermissionsTest.java | 136 ++++++++---------
 .../FileAppenderPermissionsXmlConfigTest.java      |  66 --------
 .../log4j/core/appender/FileAppenderTest.java      |  13 +-
 11 files changed, 233 insertions(+), 440 deletions(-)

diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderNoLocationTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderNoLocationTest.java
deleted file mode 100644
index fdc95e9..0000000
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderNoLocationTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.core.appender;
-
-import java.util.List;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.apache.logging.log4j.test.appender.ListAppender;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class AsyncAppenderNoLocationTest {
-    private ListAppender app;
-
-    @ClassRule
-    public static LoggerContextRule init = null;
-
-            static {
-                try {
-                    init = new LoggerContextRule("log4j-asynch-no-location.xml");
-                } catch (final Exception ex) {
-                    ex.printStackTrace();
-                }
-            }
-
-    @Before
-    public void setUp() throws Exception {
-                try {
-                    this.app = (ListAppender) init.getAppender("List");
-                    assertNotNull("No List appender found", app);
-                } catch (final Exception ex) {
-                    System.out.println("init = " + init == null ? "null" : init);
-
-                }
-
-    }
-
-    @After
-    public void after() {
-        if (app != null) {
-            app.clear();
-        }
-    }
-
-    @Test
-    public void testNoLocation() throws Exception {
-        final Logger logger = LogManager.getLogger(AsyncAppender.class);
-        logger.error("This is a test");
-        logger.warn("Hello world!");
-        Thread.sleep(100);
-        System.out.println("app = " + app == null ? "null" : app);
-        final List<String> list = app.getMessages();
-        assertNotNull("No events generated", list);
-        assertEquals("Incorrect number of events. Expected 2, got " + list.size(), list.size(), 2);
-        String msg = list.get(0);
-        String expected = "?  This is a test";
-        assertEquals("Expected " + expected + ", Actual " + msg, expected, msg);
-        msg = list.get(1);
-        expected = "?  Hello world!";
-        assertEquals("Expected " + expected + ", Actual " + msg, expected, msg);
-    }
-}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderQueueFullPolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderQueueFullPolicyTest.java
index bdd2aa6..ef7a35f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderQueueFullPolicyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderQueueFullPolicyTest.java
@@ -16,22 +16,21 @@
  */
 package org.apache.logging.log4j.core.appender;
 
-import java.lang.reflect.Field;
-import java.util.concurrent.atomic.AtomicLong;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.async.DefaultAsyncQueueFullPolicy;
 import org.apache.logging.log4j.core.async.EventRoute;
-import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.apache.logging.log4j.junit.Named;
 import org.apache.logging.log4j.test.appender.BlockingAppender;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+
+import java.lang.reflect.Field;
+import java.util.concurrent.atomic.AtomicLong;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * Tests the AsyncAppender (LOG4J2-1080) event routing logic:
@@ -43,21 +42,18 @@ import static org.junit.Assert.*;
  *         else queue.add(event) // blocking call
  * </pre>
  */
+@LoggerContextSource("log4j-asynch-queue-full.xml")
 public class AsyncAppenderQueueFullPolicyTest {
-    private static final String CONFIG = "log4j-asynch-queue-full.xml";
-
-    @ClassRule
-    public static LoggerContextRule context = new LoggerContextRule(CONFIG);
-
-    private BlockingAppender blockingAppender;
-    private AsyncAppender asyncAppender;
-    private CountingAsyncQueueFullPolicy policy;
 
-    @Before
-    public void before() throws Exception {
-        blockingAppender = context.getAppender("Block", BlockingAppender.class);
-        asyncAppender = context.getAppender("Async", AsyncAppender.class);
+    private final BlockingAppender blockingAppender;
+    private final AsyncAppender asyncAppender;
+    private final CountingAsyncQueueFullPolicy policy;
 
+    public AsyncAppenderQueueFullPolicyTest(
+            @Named("Block") final BlockingAppender blockingAppender, @Named("Async") final AsyncAppender asyncAppender)
+            throws Exception {
+        this.blockingAppender = blockingAppender;
+        this.asyncAppender = asyncAppender;
         final Field field = AsyncAppender.class.getDeclaredField("asyncQueueFullPolicy");
         field.setAccessible(true);
         policy = new CountingAsyncQueueFullPolicy();
@@ -65,7 +61,7 @@ public class AsyncAppenderQueueFullPolicyTest {
         policy.queueFull.set(0L);
     }
 
-    @After
+    @AfterEach
     public void after() {
         blockingAppender.running = false;
         policy.queueFull.set(0L);
@@ -84,8 +80,8 @@ public class AsyncAppenderQueueFullPolicyTest {
             Thread.yield(); // wait until background thread takes one element off the queue
         }
         logger.info("event 5 - now the queue is full");
-        assertEquals("queue remaining capacity", 0, asyncAppender.getQueueRemainingCapacity());
-        assertEquals("EventRouter invocations", 0, policy.queueFull.get());
+        assertEquals(0, asyncAppender.getQueueRemainingCapacity(), "queue remaining capacity");
+        assertEquals(0, policy.queueFull.get(), "EventRouter invocations");
 
         final Thread release = new Thread("AsyncAppenderReleaser") {
             @Override
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderShutdownTimeoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderShutdownTimeoutTest.java
deleted file mode 100644
index fb37f09..0000000
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderShutdownTimeoutTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.core.appender;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-/**
- *
- */
-public class AsyncAppenderShutdownTimeoutTest {
-
-    @ClassRule
-    public static LoggerContextRule init = new LoggerContextRule("log4j-asynch-shutdownTimeout.xml");
-
-    @Test(timeout = 5000)
-    public void shutdownTest() throws Exception {
-        final LoggerContext ctx = (LoggerContext)LogManager.getContext(false);
-        final Logger logger = ctx.getLogger("Logger");
-        logger.info("This is a test");
-        ctx.stop();
-    }
-
-}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderTest.java
index b2de774..d0f3f0d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderTest.java
@@ -14,100 +14,121 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.core.appender;
 
-import java.util.List;
-import java.util.concurrent.TimeUnit;
+package org.apache.logging.log4j.core.appender;
 
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LoggingException;
-import org.apache.logging.log4j.categories.Appenders;
-import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.apache.logging.log4j.junit.Named;
+import org.apache.logging.log4j.spi.ExtendedLogger;
 import org.apache.logging.log4j.test.appender.ListAppender;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
 
-import static org.junit.Assert.*;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
 
-/**
- *
- */
-@RunWith(Parameterized.class)
-@Category({Appenders.AsyncConversant.class, Appenders.AsyncJcTools.class})
-public class AsyncAppenderTest {
+import static org.junit.jupiter.api.Assertions.*;
 
-    private static final long TIMEOUT_MILLIS = 2000;
+class AsyncAppenderTest {
 
-    @Parameterized.Parameters(name = "{0}")
-    public static Object[] data() {
-        return new String[]{
-            // default async config uses array blocking queue
-            "log4j-asynch.xml",
-            // override default blocking queue implementations
-            "BlockingQueueFactory-ArrayBlockingQueue.xml",
-            "BlockingQueueFactory-DisruptorBlockingQueue.xml",
-            "BlockingQueueFactory-JCToolsBlockingQueue.xml",
-            "BlockingQueueFactory-LinkedTransferQueue.xml"
-        };
+    static void rewriteTest(final LoggerContext context) throws InterruptedException {
+        final ExtendedLogger logger = context.getLogger(AsyncAppender.class);
+        logger.error("This is a test");
+        logger.warn("Hello world!");
+        final ListAppender appender = context.getConfiguration().getAppender("List");
+        final List<String> messages;
+        try {
+            messages = appender.getMessages(2, 2, TimeUnit.SECONDS);
+        } finally {
+            appender.clear();
+        }
+        assertNotNull(messages);
+        assertEquals(2, messages.size());
+        final String messagePrefix = AsyncAppenderTest.class.getName() + " rewriteTest ";
+        assertEquals(messagePrefix + "This is a test", messages.get(0));
+        assertEquals(messagePrefix + "Hello world!", messages.get(1));
     }
 
-    public AsyncAppenderTest(final String configFileName) {
-        context = new LoggerContextRule(configFileName);
+    static void exceptionTest(final LoggerContext context) throws InterruptedException {
+        final ExtendedLogger logger = context.getLogger(AsyncAppender.class);
+        final Exception parent = new IllegalStateException("Test");
+        final Throwable child = new LoggingException("This is a test", parent);
+        logger.error("This is a test", child);
+        final ListAppender appender = context.getConfiguration().getAppender("List");
+        final List<String> messages;
+        try {
+            messages = appender.getMessages(1, 2, TimeUnit.SECONDS);
+        } finally {
+            appender.clear();
+        }
+        assertNotNull(messages);
+        assertEquals(1, messages.size());
+        assertTrue(messages.get(0).contains(parent.getClass().getName()));
     }
 
-    @Rule
-    public LoggerContextRule context;
+    @Test
+    @LoggerContextSource("log4j-asynch.xml")
+    void defaultAsyncAppenderConfig(final LoggerContext context) throws InterruptedException {
+        rewriteTest(context);
+        exceptionTest(context);
+    }
 
-    private ListAppender listAppender;
+    @Test
+    @LoggerContextSource("BlockingQueueFactory-ArrayBlockingQueue.xml")
+    void arrayBlockingQueue(final LoggerContext context) throws InterruptedException {
+        rewriteTest(context);
+        exceptionTest(context);
+    }
 
-    @Before
-    public void before() throws Exception {
-        listAppender = context.getListAppender("List");
+    @Test
+    @Tag("disruptor")
+    @LoggerContextSource("BlockingQueueFactory-DisruptorBlockingQueue.xml")
+    void disruptorBlockingQueue(final LoggerContext context) throws InterruptedException {
+        rewriteTest(context);
+        exceptionTest(context);
     }
 
-    @After
-    public void after() {
-        listAppender.clear();
+    @Test
+    @Tag("jctools")
+    @LoggerContextSource("BlockingQueueFactory-JCToolsBlockingQueue.xml")
+    void jcToolsBlockingQueue(final LoggerContext context) throws InterruptedException {
+        rewriteTest(context);
+        exceptionTest(context);
     }
 
     @Test
-    public void rewriteTest() throws Exception {
-        final Logger logger = LogManager.getLogger(AsyncAppender.class);
-        logger.error("This is a test");
-        logger.warn("Hello world!");
-        final long timeoutMillis = TIMEOUT_MILLIS;
-        final TimeUnit timeUnit = TimeUnit.MILLISECONDS;
-        final List<String> list = listAppender.getMessages(2, timeoutMillis, timeUnit);
-        assertNotNull("No events generated", list);
-        assertTrue("Incorrect number of events after " + timeoutMillis + " " + timeUnit + ". Expected 2, got "
-                + list.size(), list.size() == 2);
-        String msg = list.get(0);
-        String expected = AsyncAppenderTest.class.getName() + " rewriteTest This is a test";
-        assertTrue("Expected " + expected + ", Actual " + msg, expected.equals(msg));
-        msg = list.get(1);
-        expected = AsyncAppenderTest.class.getName() + " rewriteTest Hello world!";
-        assertTrue("Expected " + expected + ", Actual " + msg, expected.equals(msg));
+    @LoggerContextSource("BlockingQueueFactory-LinkedTransferQueue.xml")
+    void linkedTransferQueue(final LoggerContext context) throws InterruptedException {
+        rewriteTest(context);
+        exceptionTest(context);
     }
 
     @Test
-    public void testException() throws Exception {
-        final Logger logger = LogManager.getLogger(AsyncAppender.class);
-        final Exception parent = new IllegalStateException("Test");
-        final Throwable child = new LoggingException("This is a test", parent);
-        logger.error("This is a test", child);
-        final long timeoutMillis = TIMEOUT_MILLIS;
-        final TimeUnit timeUnit = TimeUnit.MILLISECONDS;
-        final List<String> list = listAppender.getMessages(1, timeoutMillis, timeUnit);
-        assertNotNull("No events generated", list);
-        assertTrue("Incorrect number of events after " + timeoutMillis + " " + timeUnit + ". Expected 1, got "
-                + list.size(), list.size() == 1);
-        final String msg = list.get(0);
-        assertTrue("No parent exception", msg.contains("java.lang.IllegalStateException"));
+    @Timeout(5)
+    @LoggerContextSource("log4j-asynch-shutdownTimeout.xml")
+    void shutdownTimeout(final LoggerContext context) {
+        context.getLogger("Logger").info("This is a test");
+        context.stop();
+    }
+
+    @Test
+    @LoggerContextSource("log4j-asynch-no-location.xml")
+    void noLocationInformation(final LoggerContext context, @Named("List") final ListAppender appender) throws InterruptedException {
+        final ExtendedLogger logger = context.getLogger(getClass());
+        logger.error("This is a test");
+        logger.warn("Hello world!");
+        final List<String> messages;
+        try {
+            messages = appender.getMessages(2, 2, TimeUnit.SECONDS);
+        } finally {
+            appender.clear();
+        }
+        assertNotNull(messages);
+        assertEquals(2, messages.size());
+        assertEquals("?  This is a test", messages.get(0));
+        assertEquals("?  Hello world!", messages.get(1));
     }
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderBuilderTest.java
index d0ff679..44dfb9d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderBuilderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderBuilderTest.java
@@ -20,8 +20,9 @@ import java.nio.charset.Charset;
 
 import org.apache.logging.log4j.core.ErrorHandler;
 import org.apache.logging.log4j.core.layout.PatternLayout;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 public class ConsoleAppenderBuilderTest {
 
@@ -30,7 +31,7 @@ public class ConsoleAppenderBuilderTest {
      */
     @Test
     public void testDefaultImmediateFlush() {
-        Assert.assertTrue(ConsoleAppender.newBuilder().isImmediateFlush());
+        assertTrue(ConsoleAppender.newBuilder().isImmediateFlush());
     }
 
     /**
@@ -44,7 +45,7 @@ public class ConsoleAppenderBuilderTest {
         final PatternLayout layout = (PatternLayout) appender.getLayout();
         final String charsetName = System.getProperty("sun.stdout.encoding");
         final String expectedName = charsetName != null ? charsetName : Charset.defaultCharset().name();
-        Assert.assertEquals(expectedName, layout.getCharset().name());
+        assertEquals(expectedName, layout.getCharset().name());
     }
 
     /**
@@ -54,10 +55,10 @@ public class ConsoleAppenderBuilderTest {
     public void testSetNullErrorHandlerIsNotAllowed() {
         final ConsoleAppender appender = ConsoleAppender.newBuilder().setName("test").build();
         ErrorHandler handler = appender.getHandler();
-        Assert.assertNotNull(handler);
+        assertNotNull(handler);
         // This could likely be allowed to throw, but we're just testing that
         // setting null does not actually set a null handler.
         appender.setHandler(null);
-        Assert.assertSame(handler, appender.getHandler());
+        assertSame(handler, appender.getHandler());
     }
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
index f75f903..7582c28 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
@@ -27,35 +27,31 @@ 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.util.Strings;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+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.runners.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.BDDMockito.then;
 import static org.mockito.Mockito.atLeastOnce;
 
-/**
- *
- */
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 public class ConsoleAppenderTest {
 
     private static final String LOG4J_SKIP_JANSI = "log4j.skipJansi";
 
-    @AfterClass
+    @AfterAll
     public static void afterClass() {
         System.clearProperty(LOG4J_SKIP_JANSI);
     }
 
-    @BeforeClass
+    @BeforeAll
     public static void beforeClass() {
         System.setProperty(LOG4J_SKIP_JANSI, "true");
     }
@@ -65,7 +61,7 @@ public class ConsoleAppenderTest {
     @Mock
     PrintStream psMock;
 
-    @Before
+    @BeforeEach
     public void before() {
         System.setProperty(LOG4J_SKIP_JANSI, "true");
         baos = new ByteArrayOutputStream();
@@ -95,7 +91,7 @@ public class ConsoleAppenderTest {
             final ConsoleAppender app = ConsoleAppender.newBuilder().setLayout(layout).setTarget(targetName)
                     .setName("Console").setIgnoreExceptions(false).build();
             app.start();
-            assertTrue("Appender did not start", app.isStarted());
+            assertTrue(app.isStarted(), "Appender did not start");
 
             final LogEvent event = Log4jLogEvent.newBuilder() //
                     .setLoggerName("TestLogger") //
@@ -106,7 +102,7 @@ public class ConsoleAppenderTest {
             app.append(event);
 
             app.stop();
-            assertFalse("Appender did not stop", app.isStarted());
+            assertFalse(app.isStarted(), "Appender did not stop");
         } finally {
             systemSetter.systemSet(ps);
         }
@@ -127,7 +123,7 @@ public class ConsoleAppenderTest {
     private void testFollowSystemPrintStream(final PrintStream ps, final Target target, final SystemSetter systemSetter) {
         final ConsoleAppender app = ConsoleAppender.newBuilder().setTarget(target).setFollow(true)
                 .setIgnoreExceptions(false).setName("test").build();
-        Assert.assertEquals(target, app.getTarget());
+        assertEquals(target, app.getTarget());
         app.start();
         try {
             final LogEvent event = Log4jLogEvent.newBuilder() //
@@ -137,7 +133,7 @@ public class ConsoleAppenderTest {
                     .setMessage(new SimpleMessage("Test")) //
                     .build();
 
-            assertTrue("Appender did not start", app.isStarted());
+            assertTrue(app.isStarted(), "Appender did not start");
             systemSetter.systemSet(new PrintStream(baos));
             try {
                 app.append(event);
@@ -145,12 +141,12 @@ public class ConsoleAppenderTest {
                 systemSetter.systemSet(ps);
             }
             final String msg = baos.toString();
-            assertNotNull("No message", msg);
-            assertTrue("Incorrect message: \"" + msg + "\"", msg.endsWith("Test" + Strings.LINE_SEPARATOR));
+            assertNotNull(msg, "No message");
+            assertTrue(msg.endsWith("Test" + Strings.LINE_SEPARATOR), "Incorrect message: \"" + msg + "\"");
         } finally {
             app.stop();
         }
-        assertFalse("Appender did not stop", app.isStarted());
+        assertFalse(app.isStarted(), "Appender did not stop");
     }
 
     @Test
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java
index 4a649e4..54f8dbf 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java
@@ -16,45 +16,39 @@
  */
 package org.apache.logging.log4j.core.appender;
 
-import java.util.List;
-
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.apache.logging.log4j.junit.Named;
 import org.apache.logging.log4j.test.appender.FailOnceAppender;
 import org.apache.logging.log4j.test.appender.ListAppender;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import java.util.List;
 
-/**
- *
- */
-public class FailoverAppenderTest {
-    private ListAppender app;
-    private FailOnceAppender foApp;
-    private Logger logger;
-    private Logger onceLogger;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-    @ClassRule
-    public static LoggerContextRule init = new LoggerContextRule("log4j-failover.xml");
+@LoggerContextSource("log4j-failover.xml")
+public class FailoverAppenderTest {
+    private final ListAppender app;
+    private final FailOnceAppender foApp;
+    private final Logger logger;
+    private final Logger onceLogger;
 
-    @Before
-    public void setUp() throws Exception {
-        app = init.getListAppender("List");
-        foApp = (FailOnceAppender) init.getAppender("Once");
-        logger = init.getLogger("LoggerTest");
-        onceLogger = init.getLogger("Once");
+    public FailoverAppenderTest(
+            final LoggerContext context, @Named("List") final ListAppender app, @Named("Once") final FailOnceAppender foApp) {
+        this.app = app;
+        this.foApp = foApp;
+        logger = context.getLogger("LoggerTest");
+        onceLogger = context.getLogger("Once");
     }
 
-    @After
+    @AfterEach
     public void tearDown() throws Exception {
-        if (app != null) {
-            app.clear();
-        }
+        app.clear();
     }
 
     @Test
@@ -62,12 +56,12 @@ public class FailoverAppenderTest {
         logger.error("This is a test");
         List<LogEvent> events = app.getEvents();
         assertNotNull(events);
-        assertEquals("Incorrect number of events. Should be 1 is " + events.size(), events.size(), 1);
+        assertEquals(events.size(), 1, "Incorrect number of events. Should be 1 is " + events.size());
         app.clear();
         logger.error("This is a test");
         events = app.getEvents();
         assertNotNull(events);
-        assertEquals("Incorrect number of events. Should be 1 is " + events.size(), events.size(), 1);
+        assertEquals(events.size(), 1, "Incorrect number of events. Should be 1 is " + events.size());
     }
 
     @Test
@@ -76,14 +70,14 @@ public class FailoverAppenderTest {
         onceLogger.error("Fail again");
         List<LogEvent> events = app.getEvents();
         assertNotNull(events);
-        assertEquals("Incorrect number of events. Should be 2 is " + events.size(), events.size(), 2);
+        assertEquals(events.size(), 2, "Incorrect number of events. Should be 2 is " + events.size());
         app.clear();
         Thread.sleep(1100);
         onceLogger.error("Fail after recovery interval");
         onceLogger.error("Second log message");
         events = app.getEvents();
-        assertEquals("Did not recover", events.size(), 0);
+        assertEquals(events.size(), 0, "Did not recover");
         events = foApp.getEvents();
-        assertEquals("Incorrect number of events in primary appender", events.size(), 2);
+        assertEquals(events.size(), 2, "Incorrect number of events in primary appender");
     }
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderBuilderTest.java
index 8305a07..f27fb8f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderBuilderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderBuilderTest.java
@@ -16,8 +16,9 @@
  */
 package org.apache.logging.log4j.core.appender;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class FileAppenderBuilderTest {
 
@@ -26,6 +27,6 @@ public class FileAppenderBuilderTest {
      */
     @Test
     public void testDefaultImmediateFlush() {
-        Assert.assertTrue(FileAppender.newBuilder().isImmediateFlush());
+        assertTrue(FileAppender.newBuilder().isImmediateFlush());
     }
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java
index 396be82..c287e7e 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java
@@ -16,76 +16,54 @@
  */
 package org.apache.logging.log4j.core.appender;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.PosixFileAttributes;
-import java.nio.file.attribute.PosixFilePermissions;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.util.FileUtils;
+import org.apache.logging.log4j.junit.CleanUpDirectories;
+import org.apache.logging.log4j.junit.LoggerContextSource;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.junit.Assert;
-import org.junit.Assume;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
+import org.apache.logging.log4j.spi.ExtendedLogger;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.PosixFileAttributes;
+import java.nio.file.attribute.PosixFilePermissions;
+import java.util.stream.Stream;
+
+import static org.apache.logging.log4j.util.Unbox.box;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
 
 /**
  * Tests {@link FileAppender}.
  */
-@RunWith(Parameterized.class)
+@CleanUpDirectories(FileAppenderPermissionsTest.DIR)
 public class FileAppenderPermissionsTest {
 
-    private static final String DIR = "target/permissions1";
-
-    @Parameterized.Parameters(name = "{0} {1} {2}")
-    public static Collection<Object[]> data() throws IOException {
-        return Arrays.asList(new Object[][] { //
-              // @formatter:off
-             {"rwxrwxrwx", true, 2},
-             {"rw-r--r--", false, 3},
-             {"rw-------", true, 4},
-             {"rw-rw----", false, 5},
-              });
-              // @formatter:on
-    }
-
-    private final boolean createOnDemand;
-    private final String filePermissions;
-    private final int fileIndex;
+    static final String DIR = "target/permissions1";
 
-    public FileAppenderPermissionsTest(final String filePermissions, final boolean createOnDemand, final int fileIndex) {
-        this.filePermissions = filePermissions;
-        this.createOnDemand = createOnDemand;
-        this.fileIndex = fileIndex;
-    }
-
-    @BeforeClass
+    @BeforeAll
     public static void beforeClass() {
         System.setProperty("log4j2.debug", "true");
-        Assume.assumeTrue(FileUtils.isFilePosixAttributeViewSupported());
+        assumeTrue(FileUtils.isFilePosixAttributeViewSupported());
     }
 
-    @Test
-    public void testFilePermissionsAPI() throws Exception {
+    @ParameterizedTest
+    @CsvSource({ "rwxrwxrwx,true,2", "rw-r--r--,false,3", "rw-------,true,4", "rw-rw----,false,5" })
+    public void testFilePermissionsAPI(final String filePermissions, final boolean createOnDemand, final int fileIndex)
+            throws Exception {
         final File file = new File(DIR, "AppenderTest-" + fileIndex + ".log");
         final Path path = file.toPath();
         final Layout<String> layout = PatternLayout.newBuilder().setPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
@@ -105,11 +83,11 @@ public class FileAppenderPermissionsTest {
         // @formatter:on
         try {
             appender.start();
-            assertTrue("Appender did not start", appender.isStarted());
-            Assert.assertNotEquals(createOnDemand, Files.exists(path));
+            assertTrue(appender.isStarted(), "Appender did not start");
+            assertNotEquals(createOnDemand, Files.exists(path));
             long curLen = file.length();
             long prevLen = curLen;
-            assertTrue("File length: " + curLen, curLen == 0);
+            assertEquals(curLen, 0, "File length: " + curLen);
             for (int i = 0; i < 100; ++i) {
                 final LogEvent event = Log4jLogEvent.newBuilder().setLoggerName("TestLogger") //
                         .setLoggerFqcn(FileAppenderPermissionsTest.class.getName()).setLevel(Level.INFO) //
@@ -118,7 +96,7 @@ public class FileAppenderPermissionsTest {
                 try {
                     appender.append(event);
                     curLen = file.length();
-                    assertTrue("File length: " + curLen, curLen > prevLen);
+                    assertTrue(curLen > prevLen, "File length: " + curLen);
                     // Give up control long enough for another thread/process to occasionally do something.
                     Thread.sleep(25);
                 } catch (final Exception ex) {
@@ -129,13 +107,14 @@ public class FileAppenderPermissionsTest {
             assertEquals(filePermissions, PosixFilePermissions.toString(Files.getPosixFilePermissions(path)));
         } finally {
             appender.stop();
-            Files.deleteIfExists(path);
         }
-        assertFalse("Appender did not stop", appender.isStarted());
+        assertFalse(appender.isStarted(), "Appender did not stop");
     }
-    
-    @Test
-    public void testFileUserGroupAPI() throws Exception {
+
+    @ParameterizedTest
+    @CsvSource({ "rwxrwxrwx,2", "rw-r--r--,3", "rw-------,4", "rw-rw----,5" })
+    public void testFileUserGroupAPI(final String filePermissions, final int fileIndex)
+            throws Exception {
         final File file = new File(DIR, "AppenderTest-" + (1000 + fileIndex) + ".log");
         final Path path = file.toPath();
         final String user = findAUser();
@@ -161,10 +140,10 @@ public class FileAppenderPermissionsTest {
         // @formatter:on
         try {
             appender.start();
-            assertTrue("Appender did not start", appender.isStarted());
+            assertTrue(appender.isStarted(), "Appender did not start");
             long curLen = file.length();
             long prevLen = curLen;
-            assertTrue(file + " File length: " + curLen, curLen == 0);
+            assertEquals(curLen, 0, file + " File length: " + curLen);
             for (int i = 0; i < 100; ++i) {
                 final LogEvent event = Log4jLogEvent.newBuilder().setLoggerName("TestLogger") //
                         .setLoggerFqcn(FileAppenderPermissionsTest.class.getName()).setLevel(Level.INFO) //
@@ -173,7 +152,7 @@ public class FileAppenderPermissionsTest {
                 try {
                     appender.append(event);
                     curLen = file.length();
-                    assertTrue("File length: " + curLen, curLen > prevLen);
+                    assertTrue(curLen > prevLen, "File length: " + curLen);
                     // Give up control long enough for another thread/process to occasionally do something.
                     Thread.sleep(25);
                 } catch (final Exception ex) {
@@ -186,27 +165,32 @@ public class FileAppenderPermissionsTest {
             assertEquals(group, Files.readAttributes(path, PosixFileAttributes.class).group().getName());
         } finally {
             appender.stop();
-            Files.deleteIfExists(path);
         }
-        assertFalse("Appender did not stop", appender.isStarted());
+        assertFalse(appender.isStarted(), "Appender did not stop");
+    }
+
+    @Test
+    @LoggerContextSource(value = "log4j-posix.xml", timeout = 10)
+    void testFilePermissions(final LoggerContext context) throws IOException {
+        final ExtendedLogger logger = context.getLogger(getClass());
+        for (int i = 0; i < 1000; i++) {
+            logger.debug("This is test message number {}", box(i));
+        }
+        final String permissions = PosixFilePermissions.toString(
+                Files.getPosixFilePermissions(Paths.get("target/permissions1/AppenderTest-1.log")));
+        assertEquals("rw-------", permissions);
     }
 
     public static String findAGroup(final String user) throws IOException {
         if (SystemUtils.IS_OS_MAC_OSX) {
             return "staff";
         }
-        String group = user;
-        try (FileInputStream fis = new FileInputStream("/etc/group")) {
-            final List<String> groups = org.apache.commons.io.IOUtils.readLines(fis, Charset.defaultCharset());
-            for (int i = 0; i < groups.size(); i++) {
-                final String aGroup = groups.get(i);
-                if (!aGroup.startsWith(user) && aGroup.contains(user)) {
-                    group = aGroup.split(":")[0];
-                    break;
-                }
-            }
+        try (final Stream<String> lines = Files.lines(Paths.get("/etc/group"))) {
+            return lines.filter(group -> !group.startsWith(user) && group.contains(user))
+                    .map(group -> group.substring(0, group.indexOf(':')))
+                    .findAny()
+                    .orElse(user);
         }
-        return group;
     }
 
     private static String findAUser() throws IOException {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsXmlConfigTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsXmlConfigTest.java
deleted file mode 100644
index dd1dc81..0000000
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsXmlConfigTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.core.appender;
-
-import static org.junit.Assert.assertEquals;
-
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.nio.file.attribute.PosixFilePermissions;
-
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.util.FileUtils;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.junit.Assume;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.RuleChain;
-
-/**
- * Tests {@link FileAppender}.
- */
-public class FileAppenderPermissionsXmlConfigTest {
-
-    private static final String DIR = "target/permissions1";
-
-    private static final String CONFIG = "log4j-posix.xml";
-
-    public static LoggerContextRule loggerContextRule = LoggerContextRule.createShutdownTimeoutLoggerContextRule(CONFIG);
-
-    @Rule
-    public RuleChain chain = loggerContextRule.withCleanFoldersRule(DIR);
-
-    @BeforeClass
-    public static void beforeClass() {
-        Assume.assumeTrue(FileUtils.isFilePosixAttributeViewSupported());
-    }
-
-    @Test
-    public void testFilePermissions() throws Exception {
-        final Logger logger = loggerContextRule.getLogger(FileAppenderPermissionsTest.class);
-        for (int i = 0; i < 1000; ++i) {
-            final String message = "This is test message number " + i;
-            logger.debug(message);
-        }
-        assertEquals("rw-------", PosixFilePermissions.toString(
-                    Files.getPosixFilePermissions(Paths.get("target/permissions1/AppenderTest-1.log"))));
-    }
-
-    
-}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
index ac7528d..223ce3e 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
@@ -19,7 +19,6 @@ package org.apache.logging.log4j.core.appender;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.IOException;
 import java.io.InputStreamReader;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -36,10 +35,9 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.util.Throwables;
+import org.apache.logging.log4j.junit.CleanUpFiles;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
@@ -49,9 +47,10 @@ import static org.junit.jupiter.api.Assertions.*;
 /**
  * Tests {@link FileAppender}.
  */
+@CleanUpFiles(FileAppenderTest.FILE_NAME)
 public class FileAppenderTest {
 
-    private static final String FILE_NAME = "target/fileAppenderTest.log";
+    static final String FILE_NAME = "target/fileAppenderTest.log";
     private static final Path PATH = Paths.get(FILE_NAME);
     private static final int THREADS = 2;
 
@@ -60,12 +59,6 @@ public class FileAppenderTest {
         assertFalse(AbstractManager.hasManager(FILE_NAME), "Manager for " + FILE_NAME + " not removed");
     }
 
-    @BeforeEach
-    @AfterEach
-    void cleanFiles() throws IOException {
-        Files.deleteIfExists(PATH);
-    }
-
     @ParameterizedTest
     @ValueSource(booleans = { false, true })
     public void testAppender(final boolean createOnDemand) throws Exception {


[logging-log4j2] 02/03: Support shutdown timeout in JUnit 5 extension

Posted by ma...@apache.org.
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 1fb8aaee0704cafbe074f9b5c180b4a87e2ae096
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Mon Sep 7 14:13:20 2020 -0500

    Support shutdown timeout in JUnit 5 extension
    
    This ports over the previous functionality to specify a custom shutdown timeout when stopping a LoggerContext in unit tests.
    
    Signed-off-by: Matt Sicker <bo...@gmail.com>
---
 .../logging/log4j/junit/LoggerContextResolver.java | 95 +++++++++++++++-------
 .../logging/log4j/junit/LoggerContextRule.java     |  3 +
 .../logging/log4j/junit/LoggerContextSource.java   | 11 +++
 3 files changed, 80 insertions(+), 29 deletions(-)

diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextResolver.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextResolver.java
index fb0f367..3a92d3b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextResolver.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextResolver.java
@@ -18,6 +18,7 @@
 package org.apache.logging.log4j.junit;
 
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.LoggerContextAccessor;
 import org.apache.logging.log4j.core.config.Configurator;
 import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.AfterEachCallback;
@@ -29,6 +30,7 @@ import org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.support.TypeBasedParameterResolver;
 
 import java.lang.reflect.Method;
+import java.util.concurrent.TimeUnit;
 
 class LoggerContextResolver extends TypeBasedParameterResolver<LoggerContext> implements BeforeAllCallback,
         AfterAllCallback, BeforeEachCallback, AfterEachCallback {
@@ -37,59 +39,64 @@ class LoggerContextResolver extends TypeBasedParameterResolver<LoggerContext> im
         final Class<?> testClass = context.getRequiredTestClass();
         final LoggerContextSource testSource = testClass.getAnnotation(LoggerContextSource.class);
         if (testSource != null) {
-            final LoggerContext loggerContext =
-                    Configurator.initialize(context.getDisplayName(), testClass.getClassLoader(), testSource.value());
-            getTestClassStore(context).put(LoggerContext.class, loggerContext);
+            final LoggerContextConfig config = new LoggerContextConfig(testSource, context);
+            getTestClassStore(context).put(LoggerContext.class, config);
         }
     }
 
     @Override
     public void afterAll(ExtensionContext context) throws Exception {
-        final LoggerContext loggerContext = getTestClassStore(context).get(LoggerContext.class, LoggerContext.class);
-        if (loggerContext != null) {
-            loggerContext.close();
+        final LoggerContextConfig config =
+                getTestClassStore(context).get(LoggerContext.class, LoggerContextConfig.class);
+        if (config != null) {
+            config.close();
         }
     }
 
     @Override
     public void beforeEach(ExtensionContext context) throws Exception {
         final Class<?> testClass = context.getRequiredTestClass();
-        final LoggerContextSource testSource = testClass.getAnnotation(LoggerContextSource.class);
-        if (testSource != null && testSource.reconfigure() == ReconfigurationPolicy.BEFORE_EACH) {
-            final LoggerContext loggerContext = getTestClassStore(context).get(LoggerContext.class, LoggerContext.class);
-            if (loggerContext == null) {
+        if (testClass.isAnnotationPresent(LoggerContextSource.class)) {
+            final LoggerContextConfig config = getTestClassStore(context).get(LoggerContext.class, LoggerContextConfig.class);
+            if (config == null) {
                 throw new IllegalStateException(
-                        "Specified test class reconfiguration policy of BEFORE_EACH, but no LoggerContext found for test class " +
+                        "Specified @LoggerContextSource but no LoggerContext found for test class " +
                                 testClass.getCanonicalName());
             }
-            loggerContext.reconfigure();
+            if (config.reconfigurationPolicy == ReconfigurationPolicy.BEFORE_EACH) {
+                config.reconfigure();
+            }
         }
         final LoggerContextSource source = context.getRequiredTestMethod().getAnnotation(LoggerContextSource.class);
         if (source != null) {
-            final LoggerContext loggerContext = Configurator
-                    .initialize(context.getDisplayName(), testClass.getClassLoader(), source.value());
-            getTestInstanceStore(context).put(LoggerContext.class, loggerContext);
+            final LoggerContextConfig config = new LoggerContextConfig(source, context);
+            if (config.reconfigurationPolicy == ReconfigurationPolicy.BEFORE_EACH) {
+                config.reconfigure();
+            }
+            getTestInstanceStore(context).put(LoggerContext.class, config);
         }
     }
 
     @Override
     public void afterEach(ExtensionContext context) throws Exception {
         // method-annotated variant
-        final LoggerContext testInstanceContext = getTestInstanceStore(context).get(LoggerContext.class, LoggerContext.class);
-        if (testInstanceContext != null) {
-            testInstanceContext.close();
+        final LoggerContextConfig testInstanceConfig =
+                getTestInstanceStore(context).get(LoggerContext.class, LoggerContextConfig.class);
+        if (testInstanceConfig != null) {
+            testInstanceConfig.close();
         }
         // reloadable variant
         final Class<?> testClass = context.getRequiredTestClass();
-        final LoggerContextSource source = testClass.getAnnotation(LoggerContextSource.class);
-        if (source != null && source.reconfigure() == ReconfigurationPolicy.AFTER_EACH) {
-            final LoggerContext loggerContext = getTestClassStore(context).get(LoggerContext.class, LoggerContext.class);
-            if (loggerContext == null) {
+        if (testClass.isAnnotationPresent(LoggerContextSource.class)) {
+            final LoggerContextConfig config = getTestClassStore(context).get(LoggerContext.class, LoggerContextConfig.class);
+            if (config == null) {
                 throw new IllegalStateException(
-                        "Specified test class reconfiguration policy of AFTER_EACH, but no LoggerContext found for test class " +
+                        "Specified @LoggerContextSource but no LoggerContext found for test class " +
                                 testClass.getCanonicalName());
             }
-            loggerContext.reconfigure();
+            if (config.reconfigurationPolicy == ReconfigurationPolicy.AFTER_EACH) {
+                config.reconfigure();
+            }
         }
     }
 
@@ -109,12 +116,42 @@ class LoggerContextResolver extends TypeBasedParameterResolver<LoggerContext> im
 
     static LoggerContext getParameterLoggerContext(ParameterContext parameterContext, ExtensionContext extensionContext) {
         if (parameterContext.getDeclaringExecutable() instanceof Method) {
-            final LoggerContext loggerContext =
-                    getTestInstanceStore(extensionContext).get(LoggerContext.class, LoggerContext.class);
-            return loggerContext != null ? loggerContext :
-                    getTestClassStore(extensionContext).get(LoggerContext.class, LoggerContext.class);
+            final LoggerContextAccessor accessor =
+                    getTestInstanceStore(extensionContext).get(LoggerContext.class, LoggerContextAccessor.class);
+            return accessor != null ? accessor.getLoggerContext() :
+                    getTestClassStore(extensionContext).get(LoggerContext.class, LoggerContextAccessor.class).getLoggerContext();
+        }
+        return getTestClassStore(extensionContext).get(LoggerContext.class, LoggerContextAccessor.class).getLoggerContext();
+    }
+
+    private static class LoggerContextConfig implements AutoCloseable, LoggerContextAccessor {
+        private final LoggerContext context;
+        private final ReconfigurationPolicy reconfigurationPolicy;
+        private final long shutdownTimeout;
+        private final TimeUnit unit;
+
+        private LoggerContextConfig(final LoggerContextSource source, final ExtensionContext extensionContext) {
+            final String displayName = extensionContext.getDisplayName();
+            final ClassLoader classLoader = extensionContext.getRequiredTestClass().getClassLoader();
+            context = Configurator.initialize(displayName, classLoader, source.value());
+            reconfigurationPolicy = source.reconfigure();
+            shutdownTimeout = source.timeout();
+            unit = source.unit();
+        }
+
+        @Override
+        public LoggerContext getLoggerContext() {
+            return context;
+        }
+
+        public void reconfigure() {
+            context.reconfigure();
+        }
+
+        @Override
+        public void close() {
+            context.stop(shutdownTimeout, unit);
         }
-        return getTestClassStore(extensionContext).get(LoggerContext.class, LoggerContext.class);
     }
 
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextRule.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextRule.java
index 2215350..73a994a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextRule.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextRule.java
@@ -42,6 +42,9 @@ import static org.junit.Assert.*;
  * property {@code EBUG} is set (e.g., through the command line option {@code -DEBUG}), then the StatusLogger will be
  * set to the debug level. This allows for more debug messages as the StatusLogger will be in the error level until a
  * configuration file has been read and parsed into a tree of Nodes.
+ *
+ * @see LoggerContextSource
+ * @see Named
  */
 public class LoggerContextRule implements TestRule, LoggerContextAccessor {
 
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextSource.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextSource.java
index a6cedfb..e0cba27 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextSource.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextSource.java
@@ -29,6 +29,7 @@ import java.lang.annotation.Inherited;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Specifies a configuration file to use for unit tests. This configuration file will be loaded once and used for all tests
@@ -65,4 +66,14 @@ public @interface LoggerContextSource {
      * Specifies when to {@linkplain LoggerContext#reconfigure() reconfigure} the logging system.
      */
     ReconfigurationPolicy reconfigure() default ReconfigurationPolicy.NEVER;
+
+    /**
+     * Specifies the shutdown timeout limit. Defaults to 0 to mean no limit.
+     */
+    long timeout() default 0L;
+
+    /**
+     * Specifies the time unit {@link #timeout()} is measured in.
+     */
+    TimeUnit unit() default TimeUnit.SECONDS;
 }


[logging-log4j2] 01/03: Fix Windows file removal errors

Posted by ma...@apache.org.
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 018f72ab2a62efda1f2bb55231135f9d044a6dcc
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Mon Sep 7 13:39:45 2020 -0500

    Fix Windows file removal errors
    
    Signed-off-by: Matt Sicker <bo...@gmail.com>
---
 .../log4j/core/config/ConfigurationFactoryTest.java    | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/ConfigurationFactoryTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/ConfigurationFactoryTest.java
index b076721..4ebd877 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/ConfigurationFactoryTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/ConfigurationFactoryTest.java
@@ -24,6 +24,7 @@ import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.appender.ConsoleAppender;
 import org.apache.logging.log4j.core.filter.ThreadContextMapFilter;
+import org.apache.logging.log4j.junit.CleanUpFiles;
 import org.apache.logging.log4j.junit.LoggerContextSource;
 import org.apache.logging.log4j.util.Strings;
 import org.junit.jupiter.api.Tag;
@@ -40,6 +41,13 @@ import java.util.Map;
 import static org.apache.logging.log4j.util.Unbox.box;
 import static org.junit.jupiter.api.Assertions.*;
 
+@CleanUpFiles({
+        "target/test-xml.log",
+        "target/test-xinclude.log",
+        "target/test-json.log",
+        "target/test-yaml.log",
+        "target/test-properties.log"
+})
 class ConfigurationFactoryTest {
 
     static final String LOGGER_NAME = "org.apache.logging.log4j.test1.Test";
@@ -77,13 +85,9 @@ class ConfigurationFactoryTest {
         final long currentThreadId = Thread.currentThread().getId();
         final Logger logger = context.getLogger(FILE_LOGGER_NAME);
         logger.debug("Greetings from ConfigurationFactoryTest in thread#{}", box(currentThreadId));
-        try {
-            final List<String> lines = Files.readAllLines(logFile);
-            assertEquals(1, lines.size());
-            assertTrue(lines.get(0).endsWith(Long.toString(currentThreadId)));
-        } finally {
-            Files.delete(logFile);
-        }
+        final List<String> lines = Files.readAllLines(logFile);
+        assertEquals(1, lines.size());
+        assertTrue(lines.get(0).endsWith(Long.toString(currentThreadId)));
     }
 
     @Test