View Javadoc
1   package org.slf4j.issue;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.assertTrue;
5   
6   import java.util.List;
7   import java.util.concurrent.LinkedBlockingQueue;
8   import java.util.logging.Handler;
9   import java.util.logging.Level;
10  import java.util.logging.LogRecord;
11  
12  import org.junit.After;
13  import org.junit.Before;
14  import org.junit.Test;
15  import org.slf4j.Logger;
16  import org.slf4j.LoggerFactory;
17  import org.slf4j.event.EventConstants;
18  import org.slf4j.event.SubstituteLoggingEvent;
19  import org.slf4j.helpers.SubstituteLogger;
20  import org.slf4j.helpers.SubstituteServiceProvider;
21  import org.slf4j.jul.ListHandler;
22  
23  public class CallerInfoTest {
24      Level oldLevel;
25      java.util.logging.Logger root = java.util.logging.Logger.getLogger("");
26  
27      ListHandler listHandler = new ListHandler();
28  
29      @Before
30      public void setUp() throws Exception {
31          oldLevel = root.getLevel();
32          root.setLevel(Level.FINE);
33          // removeAllHandlers(root);
34          root.addHandler(listHandler);
35      }
36  
37      @After
38      public void tearDown() throws Exception {
39          root.setLevel(oldLevel);
40          removeListHandlers(root);
41      }
42  
43      void removeListHandlers(java.util.logging.Logger logger) {
44          Handler[] handlers = logger.getHandlers();
45          for (Handler h : handlers) {
46              if (h instanceof ListHandler)
47                  logger.removeHandler(h);
48          }
49      }
50  
51      @Test
52      public void testCallerInfo() {
53          Logger logger = LoggerFactory.getLogger("bla");
54          logger.debug("hello");
55  
56          List<LogRecord> recordList = listHandler.recordList;
57  
58          assertEquals(1, recordList.size());
59  
60          LogRecord logRecod = recordList.get(0);
61          assertEquals(this.getClass().getName(), logRecod.getSourceClassName());
62      }
63  
64      // Do we preserve location info using fluent API?
65      // See https://jira.qos.ch/browse/SLF4J-511
66  
67      @Test
68      public void testCallerInfoWithFluentAPI() {
69          Logger logger = LoggerFactory.getLogger("bla");
70          logger.atDebug().log("hello");
71  
72          List<LogRecord> recordList = listHandler.recordList;
73  
74          assertEquals(1, recordList.size());
75  
76          LogRecord logRecod = recordList.get(0);
77          assertEquals(this.getClass().getName(), logRecod.getSourceClassName());
78      }
79  
80      @Test
81      public void testPostInitializationCallerInfoWithSubstituteLogger() {
82          Logger logger = LoggerFactory.getLogger("bla");
83          SubstituteLogger substituteLogger = new SubstituteLogger("bla", null, false);
84          substituteLogger.setDelegate(logger);
85          substituteLogger.debug("hello");
86  
87          List<LogRecord> recordList = listHandler.recordList;
88  
89          assertEquals(1, recordList.size());
90  
91          LogRecord logRecod = recordList.get(0);
92          assertEquals(CallerInfoTest.class.getName(), logRecod.getSourceClassName());
93      }
94  
95      // In this case we KNOW that we CANNOT KNOW the caller
96      @Test
97      public void testIntraInitializationCallerInfoWithSubstituteLogger() throws InterruptedException {
98          SubstituteServiceProvider substituteServiceProvider = new SubstituteServiceProvider();
99          String loggerName = "bkla";
100         substituteServiceProvider.getLoggerFactory().getLogger(loggerName);
101         SubstituteLogger substituteLogger = substituteServiceProvider.getSubstituteLoggerFactory().getLoggers().get(0);
102         assertEquals(loggerName, substituteLogger.getName());
103 
104         substituteLogger.debug("jello");
105         Logger logger = LoggerFactory.getLogger(loggerName);
106         substituteLogger.setDelegate(logger);
107 
108         final LinkedBlockingQueue<SubstituteLoggingEvent> queue = substituteServiceProvider.getSubstituteLoggerFactory().getEventQueue();
109 
110         SubstituteLoggingEvent substituteLoggingEvent = queue.take();
111         assertTrue(substituteLogger.isDelegateEventAware());
112         substituteLogger.log(substituteLoggingEvent);
113 
114         List<LogRecord> recordList = listHandler.recordList;
115 
116         assertEquals(1, recordList.size());
117 
118         LogRecord logRecod = recordList.get(0);
119         assertEquals(EventConstants.NA_SUBST, logRecod.getSourceClassName());
120     }
121 
122 }