blob: d099da1d7dc1d8008c247ab203224cff472c7efd [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.core.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.logging.log4j.core.pattern.JAnsiTextRenderer;
import org.apache.logging.log4j.core.pattern.TextRenderer;
import org.apache.logging.log4j.util.Strings;
import org.fusesource.jansi.AnsiRenderer.Code;
import org.junit.Assert;
import org.junit.Test;
/**
* Unit tests for {@code ThrowableFormatOptions}.
*/
public final class ThrowableFormatOptionsTest {
/**
* Runs a given test comparing against the expected values.
*
* @param options
* The list of options to parse.
* @param expectedLines
* The expected lines.
* @param expectedPackages
* The expected package filters.
* @param expectedSeparator
* The expected separator.
*/
private static ThrowableFormatOptions test(final String[] options, final int expectedLines,
final String expectedSeparator, final List<String> expectedPackages) {
final ThrowableFormatOptions tfo = ThrowableFormatOptions.newInstance(options);
assertEquals("getLines", expectedLines, tfo.getLines());
assertEquals("getSeparator", expectedSeparator, tfo.getSeparator());
assertEquals("getPackages", expectedPackages, tfo.getIgnorePackages());
assertEquals("allLines", expectedLines == Integer.MAX_VALUE, tfo.allLines());
assertEquals("anyLines", expectedLines != 0, tfo.anyLines());
assertEquals("minLines", 0, tfo.minLines(0));
assertEquals("minLines", expectedLines, tfo.minLines(Integer.MAX_VALUE));
assertEquals("hasPackages", expectedPackages != null && !expectedPackages.isEmpty(), tfo.hasPackages());
assertNotNull("toString", tfo.toString());
return tfo;
}
/**
* Test {@code %throwable} with null options.
*/
@Test
public void testNull() {
test(null, Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable}
*/
@Test
public void testEmpty() {
test(new String[] {}, Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable{} } with null option value.
*/
@Test
public void testOneNullElement() {
test(new String[] { null }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable{} }
*/
@Test
public void testOneEmptyElement() {
test(new String[] { "" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable{full} }
*/
@Test
public void testFull() {
test(new String[] { "full" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable{full}{ansi} }
*/
@Test
public void testFullAnsi() {
final ThrowableFormatOptions tfo = test(new String[] { "full", "ansi" },
Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
testFullAnsiEmptyConfig(tfo);
}
/**
* Test {@code %throwable{full}{ansi()} }
*/
@Test
public void testFullAnsiEmptyConfig() {
final ThrowableFormatOptions tfo = test(new String[] { "full", "ansi()" },
Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
testFullAnsiEmptyConfig(tfo);
}
private void testFullAnsiEmptyConfig(final ThrowableFormatOptions tfo) {
final TextRenderer textRenderer = tfo.getTextRenderer();
Assert.assertNotNull(textRenderer);
Assert.assertTrue(textRenderer instanceof JAnsiTextRenderer);
final JAnsiTextRenderer jansiRenderer = (JAnsiTextRenderer) textRenderer;
final Map<String, Code[]> styleMap = jansiRenderer.getStyleMap();
// We have defaults
Assert.assertFalse(styleMap.isEmpty());
Assert.assertNotNull(styleMap.get("Name"));
}
/**
* Test {@code %throwable{full}{ansi(Warning=red))} }
*/
@Test
public void testFullAnsiWithCustomStyle() {
final ThrowableFormatOptions tfo = test(new String[] { "full", "ansi(Warning=red)" },
Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
final TextRenderer textRenderer = tfo.getTextRenderer();
Assert.assertNotNull(textRenderer);
Assert.assertTrue(textRenderer instanceof JAnsiTextRenderer);
final JAnsiTextRenderer jansiRenderer = (JAnsiTextRenderer) textRenderer;
final Map<String, Code[]> styleMap = jansiRenderer.getStyleMap();
Assert.assertArrayEquals(new Code[] { Code.RED }, styleMap.get("Warning"));
}
/**
* Test {@code %throwable{full}{ansi(Warning=red Key=blue Value=cyan))} }
*/
@Test
public void testFullAnsiWithCustomStyles() {
final ThrowableFormatOptions tfo = test(new String[] { "full", "ansi(Warning=red Key=blue Value=cyan)" },
Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
final TextRenderer textRenderer = tfo.getTextRenderer();
Assert.assertNotNull(textRenderer);
Assert.assertTrue(textRenderer instanceof JAnsiTextRenderer);
final JAnsiTextRenderer jansiRenderer = (JAnsiTextRenderer) textRenderer;
final Map<String, Code[]> styleMap = jansiRenderer.getStyleMap();
Assert.assertArrayEquals(new Code[] { Code.RED }, styleMap.get("Warning"));
Assert.assertArrayEquals(new Code[] { Code.BLUE }, styleMap.get("Key"));
Assert.assertArrayEquals(new Code[] { Code.CYAN }, styleMap.get("Value"));
}
/**
* Test {@code %throwable{full}{ansi(Warning=red Key=blue,bg_red Value=cyan,bg_black,underline)} }
*/
@Test
public void testFullAnsiWithCustomComplexStyles() {
final ThrowableFormatOptions tfo = test(
new String[] { "full", "ansi(Warning=red Key=blue,bg_red Value=cyan,bg_black,underline)" }, Integer.MAX_VALUE,
Strings.LINE_SEPARATOR, null);
final TextRenderer textRenderer = tfo.getTextRenderer();
Assert.assertNotNull(textRenderer);
Assert.assertTrue(textRenderer instanceof JAnsiTextRenderer);
final JAnsiTextRenderer jansiRenderer = (JAnsiTextRenderer) textRenderer;
final Map<String, Code[]> styleMap = jansiRenderer.getStyleMap();
Assert.assertArrayEquals(new Code[] { Code.RED }, styleMap.get("Warning"));
Assert.assertArrayEquals(new Code[] { Code.BLUE, Code.BG_RED }, styleMap.get("Key"));
Assert.assertArrayEquals(new Code[] { Code.CYAN, Code.BG_BLACK, Code.UNDERLINE }, styleMap.get("Value"));
}
/**
* Test {@code %throwable{none} }
*/
@Test
public void testNone() {
test(new String[] { "none" }, 0, Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable{short} }
*/
@Test
public void testShort() {
test(new String[] { "short" }, 2, Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable{10} }
*/
@Test
public void testDepth() {
test(new String[] { "10" }, 10, Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable{separator(|)} }
*/
@Test
public void testSeparator() {
test(new String[] { "separator(|)" }, Integer.MAX_VALUE, "|", null);
}
/**
* Test {@code %throwable{separator()} }
*/
@Test
public void testSeparatorAsEmpty() {
test(new String[] { "separator()" }, Integer.MAX_VALUE, Strings.EMPTY, null);
}
/**
* Test {@code %throwable{separator(\n)} }
*/
@Test
public void testSeparatorAsDefaultLineSeparator() {
test(new String[] { "separator(" + Strings.LINE_SEPARATOR + ')' }, Integer.MAX_VALUE,
Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable{separator( | )} }
*/
@Test
public void testSeparatorAsMultipleCharacters() {
test(new String[] { "separator( | )" }, Integer.MAX_VALUE, " | ", null);
}
/**
* Test {@code %throwable{full}{separator(|)} }
*/
@Test
public void testFullAndSeparator() {
test(new String[] { "full", "separator(|)" }, Integer.MAX_VALUE, "|", null);
}
/**
* Test {@code %throwable{full}{filters(org.junit)}{separator(|)} }
*/
@Test
public void testFullAndFiltersAndSeparator() {
test(new String[] { "full", "filters(org.junit)", "separator(|)" }, Integer.MAX_VALUE, "|", Arrays.asList("org.junit"));
}
/**
* Test {@code %throwable{none}{separator(|)} }
*/
@Test
public void testNoneAndSeparator() {
test(new String[] { "none", "separator(|)" }, 0, "|", null);
}
/**
* Test {@code %throwable{short}{separator(|)} }
*/
@Test
public void testShortAndSeparator() {
test(new String[] { "short", "separator(|)" }, 2, "|", null);
}
/**
* Test {@code %throwable{10}{separator(|)} }
*/
@Test
public void testDepthAndSeparator() {
test(new String[] { "10", "separator(|)" }, 10, "|", null);
}
/**
* Test {@code %throwable{filters(packages)} }
*/
@Test
public void testFilters() {
test(new String[] { "filters(packages)" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR,
Arrays.asList("packages"));
}
/**
* Test {@code %throwable{filters()} }
*/
@Test
public void testFiltersAsEmpty() {
test(new String[] { "filters()" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
}
/**
* Test {@code %throwable{filters(package1,package2)} }
*/
@Test
public void testFiltersAsMultiplePackages() {
test(new String[] { "filters(package1,package2)" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR,
Arrays.asList("package1", "package2"));
}
/**
* Test {@code %throwable{full}{filters(packages)} }
*/
@Test
public void testFullAndFilters() {
test(new String[] { "full", "filters(packages)" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR,
Arrays.asList("packages"));
}
/**
* Test {@code %throwable{none}{filters(packages)} }
*/
@Test
public void testNoneAndFilters() {
test(new String[] { "none", "filters(packages)" }, 0, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
}
/**
* Test {@code %throwable{short}{filters(packages)} }
*/
@Test
public void testShortAndFilters() {
test(new String[] { "short", "filters(packages)" }, 2, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
}
/**
* Test {@code %throwable{10}{filters(packages)} }
*/
@Test
public void testDepthAndFilters() {
test(new String[] { "10", "filters(packages)" }, 10, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
}
/**
* Test {@code %throwable{full}{separator(|)}{filters(packages)} }
*/
@Test
public void testFullAndSeparatorAndFilter() {
test(new String[] { "full", "separator(|)", "filters(packages)" }, Integer.MAX_VALUE, "|",
Arrays.asList("packages"));
}
/**
* Test {@code %throwable{full}{separator(|)}{filters(package1,package2)} }
*/
@Test
public void testFullAndSeparatorAndFilters() {
test(new String[] { "full", "separator(|)", "filters(package1,package2)" }, Integer.MAX_VALUE, "|",
Arrays.asList("package1", "package2"));
}
/**
* Test {@code %throwable{none}{separator(|)}{filters(packages)} }
*/
@Test
public void testNoneAndSeparatorAndFilters() {
test(new String[] { "none", "separator(|)", "filters(packages)" }, 0, "|", Arrays.asList("packages"));
}
/**
* Test {@code %throwable{short}{separator(|)}{filters(packages)} }
*/
@Test
public void testShortAndSeparatorAndFilters() {
test(new String[] { "short", "separator(|)", "filters(packages)" }, 2, "|", Arrays.asList("packages"));
}
/**
* Test {@code %throwable{10}{separator(|)}{filters(packages)} }
*/
@Test
public void testDepthAndSeparatorAndFilters() {
test(new String[] { "10", "separator(|)", "filters(packages)" }, 10, "|", Arrays.asList("packages"));
}
/**
* Test {@code %throwable{full,filters(packages)} }
*/
@Test
public void testSingleOptionFullAndFilters() {
test(new String[] { "full,filters(packages)" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR,
Arrays.asList("packages"));
}
/**
* Test {@code %throwable{none,filters(packages)} }
*/
@Test
public void testSingleOptionNoneAndFilters() {
test(new String[] { "none,filters(packages)" }, 0, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
}
/**
* Test {@code %throwable{short,filters(packages)} }
*/
@Test
public void testSingleOptionShortAndFilters() {
test(new String[] { "short,filters(packages)" }, 2, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
}
/**
* Test {@code %throwable{none,filters(packages)} }
*/
@Test
public void testSingleOptionDepthAndFilters() {
test(new String[] { "10,filters(packages)" }, 10, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
}
/**
* Test {@code %throwable{full,filters(package1,package2)} }
*/
@Test
public void testSingleOptionFullAndMultipleFilters() {
test(new String[] { "full,filters(package1,package2)" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR,
Arrays.asList("package1", "package2"));
}
/**
* Test {@code %throwable{none,filters(package1,package2)} }
*/
@Test
public void testSingleOptionNoneAndMultipleFilters() {
test(new String[] { "none,filters(package1,package2)" }, 0, Strings.LINE_SEPARATOR,
Arrays.asList("package1", "package2"));
}
/**
* Test {@code %throwable{short,filters(package1,package2)} }
*/
@Test
public void testSingleOptionShortAndMultipleFilters() {
test(new String[] { "short,filters(package1,package2)" }, 2, Strings.LINE_SEPARATOR,
Arrays.asList("package1", "package2"));
}
/**
* Test {@code %throwable{none,filters(package1,package2)} }
*/
@Test
public void testSingleOptionDepthAndMultipleFilters() {
test(new String[] { "10,filters(package1,package2)" }, 10, Strings.LINE_SEPARATOR,
Arrays.asList("package1", "package2"));
}
}