1   /**
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2015, QOS.ch. All rights reserved.
4    * <p>
5    * This program and the accompanying materials are dual-licensed under
6    * either the terms of the Eclipse Public License v1.0 as published by
7    * the Eclipse Foundation
8    * <p>
9    * or (per the licensee's choosing)
10   * <p>
11   * under the terms of the GNU Lesser General Public License version 2.1
12   * as published by the Free Software Foundation.
13   */
14  package ch.qos.logback.classic;
15  
16  import ch.qos.logback.classic.turbo.NOPTurboFilter;
17  import ch.qos.logback.core.CoreConstants;
18  import ch.qos.logback.core.status.StatusManager;
19  import org.junit.jupiter.api.BeforeEach;
20  import org.junit.jupiter.api.Test;
21  
22  import static org.junit.jupiter.api.Assertions.*;
23  
24  public class LoggerContextTest {
25      LoggerContext lc;
26  
27      @BeforeEach
28      public void setUp() throws Exception {
29          lc = new LoggerContext();
30          lc.setName("x");
31      }
32  
33      @Test
34      public void testRootGetLogger() {
35          Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
36          assertEquals(Level.DEBUG, root.getLevel());
37          assertEquals(Level.DEBUG, root.getEffectiveLevel());
38      }
39  
40      @Test
41      public void testLoggerX() {
42          Logger x = lc.getLogger("x");
43          assertNotNull(x);
44          assertEquals("x", x.getName());
45          assertNull(x.getLevel());
46          assertEquals(Level.DEBUG, x.getEffectiveLevel());
47      }
48  
49      @Test
50      public void testNull() {
51          try {
52              lc.getLogger((String) null);
53              fail("null should cause an exception");
54          } catch (IllegalArgumentException e) {
55          }
56      }
57  
58      @Test
59      public void testEmpty() {
60          Logger empty = lc.getLogger("");
61          LoggerTestHelper.assertNameEquals(empty, "");
62          LoggerTestHelper.assertLevels(null, empty, Level.DEBUG);
63  
64          Logger dot = lc.getLogger(".");
65          LoggerTestHelper.assertNameEquals(dot, ".");
66          // LoggerTestHelper.assertNameEquals(dot.parent, "");
67          // LoggerTestHelper.assertNameEquals(dot.parent.parent, "root");
68  
69          // assertNull(dot.parent.parent.parent);
70          LoggerTestHelper.assertLevels(null, dot, Level.DEBUG);
71  
72          assertEquals(3, lc.getLoggerList().size());
73      }
74  
75      @Test
76      public void testDotDot() {
77          Logger dotdot = lc.getLogger("..");
78          assertEquals(4, lc.getLoggerList().size());
79          LoggerTestHelper.assertNameEquals(dotdot, "..");
80          // LoggerTestHelper.assertNameEquals(dotdot.parent, ".");
81          // LoggerTestHelper.assertNameEquals(dotdot.parent.parent, "");
82          // LoggerTestHelper.assertNameEquals(dotdot.parent.parent.parent, "root");
83      }
84  
85      int instanceCount() {
86          return lc.getLoggerList().size();
87      }
88  
89      @Test
90      public void testLoggerXY() {
91          assertEquals(1, lc.getLoggerList().size());
92  
93          Logger xy = lc.getLogger("x.y");
94          assertEquals(3, instanceCount());
95          LoggerTestHelper.assertNameEquals(xy, "x.y");
96          LoggerTestHelper.assertLevels(null, xy, Level.DEBUG);
97  
98          Logger x = lc.getLogger("x");
99          assertEquals(3, instanceCount());
100 
101         Logger xy2 = lc.getLogger("x.y");
102         assertEquals(xy, xy2);
103 
104         Logger x2 = lc.getLogger("x");
105         assertEquals(x, x2);
106         assertEquals(3, instanceCount());
107     }
108 
109     @Test
110     public void testLoggerMultipleChildren() {
111         assertEquals(1, instanceCount());
112         Logger xy0 = lc.getLogger("x.y0");
113         LoggerTestHelper.assertNameEquals(xy0, "x.y0");
114 
115         Logger xy1 = lc.getLogger("x.y1");
116         LoggerTestHelper.assertNameEquals(xy1, "x.y1");
117 
118         LoggerTestHelper.assertLevels(null, xy0, Level.DEBUG);
119         LoggerTestHelper.assertLevels(null, xy1, Level.DEBUG);
120         assertEquals(4, instanceCount());
121 
122         for (int i = 0; i < 100; i++) {
123             Logger xy_i = lc.getLogger("x.y" + i);
124             LoggerTestHelper.assertNameEquals(xy_i, "x.y" + i);
125             LoggerTestHelper.assertLevels(null, xy_i, Level.DEBUG);
126         }
127         assertEquals(102, instanceCount());
128     }
129 
130     @Test
131     public void testMultiLevel() {
132         Logger wxyz = lc.getLogger("w.x.y.z");
133         LoggerTestHelper.assertNameEquals(wxyz, "w.x.y.z");
134         LoggerTestHelper.assertLevels(null, wxyz, Level.DEBUG);
135 
136         Logger wx = lc.getLogger("w.x");
137         wx.setLevel(Level.INFO);
138         LoggerTestHelper.assertNameEquals(wx, "w.x");
139         LoggerTestHelper.assertLevels(Level.INFO, wx, Level.INFO);
140         LoggerTestHelper.assertLevels(null, lc.getLogger("w.x.y"), Level.INFO);
141         LoggerTestHelper.assertLevels(null, wxyz, Level.INFO);
142     }
143 
144     @Test
145     public void testStatusWithUnconfiguredContext() {
146         Logger logger = lc.getLogger(LoggerContextTest.class);
147 
148         for (int i = 0; i < 3; i++) {
149             logger.debug("test");
150         }
151 
152         logger = lc.getLogger("x.y.z");
153 
154         for (int i = 0; i < 3; i++) {
155             logger.debug("test");
156         }
157 
158         StatusManager sm = lc.getStatusManager();
159         assertTrue(sm.getCount() == 1, "StatusManager has recieved too many messages");
160     }
161 
162     @Test
163     public void resetTest() {
164 
165         Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
166         Logger a = lc.getLogger("a");
167         Logger ab = lc.getLogger("a.b");
168 
169         ab.setLevel(Level.WARN);
170         root.setLevel(Level.INFO);
171         lc.reset();
172         assertEquals(Level.DEBUG, root.getEffectiveLevel());
173         assertTrue(root.isDebugEnabled());
174         assertEquals(Level.DEBUG, a.getEffectiveLevel());
175         assertEquals(Level.DEBUG, ab.getEffectiveLevel());
176 
177         assertEquals(Level.DEBUG, root.getLevel());
178         assertNull(a.getLevel());
179         assertNull(ab.getLevel());
180     }
181 
182     // http://jira.qos.ch/browse/LBCLASSIC-89
183     @Test
184     public void turboFilterStopOnReset() {
185         NOPTurboFilter nopTF = new NOPTurboFilter();
186         nopTF.start();
187         lc.addTurboFilter(nopTF);
188         assertTrue(nopTF.isStarted());
189         lc.reset();
190         assertFalse(nopTF.isStarted());
191     }
192 
193     @Test
194     public void resetTest_LBCORE_104() {
195         lc.putProperty("keyA", "valA");
196         lc.putObject("keyA", "valA");
197         assertEquals("valA", lc.getProperty("keyA"));
198         assertEquals("valA", lc.getObject("keyA"));
199         lc.reset();
200         assertNull(lc.getProperty("keyA"));
201         assertNull(lc.getObject("keyA"));
202     }
203 
204     @Test
205     public void loggerNameEndingInDotOrDollarShouldWork() {
206         {
207             String loggerName = "toto.x.";
208             Logger logger = lc.getLogger(loggerName);
209             assertEquals(loggerName, logger.getName());
210         }
211 
212         {
213             String loggerName = "toto.x$";
214             Logger logger = lc.getLogger(loggerName);
215             assertEquals(loggerName, logger.getName());
216         }
217     }
218 
219     @Test
220     public void levelResetTest() {
221         Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
222         root.setLevel(Level.TRACE);
223         assertTrue(root.isTraceEnabled());
224         lc.reset();
225         assertFalse(root.isTraceEnabled());
226         assertTrue(root.isDebugEnabled());
227     }
228 
229     @Test
230     public void evaluatorMapPostReset() {
231         lc.reset();
232         assertNotNull(lc.getObject(CoreConstants.EVALUATOR_MAP));
233     }
234 
235     // http://jira.qos.ch/browse/LOGBACK-142
236     @Test
237     public void concurrentModification() {
238         final int runLen = 100;
239         Thread thread = new Thread(new Runnable() {
240             public void run() {
241                 for (int i = 0; i < runLen; i++) {
242                     lc.getLogger("a" + i);
243                     Thread.yield();
244                 }
245             }
246         });
247         thread.start();
248 
249         for (int i = 0; i < runLen; i++) {
250             lc.putProperty("a" + i, "val");
251             Thread.yield();
252         }
253     }
254 
255 }