blob: ad18fc4411834dd5b3ac1a1e6c01631e3da1f614 [file] [log] [blame]
//
// ========================================================================
// 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);
}
}
}