From a303f3252b3a40a6c0d4a765d2175326b5920e41 Mon Sep 17 00:00:00 2001 From: Daniel Torok Date: Fri, 1 Sep 2023 16:55:25 +0100 Subject: [PATCH] [alc] fix nullpointer exception when logging null (#38) * [alc] fix nullpointer exception when logging null --------- Co-authored-by: Daniel Torok --- .../client/logging/AbstractLambdaLogger.java | 3 +- .../logging/AbstractLambdaLoggerTest.java | 95 ++++++++++++++++--- 2 files changed, 84 insertions(+), 14 deletions(-) diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/logging/AbstractLambdaLogger.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/logging/AbstractLambdaLogger.java index b9aa4477..8246a3ad 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/logging/AbstractLambdaLogger.java +++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/logging/AbstractLambdaLogger.java @@ -33,7 +33,8 @@ public AbstractLambdaLogger(LogLevel logLevel, LogFormat logFormat) { protected abstract void logMessage(byte[] message, LogLevel logLevel); protected void logMessage(String message, LogLevel logLevel) { - logMessage(message.getBytes(UTF_8), logLevel); + byte[] messageBytes = message == null ? null : message.getBytes(UTF_8); + logMessage(messageBytes, logLevel); } @Override diff --git a/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/logging/AbstractLambdaLoggerTest.java b/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/logging/AbstractLambdaLoggerTest.java index dca307c9..baeb4c24 100644 --- a/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/logging/AbstractLambdaLoggerTest.java +++ b/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/logging/AbstractLambdaLoggerTest.java @@ -13,18 +13,26 @@ public class AbstractLambdaLoggerTest { - class TestLogger extends AbstractLambdaLogger { + class TestSink implements LogSink { private List messages = new LinkedList<>(); - public TestLogger(LogLevel logLevel, LogFormat logFormat) { - super(logLevel, logFormat); + public TestSink() { } @Override - protected void logMessage(byte[] message, LogLevel logLevel) { + public void log(byte[] message) { messages.add(message); } + @Override + public void log(LogLevel logLevel, LogFormat logFormat, byte[] message) { + messages.add(message); + } + + @Override + public void close() { + } + List getMessages() { return messages; } @@ -39,36 +47,97 @@ private void logMessages(LambdaLogger logger) { logger.log("fatal", LogLevel.FATAL); } + @Test + public void testLoggingNullValuesWithoutLogLevelInText() { + TestSink sink = new TestSink(); + LambdaLogger logger = new LambdaContextLogger(sink, LogLevel.INFO, LogFormat.TEXT); + + String isNullString = null; + byte[] isNullBytes = null; + + logger.log(isNullString); + logger.log(isNullBytes); + + assertEquals("null", new String(sink.getMessages().get(0))); + assertEquals("null", new String(sink.getMessages().get(1))); + } + + @Test + public void testLoggingNullValuesWithoutLogLevelInJSON() { + TestSink sink = new TestSink(); + LambdaLogger logger = new LambdaContextLogger(sink, LogLevel.INFO, LogFormat.JSON); + + String isNullString = null; + byte[] isNullBytes = null; + + logger.log(isNullString); + logger.log(isNullBytes); + + assertEquals(2, sink.getMessages().size()); + } + + @Test + public void testLoggingNullValuesWithLogLevelInText() { + TestSink sink = new TestSink(); + LambdaLogger logger = new LambdaContextLogger(sink, LogLevel.INFO, LogFormat.TEXT); + + String isNullString = null; + byte[] isNullBytes = null; + + logger.log(isNullString, LogLevel.ERROR); + logger.log(isNullBytes, LogLevel.ERROR); + + assertEquals("[ERROR] null", new String(sink.getMessages().get(0))); + assertEquals("null", new String(sink.getMessages().get(1))); + } + + @Test + public void testLoggingNullValuesWithLogLevelInJSON() { + TestSink sink = new TestSink(); + LambdaLogger logger = new LambdaContextLogger(sink, LogLevel.INFO, LogFormat.JSON); + + String isNullString = null; + byte[] isNullBytes = null; + + logger.log(isNullString, LogLevel.ERROR); + logger.log(isNullBytes, LogLevel.ERROR); + + assertEquals(2, sink.getMessages().size()); + } @Test public void testWithoutFiltering() { - TestLogger logger = new TestLogger(LogLevel.UNDEFINED, LogFormat.TEXT); + TestSink sink = new TestSink(); + LambdaLogger logger = new LambdaContextLogger(sink, LogLevel.UNDEFINED, LogFormat.TEXT); logMessages(logger); - assertEquals(6, logger.getMessages().size()); + assertEquals(6, sink.getMessages().size()); } @Test public void testWithFiltering() { - TestLogger logger = new TestLogger(LogLevel.WARN, LogFormat.TEXT); + TestSink sink = new TestSink(); + LambdaLogger logger = new LambdaContextLogger(sink, LogLevel.WARN, LogFormat.TEXT); logMessages(logger); - assertEquals(3, logger.getMessages().size()); + assertEquals(3, sink.getMessages().size()); } @Test public void testUndefinedLogLevelWithFiltering() { - TestLogger logger = new TestLogger(LogLevel.WARN, LogFormat.TEXT); + TestSink sink = new TestSink(); + LambdaLogger logger = new LambdaContextLogger(sink, LogLevel.WARN, LogFormat.TEXT); logger.log("undefined"); - assertEquals(1, logger.getMessages().size()); + assertEquals(1, sink.getMessages().size()); } @Test public void testFormattingLogMessages() { - TestLogger logger = new TestLogger(LogLevel.INFO, LogFormat.TEXT); + TestSink sink = new TestSink(); + LambdaLogger logger = new LambdaContextLogger(sink, LogLevel.INFO, LogFormat.TEXT); logger.log("test message", LogLevel.INFO); - assertEquals(1, logger.getMessages().size()); - assertEquals("[INFO] test message", new String(logger.getMessages().get(0))); + assertEquals(1, sink.getMessages().size()); + assertEquals("[INFO] test message", new String(sink.getMessages().get(0))); } }