From 4e3b889944b95f9fbd3bd48c3d4a1dfd6b222870 Mon Sep 17 00:00:00 2001 From: Ryan Schmitt Date: Fri, 22 May 2026 17:09:06 -0700 Subject: [PATCH] test(log4j2): Add initial test suite covering plugin registration This package previously had no tests and no JUnit dependency. Add JUnit Jupiter, the surefire plugin, and an initial test class that exercises the full plugin resolution path end-to-end: a log4j2.xml on the test classpath, a real LogManager-issued logger, and stdout capture (LambdaAppender writes through LambdaRuntime.getLogger() to System.out). The TEXT test routes the root logger through LambdaTextFormat with a deterministic PatternLayout and asserts each level appears. The JSON test adds a second LambdaAppender with format="JSON" backed by JsonTemplateLayout + LambdaLayout.json, attached via additivity=false to a "json-test" logger, and asserts the messages show up JSON-encoded. Add log4j-layout-template-json at test scope so the JSON path can resolve at test time. Users are still expected to bring their own copy at runtime (peer-dependency model, like PatternLayout); the published artifact's dependency surface is unchanged. The tests succeed on Java 8 and fail on Java 25, because annotation processors are not run by default on Java 25, Log4j2Plugins.dat is not generated for our plugins, and both tests surface the resulting CLASS_NOT_FOUND from the log4j status logger. --- aws-lambda-java-log4j2/pom.xml | 25 +++++- .../log4j2/LambdaAppenderPluginTest.java | 86 +++++++++++++++++++ .../src/test/resources/log4j2.xml | 25 ++++++ 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 aws-lambda-java-log4j2/src/test/java/com/amazonaws/services/lambda/runtime/log4j2/LambdaAppenderPluginTest.java create mode 100644 aws-lambda-java-log4j2/src/test/resources/log4j2.xml diff --git a/aws-lambda-java-log4j2/pom.xml b/aws-lambda-java-log4j2/pom.xml index 6f142d57c..469c2e1f0 100644 --- a/aws-lambda-java-log4j2/pom.xml +++ b/aws-lambda-java-log4j2/pom.xml @@ -35,6 +35,7 @@ 1.8 1.8 2.25.4 + 5.12.2 @@ -60,8 +61,30 @@ log4j-api ${log4j.version} + + org.apache.logging.log4j + log4j-layout-template-json + ${log4j.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.2 + + + + dev @@ -146,4 +169,4 @@ - \ No newline at end of file + diff --git a/aws-lambda-java-log4j2/src/test/java/com/amazonaws/services/lambda/runtime/log4j2/LambdaAppenderPluginTest.java b/aws-lambda-java-log4j2/src/test/java/com/amazonaws/services/lambda/runtime/log4j2/LambdaAppenderPluginTest.java new file mode 100644 index 000000000..0bcd057a6 --- /dev/null +++ b/aws-lambda-java-log4j2/src/test/java/com/amazonaws/services/lambda/runtime/log4j2/LambdaAppenderPluginTest.java @@ -0,0 +1,86 @@ +/* Copyright 2026 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ + +package com.amazonaws.services.lambda.runtime.log4j2; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class LambdaAppenderPluginTest { + + private final PrintStream originalOut = System.out; + private ByteArrayOutputStream captured; + + @BeforeEach + void redirectStdout() throws UnsupportedEncodingException { + captured = new ByteArrayOutputStream(); + System.setOut(new PrintStream(captured, true, StandardCharsets.UTF_8.name())); + } + + @AfterEach + void restoreStdout() { + System.setOut(originalOut); + } + + @Test + void lambdaAppenderEmitsLogsAtVariousLevels() throws UnsupportedEncodingException { + Logger logger = LogManager.getLogger(LambdaAppenderPluginTest.class); + + logger.debug("debug-msg"); + logger.info("info-msg"); + logger.warn("warn-msg"); + logger.error("error-msg"); + + String output = captured.toString(StandardCharsets.UTF_8.name()); + + // The PatternLayout in src/test/resources/log4j2.xml is "%-5p %c{1} - %m%n", + // so each event should appear as " LambdaAppenderPluginTest - ". + assertTrue(output.contains("DEBUG LambdaAppenderPluginTest - debug-msg"), + "expected DEBUG line in output but got:\n" + output); + assertTrue(output.contains("INFO LambdaAppenderPluginTest - info-msg"), + "expected INFO line in output but got:\n" + output); + assertTrue(output.contains("WARN LambdaAppenderPluginTest - warn-msg"), + "expected WARN line in output but got:\n" + output); + assertTrue(output.contains("ERROR LambdaAppenderPluginTest - error-msg"), + "expected ERROR line in output but got:\n" + output); + + // Sanity check: log4j should not have fallen back to its default + // ConsoleAppender / status logger error message. + assertFalse(output.contains("ERROR StatusLogger"), + "log4j status logger reported an error, output was:\n" + output); + } + + @Test + void lambdaAppenderEmitsJsonForJsonFormatLogger() throws UnsupportedEncodingException { + // The "json-test" logger is configured in src/test/resources/log4j2.xml + // with additivity=false to a second LambdaAppender using format="JSON" + // and JsonTemplateLayout backed by LambdaLayout.json. + Logger logger = LogManager.getLogger("json-test"); + + logger.info("json-info-msg"); + logger.error("json-error-msg"); + + String output = captured.toString(StandardCharsets.UTF_8.name()); + + assertTrue(output.contains("json-info-msg"), + "expected json-info-msg in output but got:\n" + output); + assertTrue(output.contains("json-error-msg"), + "expected json-error-msg in output but got:\n" + output); + + // Output should look like JSON, not the text PatternLayout from the + // root logger — so it must contain JSON field punctuation around the + // message rather than the "INFO json-test - ..." text pattern. + assertTrue(output.contains("\"message\":\"json-info-msg\""), + "expected JSON-encoded message field but got:\n" + output); + } +} diff --git a/aws-lambda-java-log4j2/src/test/resources/log4j2.xml b/aws-lambda-java-log4j2/src/test/resources/log4j2.xml new file mode 100644 index 000000000..7b43094e2 --- /dev/null +++ b/aws-lambda-java-log4j2/src/test/resources/log4j2.xml @@ -0,0 +1,25 @@ + + + + + + + %-5p %c{1} - %m%n + + + + + + + + + + + + + + + + + +