| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| // |
| |
| package org.eclipse.jetty.util.log; |
| |
| import static org.hamcrest.Matchers.containsString; |
| import static org.hamcrest.Matchers.is; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.io.PrintStream; |
| import java.io.PrintWriter; |
| import java.io.StringWriter; |
| import java.io.UnsupportedEncodingException; |
| import java.nio.charset.StandardCharsets; |
| import java.util.Properties; |
| |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| /** |
| * Tests for StdErrLog |
| */ |
| public class StdErrLogTest |
| { |
| static |
| { |
| StdErrLog.setTagPad(0); |
| } |
| |
| @Before |
| public void before() |
| { |
| Thread.currentThread().setName("tname"); |
| } |
| |
| @Test |
| public void testStdErrLogFormat() throws UnsupportedEncodingException |
| { |
| StdErrLog log = new StdErrLog(LogTest.class.getName(),new Properties()); |
| StdErrCapture output = new StdErrCapture(log); |
| |
| log.info("testing:{},{}","test","format1"); |
| log.info("testing:{}","test","format2"); |
| log.info("testing","test","format3"); |
| log.info("testing:{},{}","test",null); |
| log.info("testing {} {}",null,null); |
| log.info("testing:{}",null,null); |
| log.info("testing",null,null); |
| |
| System.err.println(output); |
| output.assertContains("INFO:oejul.LogTest:tname: testing:test,format1"); |
| output.assertContains("INFO:oejul.LogTest:tname: testing:test,format1"); |
| output.assertContains("INFO:oejul.LogTest:tname: testing:test format2"); |
| output.assertContains("INFO:oejul.LogTest:tname: testing test format3"); |
| output.assertContains("INFO:oejul.LogTest:tname: testing:test,null"); |
| output.assertContains("INFO:oejul.LogTest:tname: testing null null"); |
| output.assertContains("INFO:oejul.LogTest:tname: testing:null"); |
| output.assertContains("INFO:oejul.LogTest:tname: testing"); |
| } |
| |
| @Test |
| public void testStdErrLogDebug() |
| { |
| StdErrLog log = new StdErrLog("xxx",new Properties()); |
| StdErrCapture output = new StdErrCapture(log); |
| |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| log.debug("testing {} {}","test","debug"); |
| log.info("testing {} {}","test","info"); |
| log.warn("testing {} {}","test","warn"); |
| log.setLevel(StdErrLog.LEVEL_INFO); |
| log.debug("YOU SHOULD NOT SEE THIS!",null,null); |
| |
| // Test for backward compat with old (now deprecated) method |
| Logger before = log.getLogger("before"); |
| log.setDebugEnabled(true); |
| Logger after = log.getLogger("after"); |
| before.debug("testing {} {}","test","debug-before"); |
| log.debug("testing {} {}","test","debug-deprecated"); |
| after.debug("testing {} {}","test","debug-after"); |
| |
| log.setDebugEnabled(false); |
| before.debug("testing {} {}","test","debug-before-false"); |
| log.debug("testing {} {}","test","debug-deprecated-false"); |
| after.debug("testing {} {}","test","debug-after-false"); |
| |
| output.assertContains("DBUG:xxx:tname: testing test debug"); |
| output.assertContains("INFO:xxx:tname: testing test info"); |
| output.assertContains("WARN:xxx:tname: testing test warn"); |
| output.assertNotContains("YOU SHOULD NOT SEE THIS!"); |
| output.assertContains("DBUG:x.before:tname: testing test debug-before"); |
| output.assertContains("DBUG:xxx:tname: testing test debug-deprecated"); |
| output.assertContains("DBUG:x.after:tname: testing test debug-after"); |
| output.assertNotContains("DBUG:x.before:tname: testing test debug-before-false"); |
| output.assertNotContains("DBUG:xxx:tname: testing test debug-deprecated-false"); |
| output.assertNotContains("DBUG:x.after:tname: testing test debug-after-false"); |
| } |
| |
| @Test |
| public void testStdErrLogName() |
| { |
| StdErrLog log = new StdErrLog("test",new Properties()); |
| log.setPrintLongNames(true); |
| StdErrCapture output = new StdErrCapture(log); |
| |
| Assert.assertThat("Log.name", log.getName(), is("test")); |
| Logger next=log.getLogger("next"); |
| Assert.assertThat("Log.name(child)", next.getName(), is("test.next")); |
| next.info("testing {} {}","next","info"); |
| |
| output.assertContains(":test.next:tname: testing next info"); |
| } |
| |
| @Test |
| public void testStdErrThrowable() |
| { |
| // Common Throwable (for test) |
| Throwable th = new Throwable("Message"); |
| |
| // Capture raw string form |
| StringWriter tout = new StringWriter(); |
| th.printStackTrace(new PrintWriter(tout)); |
| String ths = tout.toString(); |
| |
| // Start test |
| StdErrLog log = new StdErrLog("test",new Properties()); |
| StdErrCapture output = new StdErrCapture(log); |
| |
| log.warn("ex",th); |
| output.assertContains(ths); |
| |
| th = new Throwable("Message with \033 escape"); |
| |
| log.warn("ex",th); |
| output.assertNotContains("Message with \033 escape"); |
| log.info(th.toString()); |
| output.assertNotContains("Message with \033 escape"); |
| |
| log.warn("ex",th); |
| output.assertContains("Message with ? escape"); |
| log.info(th.toString()); |
| output.assertContains("Message with ? escape"); |
| } |
| |
| /** |
| * Test to make sure that using a Null parameter on parameterized messages does not result in a NPE |
| * @throws Exception failed test |
| */ |
| @Test |
| public void testParameterizedMessage_NullValues() throws Exception |
| { |
| StdErrLog log = new StdErrLog(StdErrLogTest.class.getName(),new Properties()); |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| log.info("Testing info(msg,null,null) - {} {}","arg0","arg1"); |
| log.info("Testing info(msg,null,null) - {} {}",null,null); |
| log.info("Testing info(msg,null,null) - {}",null,null); |
| log.info("Testing info(msg,null,null)",null,null); |
| log.info(null,"Testing","info(null,arg0,arg1)"); |
| log.info(null,null,null); |
| |
| log.debug("Testing debug(msg,null,null) - {} {}","arg0","arg1"); |
| log.debug("Testing debug(msg,null,null) - {} {}",null,null); |
| log.debug("Testing debug(msg,null,null) - {}",null,null); |
| log.debug("Testing debug(msg,null,null)",null,null); |
| log.debug(null,"Testing","debug(null,arg0,arg1)"); |
| log.debug(null,null,null); |
| |
| log.debug("Testing debug(msg,null)"); |
| log.debug(null,new Throwable("Testing debug(null,thrw)").fillInStackTrace()); |
| |
| log.warn("Testing warn(msg,null,null) - {} {}","arg0","arg1"); |
| log.warn("Testing warn(msg,null,null) - {} {}",null,null); |
| log.warn("Testing warn(msg,null,null) - {}",null,null); |
| log.warn("Testing warn(msg,null,null)",null,null); |
| log.warn(null,"Testing","warn(msg,arg0,arg1)"); |
| log.warn(null,null,null); |
| |
| log.warn("Testing warn(msg,null)"); |
| log.warn(null,new Throwable("Testing warn(msg,thrw)").fillInStackTrace()); |
| } |
| } |
| |
| @Test |
| public void testGetLoggingLevel_Default() |
| { |
| Properties props = new Properties(); |
| |
| // Default Levels |
| Assert.assertEquals("Default Logging Level",StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,null)); |
| Assert.assertEquals("Default Logging Level",StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,"")); |
| Assert.assertEquals("Default Logging Level",StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty")); |
| Assert.assertEquals("Default Logging Level",StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,StdErrLogTest.class.getName())); |
| } |
| |
| @Test |
| public void testGetLoggingLevel_Bad() |
| { |
| Properties props = new Properties(); |
| props.setProperty("log.LEVEL", "WARN"); |
| props.setProperty("org.eclipse.jetty.bad.LEVEL","EXPECTED_BAD_LEVEL"); |
| |
| // Default Level (because of bad level value) |
| Assert.assertEquals("Bad Logging Level",StdErrLog.LEVEL_WARN,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.bad")); |
| } |
| |
| @Test |
| public void testGetLoggingLevel_Lowercase() |
| { |
| Properties props = new Properties(); |
| props.setProperty("log.LEVEL", "warn"); |
| props.setProperty("org.eclipse.jetty.util.LEVEL","info"); |
| |
| // Default Level |
| Assert.assertEquals("Lowercase Level",StdErrLog.LEVEL_WARN,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty")); |
| // Specific Level |
| Assert.assertEquals("Lowercase Level",StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.util")); |
| } |
| |
| @Test |
| public void testGetLoggingLevel_Root() |
| { |
| Properties props = new Properties(); |
| props.setProperty("log.LEVEL","DEBUG"); |
| |
| // Default Levels |
| Assert.assertEquals("Default Logging Level",StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,null)); |
| Assert.assertEquals("Default Logging Level",StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,"")); |
| Assert.assertEquals("Default Logging Level",StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty")); |
| Assert.assertEquals("Default Logging Level",StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,StdErrLogTest.class.getName())); |
| } |
| |
| @Test |
| public void testGetLoggingLevel_FQCN() |
| { |
| String name = StdErrLogTest.class.getName(); |
| Properties props = new Properties(); |
| props.setProperty(name + ".LEVEL","ALL"); |
| |
| // Default Levels |
| Assert.assertEquals(StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,null)); |
| Assert.assertEquals(StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,"")); |
| Assert.assertEquals(StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty")); |
| |
| // Specified Level |
| Assert.assertEquals(StdErrLog.LEVEL_ALL,StdErrLog.getLoggingLevel(props,name)); |
| } |
| |
| @Test |
| public void testGetLoggingLevel_UtilLevel() |
| { |
| Properties props = new Properties(); |
| props.setProperty("org.eclipse.jetty.util.LEVEL","DEBUG"); |
| |
| // Default Levels |
| Assert.assertEquals(StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,null)); |
| Assert.assertEquals(StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,"")); |
| Assert.assertEquals(StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty")); |
| Assert.assertEquals(StdErrLog.LEVEL_INFO,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.server.BogusObject")); |
| |
| // Configured Level |
| Assert.assertEquals(StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,StdErrLogTest.class.getName())); |
| Assert.assertEquals(StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.util.Bogus")); |
| Assert.assertEquals(StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.util")); |
| Assert.assertEquals(StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.util.resource.FileResource")); |
| } |
| |
| @Test |
| public void testGetLoggingLevel_MixedLevels() |
| { |
| Properties props = new Properties(); |
| props.setProperty("log.LEVEL","DEBUG"); |
| props.setProperty("org.eclipse.jetty.util.LEVEL","WARN"); |
| props.setProperty("org.eclipse.jetty.util.ConcurrentHashMap.LEVEL","ALL"); |
| |
| // Default Levels |
| Assert.assertEquals(StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,null)); |
| Assert.assertEquals(StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,"")); |
| Assert.assertEquals(StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty")); |
| Assert.assertEquals(StdErrLog.LEVEL_DEBUG,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.server.ServerObject")); |
| |
| // Configured Level |
| Assert.assertEquals(StdErrLog.LEVEL_WARN,StdErrLog.getLoggingLevel(props,StdErrLogTest.class.getName())); |
| Assert.assertEquals(StdErrLog.LEVEL_WARN,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.util.MagicUtil")); |
| Assert.assertEquals(StdErrLog.LEVEL_WARN,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.util")); |
| Assert.assertEquals(StdErrLog.LEVEL_WARN,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.util.resource.FileResource")); |
| Assert.assertEquals(StdErrLog.LEVEL_ALL,StdErrLog.getLoggingLevel(props,"org.eclipse.jetty.util.ConcurrentHashMap")); |
| } |
| |
| /** |
| * Tests StdErrLog.warn() methods with level filtering. |
| * <p> |
| * Should always see WARN level messages, regardless of set level. |
| * @throws UnsupportedEncodingException failed test |
| */ |
| @Test |
| public void testWarnFiltering() throws UnsupportedEncodingException |
| { |
| StdErrLog log = new StdErrLog(StdErrLogTest.class.getName(),new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| StdErrCapture output = new StdErrCapture(log); |
| |
| // Start with default level |
| log.warn("See Me"); |
| |
| // Set to debug level |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| log.warn("Hear Me"); |
| |
| // Set to warn level |
| log.setLevel(StdErrLog.LEVEL_WARN); |
| log.warn("Cheer Me"); |
| |
| log.warn("<zoom>", new Throwable("out of focus")); |
| log.warn(new Throwable("scene lost")); |
| |
| // Validate Output |
| // System.err.print(output); |
| output.assertContains("See Me"); |
| output.assertContains("Hear Me"); |
| output.assertContains("Cheer Me"); |
| |
| // Validate Stack Traces |
| output.assertContains(".StdErrLogTest:tname: <zoom>"); |
| output.assertContains("java.lang.Throwable: out of focus"); |
| output.assertContains("java.lang.Throwable: scene lost"); |
| } |
| } |
| |
| /** |
| * Tests StdErrLog.info() methods with level filtering. |
| * <p> |
| * Should only see INFO level messages when level is set to {@link StdErrLog#LEVEL_INFO} and below. |
| * @throws Exception failed test |
| */ |
| @Test |
| public void testInfoFiltering() throws Exception |
| { |
| StdErrLog log = new StdErrLog(StdErrLogTest.class.getName(),new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| StdErrCapture output = new StdErrCapture(log); |
| |
| // Normal/Default behavior |
| log.info("I will not buy"); |
| |
| // Level Debug |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| log.info("this record"); |
| |
| // Level All |
| log.setLevel(StdErrLog.LEVEL_ALL); |
| log.info("it is scratched."); |
| |
| log.info("<zoom>", new Throwable("out of focus")); |
| log.info(new Throwable("scene lost")); |
| |
| // Level Warn |
| log.setLevel(StdErrLog.LEVEL_WARN); |
| log.info("sorry?"); |
| log.info("<spoken line>", new Throwable("on editing room floor")); |
| |
| // Validate Output |
| output.assertContains("I will not buy"); |
| output.assertContains("this record"); |
| output.assertContains("it is scratched."); |
| output.assertNotContains("sorry?"); |
| |
| // Validate Stack Traces |
| output.assertNotContains("<spoken line>"); |
| output.assertNotContains("on editing room floor"); |
| |
| output.assertContains(".StdErrLogTest:tname: <zoom>"); |
| output.assertContains("java.lang.Throwable: out of focus"); |
| output.assertContains("java.lang.Throwable: scene lost"); |
| } |
| } |
| |
| /** |
| * Tests {@link StdErrLog#LEVEL_OFF} filtering. |
| * @throws Exception failed test |
| */ |
| @Test |
| public void testOffFiltering() throws Exception |
| { |
| StdErrLog log = new StdErrLog(StdErrLogTest.class.getName(),new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| log.setLevel(StdErrLog.LEVEL_OFF); |
| |
| StdErrCapture output = new StdErrCapture(log); |
| |
| // Various logging events |
| log.debug("Squelch"); |
| log.debug("Squelch", new RuntimeException("Squelch")); |
| log.info("Squelch"); |
| log.info("Squelch", new IllegalStateException("Squelch")); |
| log.warn("Squelch"); |
| log.warn("Squelch", new Exception("Squelch")); |
| log.ignore(new Throwable("Squelch")); |
| |
| // Validate Output |
| output.assertNotContains("Squelch"); |
| } |
| } |
| |
| /** |
| * Tests StdErrLog.debug() methods with level filtering. |
| * <p> |
| * Should only see DEBUG level messages when level is set to {@link StdErrLog#LEVEL_DEBUG} and below. |
| * @throws Exception failed test |
| */ |
| @Test |
| public void testDebugFiltering() throws Exception |
| { |
| StdErrLog log = new StdErrLog(StdErrLogTest.class.getName(),new Properties()); |
| try(StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| StdErrCapture output = new StdErrCapture(log); |
| |
| // Normal/Default behavior |
| log.debug("Tobacconist"); |
| log.debug("<spoken line>", new Throwable("on editing room floor")); |
| |
| // Level Debug |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| log.debug("my hovercraft is"); |
| |
| log.debug("<zoom>", new Throwable("out of focus")); |
| log.debug(new Throwable("scene lost")); |
| |
| // Level All |
| log.setLevel(StdErrLog.LEVEL_ALL); |
| log.debug("full of eels."); |
| |
| // Level Warn |
| log.setLevel(StdErrLog.LEVEL_WARN); |
| log.debug("what?"); |
| |
| // Validate Output |
| // System.err.print(output); |
| output.assertNotContains("Tobacconist"); |
| output.assertContains("my hovercraft is"); |
| output.assertContains("full of eels."); |
| output.assertNotContains("what?"); |
| |
| // Validate Stack Traces |
| output.assertNotContains("<spoken line>"); |
| output.assertNotContains("on editing room floor"); |
| |
| output.assertContains(".StdErrLogTest:tname: <zoom>"); |
| output.assertContains("java.lang.Throwable: out of focus"); |
| output.assertContains("java.lang.Throwable: scene lost"); |
| } |
| } |
| |
| /** |
| * Tests StdErrLog with {@link Logger#ignore(Throwable)} use. |
| * <p> |
| * Should only see IGNORED level messages when level is set to {@link StdErrLog#LEVEL_ALL}. |
| * @throws Exception failed test |
| */ |
| @Test |
| public void testIgnores() throws Exception |
| { |
| StdErrLog log = new StdErrLog(StdErrLogTest.class.getName(),new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| StdErrCapture output = new StdErrCapture(log); |
| |
| // Normal/Default behavior |
| log.ignore(new Throwable("IGNORE ME")); |
| |
| // Show Ignored |
| log.setLevel(StdErrLog.LEVEL_ALL); |
| log.ignore(new Throwable("Don't ignore me")); |
| |
| // Set to Debug level |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| log.ignore(new Throwable("Debug me")); |
| |
| // Validate Output |
| // System.err.print(output); |
| output.assertNotContains("IGNORE ME"); |
| output.assertContains("Don't ignore me"); |
| output.assertNotContains("Debug me"); |
| } |
| } |
| |
| @Test |
| public void testIsDebugEnabled() throws Exception |
| { |
| StdErrLog log = new StdErrLog(StdErrLogTest.class.getName(),new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| log.setLevel(StdErrLog.LEVEL_ALL); |
| Assert.assertThat("log.level(all).isDebugEnabled", log.isDebugEnabled(), is(true)); |
| |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| Assert.assertThat("log.level(debug).isDebugEnabled", log.isDebugEnabled(), is(true)); |
| |
| log.setLevel(StdErrLog.LEVEL_INFO); |
| Assert.assertThat("log.level(info).isDebugEnabled", log.isDebugEnabled(), is(false)); |
| |
| log.setLevel(StdErrLog.LEVEL_WARN); |
| Assert.assertThat("log.level(warn).isDebugEnabled", log.isDebugEnabled(), is(false)); |
| |
| log.setLevel(StdErrLog.LEVEL_OFF); |
| Assert.assertThat("log.level(off).isDebugEnabled", log.isDebugEnabled(), is(false)); |
| } |
| } |
| |
| @Test |
| public void testSetGetLevel() |
| { |
| StdErrLog log = new StdErrLog(StdErrLogTest.class.getName(),new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| log.setLevel(StdErrLog.LEVEL_ALL); |
| Assert.assertThat("log.level(all).getLevel()", log.getLevel(), is(StdErrLog.LEVEL_ALL)); |
| |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| Assert.assertThat("log.level(debug).getLevel()", log.getLevel(), is(StdErrLog.LEVEL_DEBUG)); |
| |
| log.setLevel(StdErrLog.LEVEL_INFO); |
| Assert.assertThat("log.level(info).getLevel()", log.getLevel(), is(StdErrLog.LEVEL_INFO)); |
| |
| log.setLevel(StdErrLog.LEVEL_WARN); |
| Assert.assertThat("log.level(warn).getLevel()", log.getLevel(), is(StdErrLog.LEVEL_WARN)); |
| |
| log.setLevel(StdErrLog.LEVEL_OFF); |
| Assert.assertThat("log.level(off).getLevel()", log.getLevel(), is(StdErrLog.LEVEL_OFF)); |
| } |
| } |
| |
| @Test |
| public void testGetChildLogger_Simple() |
| { |
| String baseName = "jetty"; |
| StdErrLog log = new StdErrLog(baseName,new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| Assert.assertThat("Logger.name", log.getName(), is("jetty")); |
| |
| Logger log2 = log.getLogger("child"); |
| Assert.assertThat("Logger.child.name", log2.getName(), is("jetty.child")); |
| } |
| } |
| |
| @Test |
| public void testGetChildLogger_Deep() |
| { |
| String baseName = "jetty"; |
| StdErrLog log = new StdErrLog(baseName,new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| Assert.assertThat("Logger.name", log.getName(), is("jetty")); |
| |
| Logger log2 = log.getLogger("child.of.the.sixties"); |
| Assert.assertThat("Logger.child.name", log2.getName(), is("jetty.child.of.the.sixties")); |
| } |
| } |
| |
| @Test |
| public void testGetChildLogger_Null() |
| { |
| String baseName = "jetty"; |
| StdErrLog log = new StdErrLog(baseName,new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| Assert.assertThat("Logger.name", log.getName(), is("jetty")); |
| |
| // Pass null as child reference, should return parent logger |
| Logger log2 = log.getLogger((String)null); |
| Assert.assertThat("Logger.child.name", log2.getName(), is("jetty")); |
| Assert.assertSame("Should have returned same logger", log2, log); |
| } |
| } |
| |
| @Test |
| public void testGetChildLogger_EmptyName() |
| { |
| String baseName = "jetty"; |
| StdErrLog log = new StdErrLog(baseName,new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| Assert.assertThat("Logger.name", log.getName(), is("jetty")); |
| |
| // Pass empty name as child reference, should return parent logger |
| Logger log2 = log.getLogger(""); |
| Assert.assertThat("Logger.child.name", log2.getName(), is("jetty")); |
| Assert.assertSame("Should have returned same logger", log2, log); |
| } |
| } |
| |
| @Test |
| public void testGetChildLogger_EmptyNameSpaces() |
| { |
| String baseName = "jetty"; |
| StdErrLog log = new StdErrLog(baseName,new Properties()); |
| try (StacklessLogging stackless = new StacklessLogging(log)) |
| { |
| Assert.assertThat("Logger.name", log.getName(), is("jetty")); |
| |
| // Pass empty name as child reference, should return parent logger |
| Logger log2 = log.getLogger(" "); |
| Assert.assertThat("Logger.child.name", log2.getName(), is("jetty")); |
| Assert.assertSame("Should have returned same logger", log2, log); |
| } |
| } |
| |
| @Test |
| public void testGetChildLogger_NullParent() |
| { |
| AbstractLogger log = new StdErrLog(null,new Properties()); |
| |
| Assert.assertThat("Logger.name", log.getName(), is("")); |
| |
| Logger log2 = log.getLogger("jetty"); |
| Assert.assertThat("Logger.child.name", log2.getName(), is("jetty")); |
| Assert.assertNotSame("Should have returned same logger", log2, log); |
| } |
| |
| @Test |
| public void testToString() |
| { |
| StdErrLog log = new StdErrLog("jetty",new Properties()); |
| |
| log.setLevel(StdErrLog.LEVEL_ALL); |
| Assert.assertThat("Logger.toString", log.toString(), is("StdErrLog:jetty:LEVEL=ALL")); |
| |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| Assert.assertThat("Logger.toString", log.toString(), is("StdErrLog:jetty:LEVEL=DEBUG")); |
| |
| log.setLevel(StdErrLog.LEVEL_INFO); |
| Assert.assertThat("Logger.toString", log.toString(), is("StdErrLog:jetty:LEVEL=INFO")); |
| |
| log.setLevel(StdErrLog.LEVEL_WARN); |
| Assert.assertThat("Logger.toString", log.toString(), is("StdErrLog:jetty:LEVEL=WARN")); |
| |
| log.setLevel(99); // intentionally bogus level |
| Assert.assertThat("Logger.toString", log.toString(), is("StdErrLog:jetty:LEVEL=?")); |
| } |
| |
| @Test |
| public void testPrintSource() throws UnsupportedEncodingException |
| { |
| Properties props=new Properties(); |
| props.put("test.SOURCE","true"); |
| StdErrLog log = new StdErrLog("test",props); |
| log.setLevel(StdErrLog.LEVEL_DEBUG); |
| |
| ByteArrayOutputStream test = new ByteArrayOutputStream(); |
| PrintStream err = new PrintStream(test); |
| log.setStdErrStream(err); |
| |
| log.debug("Show me the source!"); |
| |
| String output = new String(test.toByteArray(), StandardCharsets.UTF_8); |
| // System.err.print(output); |
| |
| Assert.assertThat(output, containsString(".StdErrLogTest#testPrintSource(StdErrLogTest.java:")); |
| |
| |
| props.put("test.SOURCE","false"); |
| log=new StdErrLog("other",props); |
| } |
| |
| @Test |
| public void testConfiguredAndSetDebugEnabled() |
| { |
| Properties props = new Properties(); |
| props.setProperty("org.eclipse.jetty.util.LEVEL","WARN"); |
| props.setProperty("org.eclipse.jetty.io.LEVEL", "WARN"); |
| |
| StdErrLog root = new StdErrLog("", props); |
| assertLevel(root,StdErrLog.LEVEL_INFO); // default |
| |
| StdErrLog log = (StdErrLog)root.getLogger(StdErrLogTest.class.getName()); |
| Assert.assertThat("Log.isDebugEnabled()", log.isDebugEnabled(), is(false)); |
| assertLevel(log,StdErrLog.LEVEL_WARN); // as configured |
| |
| // Boot stomp it all to debug |
| root.setDebugEnabled(true); |
| Assert.assertThat("Log.isDebugEnabled()", log.isDebugEnabled(), is(true)); |
| assertLevel(log,StdErrLog.LEVEL_DEBUG); // as stomped |
| |
| // Restore configured |
| root.setDebugEnabled(false); |
| Assert.assertThat("Log.isDebugEnabled()", log.isDebugEnabled(), is(false)); |
| assertLevel(log,StdErrLog.LEVEL_WARN); // as configured |
| } |
| |
| @Test |
| public void testSuppressed() |
| { |
| StdErrLog log = new StdErrLog("xxx",new Properties()); |
| StdErrCapture output = new StdErrCapture(log); |
| |
| Exception inner = new Exception("inner"); |
| inner.addSuppressed( new IllegalStateException(){{addSuppressed(new Exception("branch0"));}}); |
| IOException outer = new IOException("outer",inner); |
| |
| outer.addSuppressed( new IllegalStateException(){{addSuppressed(new Exception("branch1"));}}); |
| outer.addSuppressed( new IllegalArgumentException(){{addSuppressed(new Exception("branch2"));}}); |
| |
| log.warn("problem",outer); |
| |
| output.assertContains("\t|\t|java.lang.Exception: branch2"); |
| output.assertContains("\t|\t|java.lang.Exception: branch1"); |
| output.assertContains("\t|\t|java.lang.Exception: branch0"); |
| } |
| |
| private void assertLevel(StdErrLog log, int expectedLevel) |
| { |
| Assert.assertThat("Log[" + log.getName() + "].level",levelToString(log.getLevel()),is(levelToString(expectedLevel))); |
| } |
| |
| private String levelToString(int level) |
| { |
| switch (level) |
| { |
| case StdErrLog.LEVEL_ALL: |
| return "ALL"; |
| case StdErrLog.LEVEL_DEBUG: |
| return "DEBUG"; |
| case StdErrLog.LEVEL_INFO: |
| return "INFO"; |
| case StdErrLog.LEVEL_WARN: |
| return "WARN"; |
| default: |
| return Integer.toString(level); |
| } |
| } |
| } |