blob: a4e06ad68dedc81b882a7a337d6d6f31d4ed6952 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.logging.log4j.csv.layout;
import static org.junit.Assert.assertEquals;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import org.apache.commons.csv.CSVFormat;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.categories.Layouts;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.BasicConfigurationFactory;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.test.junit.ThreadContextRule;
import org.apache.logging.log4j.test.appender.ListAppender;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* Tests {@link AbstractCsvLayout}.
*
* @since 2.4
*/
@Category(Layouts.Csv.class)
public class CsvLogEventLayoutTest {
static ConfigurationFactory cf = new BasicConfigurationFactory();
@Rule
public final ThreadContextRule threadContextRule = new ThreadContextRule();
@AfterClass
public static void cleanupClass() {
ConfigurationFactory.removeConfigurationFactory(cf);
}
@BeforeClass
public static void setupClass() {
ConfigurationFactory.setConfigurationFactory(cf);
final LoggerContext ctx = LoggerContext.getContext();
ctx.reconfigure();
}
private final LoggerContext ctx = LoggerContext.getContext();
private final Logger root = ctx.getRootLogger();
@Test
public void testCustomCharset() {
final AbstractCsvLayout layout = CsvLogEventLayout.createLayout(null, "Excel", null, null, null, null, null,
null, StandardCharsets.UTF_16, null, null);
assertEquals("text/csv; charset=UTF-16", layout.getContentType());
}
@Test
public void testHeaderFooter() {
final String header = "# Header";
final String footer = "# Footer ";
final AbstractCsvLayout layout = CsvLogEventLayout.createLayout(ctx.getConfiguration(), "Excel", null, null,
null, null, null, null, null, header, footer);
testLayout(CSVFormat.DEFAULT, layout, header, footer);
}
@Test
public void testDefaultCharset() {
final AbstractCsvLayout layout = CsvLogEventLayout.createDefaultLayout();
assertEquals(StandardCharsets.UTF_8, layout.getCharset());
}
@Test
public void testDefaultContentType() {
final AbstractCsvLayout layout = CsvLogEventLayout.createDefaultLayout();
assertEquals("text/csv; charset=UTF-8", layout.getContentType());
}
private void testLayout(final CSVFormat format) {
testLayout(format, CsvLogEventLayout.createLayout(format), null, null);
}
private void testLayout(final CSVFormat format, final AbstractCsvLayout layout, final String header, final String footer) {
final Map<String, Appender> appenders = root.getAppenders();
for (final Appender appender : appenders.values()) {
root.removeAppender(appender);
}
// set up appender
final ListAppender appender = new ListAppender("List", null, layout, true, false);
appender.start();
// set appender on root and set level to debug
root.addAppender(appender);
root.setLevel(Level.DEBUG);
root.debug("one={}, two={}, three={}", 1, 2, 3);
root.info("Hello");
appender.stop();
final List<String> list = appender.getMessages();
final boolean hasHeaderSerializer = layout.getHeaderSerializer() != null;
final boolean hasFooterSerializer = layout.getFooterSerializer() != null;
final int headerOffset = hasHeaderSerializer ? 1 : 0;
final String event0 = list.get(0 + headerOffset);
final String event1 = list.get(1 + headerOffset);
final char del = format.getDelimiter();
Assert.assertTrue(event0, event0.contains(del + "DEBUG" + del));
final String quote = del == ',' ? "\"" : "";
Assert.assertTrue(event0, event0.contains(del + quote + "one=1, two=2, three=3" + quote + del));
Assert.assertTrue(event1, event1.contains(del + "INFO" + del));
if (hasHeaderSerializer && header == null) {
Assert.fail();
}
if (!hasHeaderSerializer && header != null) {
Assert.fail();
}
if (hasFooterSerializer && footer == null) {
Assert.fail();
}
if (!hasFooterSerializer && footer != null) {
Assert.fail();
}
if (hasHeaderSerializer) {
Assert.assertEquals(list.toString(), header, list.get(0));
}
if (hasFooterSerializer) {
Assert.assertEquals(list.toString(), footer, list.get(list.size() - 1));
}
}
@Test
public void testLayoutDefault() throws Exception {
testLayout(CSVFormat.DEFAULT);
}
@Test
public void testLayoutExcel() throws Exception {
testLayout(CSVFormat.EXCEL);
}
@Test
public void testLayoutMySQL() throws Exception {
testLayout(CSVFormat.MYSQL);
}
@Test
public void testLayoutRFC4180() throws Exception {
testLayout(CSVFormat.RFC4180);
}
@Test
public void testLayoutTab() throws Exception {
testLayout(CSVFormat.TDF);
}
}