/*
* Copyright © 2014-2015 Cask Data, Inc.
*
* Licensed 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 co.cask.cdap.logging.serialize;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.LoggerContextVO;
import ch.qos.logback.classic.spi.ThrowableProxy;
import co.cask.cdap.common.logging.LoggingContextAccessor;
import co.cask.cdap.common.logging.logback.TestLoggingContext;
import co.cask.cdap.logging.appender.kafka.LoggingEventSerializer;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import kafka.utils.VerifiableProperties;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import java.nio.ByteBuffer;
import java.util.Map;
/**
* Test cases for LoggingEventSerializer.
*/
public class LoggingEventSerializerTest {
@BeforeClass
public static void setUpContext() {
LoggingContextAccessor.setLoggingContext(new TestLoggingContext("TEST_ACCT_ID1", "TEST_APP_ID1", "RUN1",
"INSTANCE1"));
}
@Test
public void testEmptySerialization() throws Exception {
LoggingEventSerializer serializer = new LoggingEventSerializer(new VerifiableProperties());
ch.qos.logback.classic.spi.LoggingEvent iLoggingEvent = new ch.qos.logback.classic.spi.LoggingEvent();
iLoggingEvent.setLevel(Level.ERROR);
iLoggingEvent.setThreadName("thread-1");
iLoggingEvent.setLoggerName(getClass().getName());
iLoggingEvent.setMessage("message");
iLoggingEvent.setTimeStamp(10000000L);
// Serialize
LoggingEvent event = new LoggingEvent(iLoggingEvent);
byte [] serializedBytes = serializer.toBytes(event, LoggingContextAccessor.getLoggingContext());
// De-serialize
ILoggingEvent actualEvent = serializer.fromBytes(ByteBuffer.wrap(serializedBytes));
assertLoggingEventEquals(iLoggingEvent, actualEvent);
}
@Test
public void testSerialization() throws Exception {
Map<String, String> mdcMap = Maps.newHashMap();
mdcMap.put("mdc1", "mdc-val1");
mdcMap.put("mdc2", null);
mdcMap.put(null, null);
Map<String, String> contextMap = Maps.newHashMap();
contextMap.put("p1", "ctx-val1");
contextMap.put("p2", null);
contextMap.put(null, null);
LoggingEventSerializer serializer = new LoggingEventSerializer(new VerifiableProperties());
ch.qos.logback.classic.spi.LoggingEvent iLoggingEvent = new ch.qos.logback.classic.spi.LoggingEvent();
iLoggingEvent.setThreadName("threadName1");
iLoggingEvent.setLevel(Level.INFO);
iLoggingEvent.setMessage("Log message1");
iLoggingEvent.setArgumentArray(new Object[]{null, "arg2", "100", null});
iLoggingEvent.setLoggerName("loggerName1");
iLoggingEvent.setLoggerContextRemoteView(new LoggerContextVO("logger_context1", contextMap, 12345634234L));
Exception e1 = new Exception(null, null);
Exception e2 = new Exception("Test Exception2", e1);
iLoggingEvent.setThrowableProxy(new ThrowableProxy(e2));
iLoggingEvent.prepareForDeferredProcessing();
((ThrowableProxy) iLoggingEvent.getThrowableProxy()).calculatePackagingData();
iLoggingEvent.setCallerData(new StackTraceElement[]{
new StackTraceElement("com.Class1", "methodName1", "fileName1", 10),
null,
new StackTraceElement("com.Class2", "methodName2", "fileName2", 20),
new StackTraceElement("com.Class3", "methodName3", null, 30),
null
});
iLoggingEvent.setMarker(null);
iLoggingEvent.getMDCPropertyMap().putAll(mdcMap);
iLoggingEvent.setTimeStamp(1234567890L);
// Serialize
LoggingEvent event = new LoggingEvent(iLoggingEvent);
byte [] serializedBytes = serializer.toBytes(event, LoggingContextAccessor.getLoggingContext());
// De-serialize
ILoggingEvent actualEvent = serializer.fromBytes(ByteBuffer.wrap(serializedBytes));
System.out.println(actualEvent);
assertLoggingEventEquals(iLoggingEvent, actualEvent);
}
@Test
public void testNullSerialization() throws Exception {
LoggingEventSerializer serializer = new LoggingEventSerializer(new VerifiableProperties());
ch.qos.logback.classic.spi.LoggingEvent iLoggingEvent = new ch.qos.logback.classic.spi.LoggingEvent();
iLoggingEvent.setThreadName(null);
iLoggingEvent.setLevel(null);
iLoggingEvent.setMessage(null);
iLoggingEvent.setArgumentArray(null);
iLoggingEvent.setLoggerName(null);
iLoggingEvent.setLoggerContextRemoteView(null);
iLoggingEvent.setThrowableProxy(null);
iLoggingEvent.setCallerData(null);
iLoggingEvent.setMarker(null);
iLoggingEvent.setMDCPropertyMap(null);
iLoggingEvent.setTimeStamp(10000000L);
// Serialize
LoggingEvent event = new LoggingEvent(iLoggingEvent);
byte [] serializedBytes = serializer.toBytes(event, LoggingContextAccessor.getLoggingContext());
// De-serialize
ILoggingEvent actualEvent = serializer.fromBytes(ByteBuffer.wrap(serializedBytes));
iLoggingEvent.setLevel(Level.ERROR);
assertLoggingEventEquals(iLoggingEvent, actualEvent);
}
public static void assertLoggingEventEquals(ILoggingEvent expected, ILoggingEvent actual) {
expected.getMDCPropertyMap().putAll(
ImmutableMap.of(".namespaceId", "TEST_ACCT_ID1", ".applicationId", "TEST_APP_ID1", ".runId", "RUN1",
".instanceId", "INSTANCE1"));
Assert.assertEquals(expected.getThreadName(), actual.getThreadName());
Assert.assertEquals(expected.getLevel(), actual.getLevel());
Assert.assertEquals(expected.getMessage(), actual.getMessage());
Assert.assertArrayEquals(expected.getArgumentArray(), actual.getArgumentArray());
Assert.assertEquals(expected.getFormattedMessage(), actual.getFormattedMessage());
Assert.assertEquals(expected.getLoggerName(), actual.getLoggerName());
Assert.assertEquals(expected.getLoggerContextVO(), actual.getLoggerContextVO());
Assert.assertEquals(expected.hasCallerData(), actual.hasCallerData());
if (expected.hasCallerData()) {
Assert.assertArrayEquals(expected.getCallerData(), actual.getCallerData());
}
Assert.assertEquals(expected.getMarker(), actual.getMarker());
Assert.assertEquals(expected.getTimeStamp(), actual.getTimeStamp());
Assert.assertEquals(expected.getMDCPropertyMap(), actual.getMDCPropertyMap());
assertThrowableProxyEquals(expected.getThrowableProxy(), actual.getThrowableProxy());
}
public static void assertThrowableProxyEquals(IThrowableProxy expected, IThrowableProxy actual) {
if (expected == actual) {
return;
}
assertThrowableProxyEquals(expected.getCause(), actual.getCause());
Assert.assertEquals(expected.getClassName(), actual.getClassName());
Assert.assertEquals(expected.getCommonFrames(), actual.getCommonFrames());
Assert.assertEquals(expected.getMessage(), actual.getMessage());
Assert.assertArrayEquals(expected.getStackTraceElementProxyArray(), actual.getStackTraceElementProxyArray());
if (expected.getSuppressed() == actual.getSuppressed()) {
return;
}
Assert.assertEquals(expected.getSuppressed().length, actual.getSuppressed().length);
for (int i = 0; i < expected.getSuppressed().length; ++i) {
assertThrowableProxyEquals(expected.getSuppressed()[i], actual.getSuppressed()[i]);
}
}
}