Skip to content

[alc] fix nullpointer exception when logging null (#38) #439

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,26 @@


public class AbstractLambdaLoggerTest {
class TestLogger extends AbstractLambdaLogger {
class TestSink implements LogSink {
private List<byte[]> 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<byte[]> getMessages() {
return messages;
}
Expand All @@ -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)));
}
}