| /* |
| * 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.config.plugins.convert; |
| |
| import java.io.File; |
| import java.math.BigDecimal; |
| import java.math.BigInteger; |
| import java.net.InetAddress; |
| import java.net.URI; |
| import java.net.URL; |
| import java.nio.charset.Charset; |
| import java.nio.charset.StandardCharsets; |
| import java.nio.file.Path; |
| import java.nio.file.Paths; |
| import java.security.Provider; |
| import java.security.Security; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.UUID; |
| |
| import org.apache.logging.log4j.Level; |
| import org.apache.logging.log4j.core.Filter; |
| import org.apache.logging.log4j.core.appender.rolling.action.Duration; |
| import org.apache.logging.log4j.core.layout.GelfLayout; |
| import org.apache.logging.log4j.core.net.Facility; |
| import org.apache.logging.log4j.plugins.convert.TypeConverters; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.Parameterized; |
| |
| import static org.junit.Assert.*; |
| |
| /** |
| * Tests {@link CoreTypeConverters}. |
| */ |
| @RunWith(Parameterized.class) |
| public class TypeConvertersTest { |
| |
| @SuppressWarnings("boxing") |
| @Parameterized.Parameters |
| public static Collection<Object[]> data() throws Exception { |
| final byte[] byteArray = { |
| (byte) 0xc7, |
| (byte) 0x73, |
| (byte) 0x21, |
| (byte) 0x8c, |
| (byte) 0x7e, |
| (byte) 0xc8, |
| (byte) 0xee, |
| (byte) 0x99 }; |
| return Arrays.asList( |
| // Array format: value, expected, default, type |
| new Object[][]{ |
| // boolean |
| { "true", true, null, Boolean.class }, |
| { "false", false, null, Boolean.class }, |
| { "True", true, null, Boolean.class }, |
| { "TRUE", true, null, Boolean.class }, |
| { "blah", false, null, Boolean.class }, // TODO: is this acceptable? it's how Boolean.parseBoolean works |
| { null, null, null, Boolean.class }, |
| { null, true, "true", Boolean.class }, |
| { "no", false, null, Boolean.class }, // TODO: see above |
| { "true", true, "false", boolean.class }, |
| { "FALSE", false, "true", boolean.class }, |
| { null, false, "false", boolean.class }, |
| { "invalid", false, "false", boolean.class }, |
| // byte |
| { "42", (byte)42, null, Byte.class }, |
| { "53", (byte)53, null, Byte.class }, |
| // char |
| { "A", 'A', null, char.class }, |
| { "b", 'b', null, char.class }, |
| { "b0", null, null, char.class }, |
| // integer |
| { "42", 42, null, Integer.class }, |
| { "53", 53, null, Integer.class }, |
| { "-16", -16, null, Integer.class }, |
| { "0", 0, null, Integer.class }, |
| { "n", null, null, Integer.class }, |
| { "n", 5, "5", Integer.class }, |
| { "4.2", null, null, Integer.class }, |
| { "4.2", 0, "0", Integer.class }, |
| { null, null, null, Integer.class }, |
| { "75", 75, "0", int.class }, |
| { "-30", -30, "0", int.class }, |
| { "0", 0, "10", int.class }, |
| { null, 10, "10", int.class }, |
| // longs |
| { "55", 55L, null, Long.class }, |
| { "1234567890123456789", 1234567890123456789L, null, Long.class }, |
| { "123123123L", null, null, Long.class }, |
| { "123123123123", 123123123123L, null, Long.class }, |
| { "-987654321", -987654321L, null, Long.class }, |
| { "-45l", null, null, Long.class }, |
| { "0", 0L, null, Long.class }, |
| { "asdf", null, null, Long.class }, |
| { "3.14", null, null, Long.class }, |
| { "3.14", 0L, "0", Long.class }, |
| { "*3", 1000L, "1000", Long.class }, |
| { null, null, null, Long.class }, |
| { "3000", 3000L, "0", long.class }, |
| { "-543210", -543210L, "0", long.class }, |
| { "22.7", -53L, "-53", long.class }, |
| // short |
| { "42", (short)42, null, short.class }, |
| { "53", (short)53, null, short.class }, |
| { "-16", (short)-16, null, Short.class }, |
| // Log4j |
| // levels |
| { "ERROR", Level.ERROR, null, Level.class }, |
| { "WARN", Level.WARN, null, Level.class }, |
| { "FOO", null, null, Level.class }, |
| { "FOO", Level.DEBUG, "DEBUG", Level.class }, |
| { "OFF", Level.OFF, null, Level.class }, |
| { null, null, null, Level.class }, |
| { null, Level.INFO, "INFO", Level.class }, |
| // results |
| { "ACCEPT", Filter.Result.ACCEPT, null, Filter.Result.class }, |
| { "NEUTRAL", Filter.Result.NEUTRAL, null, Filter.Result.class }, |
| { "DENY", Filter.Result.DENY, null, Filter.Result.class }, |
| { "NONE", null, null, Filter.Result.class }, |
| { "NONE", Filter.Result.NEUTRAL, "NEUTRAL", Filter.Result.class }, |
| { null, null, null, Filter.Result.class }, |
| { null, Filter.Result.ACCEPT, "ACCEPT", Filter.Result.class }, |
| // syslog facilities |
| { "KERN", Facility.KERN, "USER", Facility.class }, |
| { "mail", Facility.MAIL, "KERN", Facility.class }, |
| { "Cron", Facility.CRON, null, Facility.class }, |
| { "not a real facility", Facility.AUTH, "auth", Facility.class }, |
| { null, null, null, Facility.class }, |
| // GELF compression types |
| { "GZIP", GelfLayout.CompressionType.GZIP, "GZIP", GelfLayout.CompressionType.class }, |
| { "ZLIB", GelfLayout.CompressionType.ZLIB, "GZIP", GelfLayout.CompressionType.class }, |
| { "OFF", GelfLayout.CompressionType.OFF, "GZIP", GelfLayout.CompressionType.class }, |
| // arrays |
| { "123", "123".toCharArray(), null, char[].class }, |
| { "123", "123".getBytes(Charset.defaultCharset()), null, byte[].class }, |
| { "0xC773218C7EC8EE99", byteArray, null, byte[].class }, |
| { "0xc773218c7ec8ee99", byteArray, null, byte[].class }, |
| { "Base64:cGxlYXN1cmUu", "pleasure.".getBytes("US-ASCII"), null, byte[].class }, |
| // JRE |
| // JRE Charset |
| { "UTF-8", StandardCharsets.UTF_8, null, Charset.class }, |
| { "ASCII", Charset.forName("ASCII"), "UTF-8", Charset.class }, |
| { "Not a real charset", StandardCharsets.UTF_8, "UTF-8", Charset.class }, |
| { null, StandardCharsets.UTF_8, "UTF-8", Charset.class }, |
| { null, null, null, Charset.class }, |
| // JRE File |
| { "c:/temp", new File("c:/temp"), null, File.class }, |
| // JRE Class |
| { TypeConvertersTest.class.getName(), TypeConvertersTest.class, null, Class.class }, |
| { "boolean", boolean.class, null, Class.class }, |
| { "byte", byte.class, null, Class.class }, |
| { "char", char.class, null, Class.class }, |
| { "double", double.class, null, Class.class }, |
| { "float", float.class, null, Class.class }, |
| { "int", int.class, null, Class.class }, |
| { "long", long.class, null, Class.class }, |
| { "short", short.class, null, Class.class }, |
| { "void", void.class, null, Class.class }, |
| { "\t", Object.class, Object.class.getName(), Class.class }, |
| { "\n", null, null, Class.class }, |
| // JRE URL |
| { "http://locahost", new URL("http://locahost"), null, URL.class }, |
| { "\n", null, null, URL.class }, |
| // JRE URI |
| { "http://locahost", new URI("http://locahost"), null, URI.class }, |
| { "\n", null, null, URI.class }, |
| // JRE BigInteger |
| { "9223372036854775817000", new BigInteger("9223372036854775817000"), null, BigInteger.class }, |
| { "\n", null, null, BigInteger.class }, |
| // JRE BigInteger |
| { "9223372036854775817000.99999", new BigDecimal("9223372036854775817000.99999"), null, BigDecimal.class }, |
| { "\n", null, null, BigDecimal.class }, |
| // JRE Security Provider |
| { Security.getProviders()[0].getName(), Security.getProviders()[0], null, Provider.class }, |
| { "\n", null, null, Provider.class }, |
| // Duration |
| { "P7DT10H", Duration.parse("P7DT10H"), null, Duration.class }, |
| // JRE InetAddress |
| { "127.0.0.1", InetAddress.getByName("127.0.0.1"), null, InetAddress.class }, |
| // JRE Path |
| { "/path/to/file", Paths.get("/path", "to", "file"), null, Path.class }, |
| // JRE UUID |
| { "8fd389fb-9154-4096-b52e-435bde4a1835", UUID.fromString("8fd389fb-9154-4096-b52e-435bde4a1835"), null, UUID.class }, |
| } |
| ); |
| } |
| |
| private final String value; |
| private final Object expected; |
| private final String defaultValue; |
| private final Class<?> clazz; |
| |
| public TypeConvertersTest(final String value, final Object expected, final String defaultValue, final Class<?> clazz) { |
| this.value = value; |
| this.expected = expected; |
| this.defaultValue = defaultValue; |
| this.clazz = clazz; |
| } |
| |
| @Test |
| public void testConvert() throws Exception { |
| final Object actual = TypeConverters.convert(value, clazz, defaultValue); |
| final String assertionMessage = "\nGiven: " + value + "\nDefault: " + defaultValue; |
| if (expected != null && expected instanceof char[]) { |
| assertArrayEquals(assertionMessage, (char[]) expected, (char[]) actual); |
| } else if (expected != null && expected instanceof byte[]) { |
| assertArrayEquals(assertionMessage, (byte[]) expected, (byte[]) actual); |
| } else { |
| assertEquals(assertionMessage, expected, actual); |
| }} |
| } |