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 6c8577a578d19b65e435d118deb9823f9f1ed659 Author: Gary Gregory <[email protected]> AuthorDate: Mon Jan 17 18:31:42 2022 -0500 PR #704 from Carter but with fixes in StackLocator getCurrentStackTrace(). - Call push() one by one instead of addAll() to match log4j-api. - Do not allocate an extra collection. - Update the test. - Constants should be in upper case. --- .../logging/log4j/util/StackLocatorUtilTest.java | 76 +++++++++++++++++++--- .../util/PrivateSecurityManagerStackTraceUtil.java | 5 +- 2 files changed, 68 insertions(+), 13 deletions(-) diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/StackLocatorUtilTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util/StackLocatorUtilTest.java index 8fe11c3f8e..15ff9b0735 100644 --- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/StackLocatorUtilTest.java +++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util/StackLocatorUtilTest.java @@ -16,14 +16,16 @@ */ package org.apache.logging.log4j.util; -import java.util.ArrayDeque; import java.util.Deque; import org.junit.jupiter.api.Test; import org.junit.jupiter.engine.execution.InterceptingExecutableInvoker; import org.junit.jupiter.engine.execution.InvocationInterceptorChain; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; public class StackLocatorUtilTest { @@ -75,15 +77,11 @@ public class StackLocatorUtilTest { @Test public void testGetCurrentStackTrace() throws Exception { final Deque<Class<?>> classes = StackLocatorUtil.getCurrentStackTrace(); - final Deque<Class<?>> reversed = new ArrayDeque<>(classes.size()); - while (!classes.isEmpty()) { - reversed.push(classes.pop()); + while (classes.peekFirst() != StackLocatorUtil.class) { + classes.removeFirst(); } - while (reversed.peek() != StackLocatorUtil.class) { - reversed.pop(); - } - reversed.pop(); // ReflectionUtil - assertSame(StackLocatorUtilTest.class, reversed.pop()); + classes.removeFirst(); // StackLocatorUtil + assertSame(StackLocatorUtilTest.class, classes.removeFirst()); } @Test @@ -112,4 +110,62 @@ public class StackLocatorUtilTest { assertEquals(this.getClass(), clazz, "Incorrect class"); } + private final class Foo { + + private StackTraceElement foo() { + return new Bar().bar(); // <--- testCalcLocation() line + } + + } + + private final class Bar { + + private StackTraceElement bar() { + return baz(); + } + + private StackTraceElement baz() { + return quux(); + } + + } + + private StackTraceElement quux() { + final StackLocator stackLocator = StackLocator.getInstance(); + return stackLocator.calcLocation("org.apache.logging.log4j.util.StackLocatorUtilTest$Bar"); + } + + @Test + public void testCalcLocation() { + /* + * We are setting up a stack trace that looks like: + * - org.apache.logging.log4j.util.test.StackLocatorTest#quux(line:118) + * - org.apache.logging.log4j.util.test.StackLocatorTest$Bar#baz(line:112) + * - org.apache.logging.log4j.util.test.StackLocatorTest$Bar#bar(line:108) + * - org.apache.logging.log4j.util.test.StackLocatorTest$Foo(line:100) + * + * We are pretending that org.apache.logging.log4j.util.test.StackLocatorTest$Bar is the logging class, and + * org.apache.logging.log4j.util.test.StackLocatorTest$Foo is where the log line emanated. + */ + final StackTraceElement element = new Foo().foo(); + assertEquals("org.apache.logging.log4j.util.StackLocatorUtilTest$Foo", element.getClassName()); + // The line number below may need adjustment if this file is changed. + assertEquals(116, element.getLineNumber()); + } + + @Test + public void testCalcLocationWhenNotInTheStack() { + final StackLocator stackLocator = StackLocator.getInstance(); + final StackTraceElement stackTraceElement = stackLocator.calcLocation("java.util.Logger"); + assertNull(stackTraceElement); + } + + static class ClassLocator { + + public Class<?> locateClass() { + final StackLocator stackLocator = StackLocator.getInstance(); + return stackLocator.getCallerClass(ClassLocator.class); + } + } + } diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java index 2f2be07986..94ca4ff555 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java @@ -17,6 +17,7 @@ package org.apache.logging.log4j.util; import java.util.ArrayDeque; +import java.util.Collections; import java.util.Deque; /** @@ -64,9 +65,7 @@ final class PrivateSecurityManagerStackTraceUtil { static Deque<Class<?>> getCurrentStackTrace() { final Class<?>[] array = SECURITY_MANAGER.getClassContext(); final Deque<Class<?>> classes = new ArrayDeque<>(array.length); - for (final Class<?> clazz : array) { - classes.push(clazz); - } + Collections.addAll(classes, array); return classes; }
