1   /**
2    * Logback: the generic, reliable, fast and flexible logging framework.
3    * 
4    * Copyright (C) 2000-2008, QOS.ch
5    * 
6    * This library is free software, you can redistribute it and/or modify it under
7    * the terms of the GNU Lesser General Public License as published by the Free
8    * Software Foundation.
9    */
10  package ch.qos.logback.classic.joran;
11  
12  import static org.junit.Assert.assertEquals;
13  import static org.junit.Assert.assertNotNull;
14  import static org.junit.Assert.assertTrue;
15  
16  import org.junit.Test;
17  import org.slf4j.MDC;
18  
19  import ch.qos.logback.classic.Level;
20  import ch.qos.logback.classic.Logger;
21  import ch.qos.logback.classic.LoggerContext;
22  import ch.qos.logback.classic.spi.LoggingEvent;
23  import ch.qos.logback.classic.turbo.DebugUsersTurboFilter;
24  import ch.qos.logback.classic.turbo.NOPTurboFilter;
25  import ch.qos.logback.classic.turbo.TurboFilter;
26  import ch.qos.logback.classic.util.TeztConstants;
27  import ch.qos.logback.core.CoreConstants;
28  import ch.qos.logback.core.joran.spi.JoranException;
29  import ch.qos.logback.core.read.ListAppender;
30  import ch.qos.logback.core.testUtil.StringListAppender;
31  
32  public class JoranConfiguratorTest {
33  
34    LoggerContext loggerContext = new LoggerContext();
35    Logger logger = loggerContext.getLogger(this.getClass().getName());
36    Logger root = loggerContext.getLogger(LoggerContext.ROOT_NAME);
37  
38    void configure(String file) throws JoranException {
39      JoranConfigurator jc = new JoranConfigurator();
40      jc.setContext(loggerContext);
41      jc.doConfigure(file);
42    }
43  
44    @Test
45    public void testSimpleList() throws JoranException {
46      configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/simpleList.xml");
47  
48      Logger logger = loggerContext.getLogger(this.getClass().getName());
49      Logger root = loggerContext.getLogger(LoggerContext.ROOT_NAME);
50      ListAppender listAppender = (ListAppender) root.getAppender("LIST");
51      assertEquals(0, listAppender.list.size());
52      String msg = "hello world";
53      logger.debug(msg);
54      assertEquals(1, listAppender.list.size());
55      LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
56      assertEquals(msg, le.getMessage());
57    }
58  
59    @Test
60    public void testLevel() throws JoranException {
61      configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/simpleLevel.xml");
62      ListAppender listAppender = (ListAppender) root.getAppender("LIST");
63      assertEquals(0, listAppender.list.size());
64      String msg = "hello world";
65      logger.debug(msg);
66      assertEquals(0, listAppender.list.size());
67    }
68  
69    @Test
70    public void testRootLoggerLevelSettingBySystemProperty() throws JoranException {
71      String propertyName = "logback.level";
72     
73      System.setProperty(propertyName, "INFO");
74      configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/rootLevelByProperty.xml");
75      //StatusPrinter.print(loggerContext);
76      ListAppender listAppender = (ListAppender) root.getAppender("LIST");
77      assertEquals(0, listAppender.list.size());
78      String msg = "hello world";
79      logger.debug(msg);
80      assertEquals(0, listAppender.list.size());
81      System.clearProperty(propertyName);
82    }
83    
84    @Test
85    public void testLoggerLevelSettingBySystemProperty() throws JoranException {
86      String propertyName = "logback.level";
87     
88      System.setProperty(propertyName, "DEBUG");
89      configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/loggerLevelByProperty.xml");
90      //StatusPrinter.print(loggerContext);
91      ListAppender listAppender = (ListAppender) root.getAppender("LIST");
92      assertEquals(0, listAppender.list.size());
93      String msg = "hello world";
94      logger.debug(msg);
95      assertEquals(1, listAppender.list.size());
96      System.clearProperty(propertyName);
97    }
98    
99    @Test
100   public void testStatusListener() throws JoranException {
101     configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/statusListener.xml");
102     //StatusPrinter.print(loggerContext);
103   }
104 
105   @Test
106   public void contextRename() throws JoranException {
107     loggerContext.setName(CoreConstants.DEFAULT_CONTEXT_NAME);
108     configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/contextRename.xml");
109     assertEquals("wombat", loggerContext.getName());
110   }
111   
112   @Test
113   public void testEval() throws JoranException {
114     configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/callerData.xml");
115 
116     String msg = "hello world";
117     logger.debug("toto");
118     logger.debug(msg);
119 
120     StringListAppender<LoggingEvent> slAppender = (StringListAppender<LoggingEvent>) loggerContext
121         .getLogger("root").getAppender("STR_LIST");
122     assertNotNull(slAppender);
123     assertEquals(2, slAppender.strList.size());
124     assertTrue(slAppender.strList.get(0).contains(" DEBUG - toto"));
125     
126     String str1 = slAppender.strList.get(1);
127     assertTrue(str1.contains("Caller+0"));
128     assertTrue(str1.contains(" DEBUG - hello world"));
129   }
130 
131   @Test
132   public void testTurboFilter() throws JoranException {
133     // Although this test uses turbo filters, it only checks
134     // that Joran can see the xml element and create
135     // and place the relevant object correctly.
136     configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/turbo.xml");
137 
138     TurboFilter filter = loggerContext.getTurboFilterList().get(0);
139     assertTrue(filter instanceof NOPTurboFilter);
140   }
141 
142   @Test
143   public void testTurboFilterWithStringList() throws JoranException {
144     // Although this test uses turbo filters, it only checks
145     // that Joran can see <user> elements, and behave correctly
146     // that is call the addUser method and pass the correct values
147     // to that method.
148     configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/turbo2.xml");
149 
150     // StatusPrinter.print(loggerContext.getStatusManager());
151 
152     TurboFilter filter = loggerContext.getTurboFilterList().get(0);
153     assertTrue(filter instanceof DebugUsersTurboFilter);
154     DebugUsersTurboFilter dutf = (DebugUsersTurboFilter) filter;
155     assertEquals(2, dutf.getUsers().size());
156   }
157 
158   @Test
159   public void testLevelFilter() throws JoranException {
160     configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/levelFilter.xml");
161 
162     //StatusPrinter.print(loggerContext);
163 
164     logger.warn("hello");
165     logger.error("to be ignored");
166 
167     @SuppressWarnings("unchecked")
168     ListAppender<LoggingEvent> listAppender = (ListAppender) root
169         .getAppender("LIST");
170 
171     assertNotNull(listAppender);
172     assertEquals(1, listAppender.list.size());
173     LoggingEvent back = listAppender.list.get(0);
174     assertEquals(Level.WARN, back.getLevel());
175     assertEquals("hello", back.getMessage());
176   }
177 
178   @Test
179   public void testEvaluatorFilter() throws JoranException {
180     configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/evaluatorFilter.xml");
181 
182     //StatusPrinter.print(loggerContext);
183 
184     logger.warn("hello");
185     logger.error("to be ignored");
186 
187     @SuppressWarnings("unchecked")
188     ListAppender<LoggingEvent> listAppender = (ListAppender) root
189         .getAppender("LIST");
190 
191     assertNotNull(listAppender);
192     assertEquals(1, listAppender.list.size());
193     LoggingEvent back = listAppender.list.get(0);
194     assertEquals(Level.WARN, back.getLevel());
195     assertEquals("hello", back.getMessage());
196   }
197 
198   @Test
199   public void testTurboDynamicThreshold() throws JoranException {
200     configure(TeztConstants.TEST_DIR_PREFIX
201         + "input/joran/turboDynamicThreshold.xml");
202 
203     ListAppender listAppender = (ListAppender) root.getAppender("LIST");
204     assertEquals(0, listAppender.list.size());
205 
206     // this one should be denied
207     MDC.put("userId", "user1");
208     logger.debug("hello user1");
209     // this one should log
210     MDC.put("userId", "user2");
211     logger.debug("hello user2");
212 
213     assertEquals(1, listAppender.list.size());
214     LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
215     assertEquals("hello user2", le.getMessage());
216   }
217 
218   @Test
219   public void testTurboDynamicThreshold2() throws JoranException {
220     configure(TeztConstants.TEST_DIR_PREFIX
221         + "input/joran/turboDynamicThreshold2.xml");
222 
223     ListAppender listAppender = (ListAppender) root.getAppender("LIST");
224     assertEquals(0, listAppender.list.size());
225 
226     // this one should log
227     MDC.put("userId", "user1");
228     logger.debug("hello user1");
229     // this one should log
230     MDC.put("userId", "user2");
231     logger.debug("hello user2");
232     // this one should fail
233     MDC.put("userId", "user3");
234     logger.debug("hello user3");
235 
236     assertEquals(2, listAppender.list.size());
237     LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
238     assertEquals("hello user1", le.getMessage());
239     le = (LoggingEvent) listAppender.list.get(1);
240     assertEquals("hello user2", le.getMessage());
241   }
242 }