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;
11  
12  import static org.junit.Assert.assertEquals;
13  import static org.junit.Assert.assertFalse;
14  import static org.junit.Assert.assertNotNull;
15  import static org.junit.Assert.assertNull;
16  import static org.junit.Assert.assertTrue;
17  import static org.junit.Assert.fail;
18  
19  import org.junit.Before;
20  import org.junit.Test;
21  
22  import ch.qos.logback.classic.turbo.NOPTurboFilter;
23  import ch.qos.logback.core.status.StatusManager;
24  
25  public class LoggerContextTest {
26    LoggerContext lc;
27  
28    @Before
29    public void setUp() throws Exception {
30      Logger.instanceCount = 0;
31      lc = new LoggerContext();
32      lc.setName("x");
33    }
34  
35    @Test
36    public void testRootGetLogger() {
37      Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
38      assertEquals(Level.DEBUG, root.getLevel());
39      assertEquals(Level.DEBUG, root.getEffectiveLevel());
40    }
41  
42    @Test
43    public void testLoggerX() {
44      Logger x = lc.getLogger("x");
45      assertNotNull(x);
46      assertEquals("x", x.getName());
47      assertNull(x.getLevel());
48      assertEquals(Level.DEBUG, x.getEffectiveLevel());
49    }
50  
51    @Test
52    public void testNull() {
53      try {
54        lc.getLogger((String) null);
55        fail("null should cause an exception");
56      } catch (IllegalArgumentException e) {
57      }
58    }
59  
60    @Test
61    public void testEmpty() {
62      Logger empty = lc.getLogger("");
63      LoggerTestHelper.assertNameEquals(empty, "");
64      LoggerTestHelper.assertLevels(null, empty, Level.DEBUG);
65  
66      Logger dot = lc.getLogger(".");
67      LoggerTestHelper.assertNameEquals(dot, ".");
68      // LoggerTestHelper.assertNameEquals(dot.parent, "");
69      // LoggerTestHelper.assertNameEquals(dot.parent.parent, "root");
70  
71      // assertNull(dot.parent.parent.parent);
72      LoggerTestHelper.assertLevels(null, dot, Level.DEBUG);
73  
74      assertEquals(3, Logger.instanceCount);
75    }
76  
77    @Test
78    public void testDotDot() {
79      Logger dotdot = lc.getLogger("..");
80      assertEquals(4, Logger.instanceCount);
81      LoggerTestHelper.assertNameEquals(dotdot, "..");
82      // LoggerTestHelper.assertNameEquals(dotdot.parent, ".");
83      // LoggerTestHelper.assertNameEquals(dotdot.parent.parent, "");
84      // LoggerTestHelper.assertNameEquals(dotdot.parent.parent.parent, "root");
85    }
86  
87    @Test
88    public void testLoggerXY() {
89      assertEquals(1, Logger.instanceCount);
90  
91      Logger xy = lc.getLogger("x.y");
92      assertEquals(3, Logger.instanceCount);
93      LoggerTestHelper.assertNameEquals(xy, "x.y");
94      LoggerTestHelper.assertLevels(null, xy, Level.DEBUG);
95  
96      Logger x = lc.getLogger("x");
97      assertEquals(3, Logger.instanceCount);
98  
99      Logger xy2 = lc.getLogger("x.y");
100     assertEquals(xy, xy2);
101 
102     Logger x2 = lc.getLogger("x");
103     assertEquals(x, x2);
104     assertEquals(3, Logger.instanceCount);
105   }
106 
107   @Test
108   public void testLoggerMultipleChildren() {
109     assertEquals(1, Logger.instanceCount);
110     Logger xy0 = lc.getLogger("x.y0");
111     LoggerTestHelper.assertNameEquals(xy0, "x.y0");
112 
113     Logger xy1 = lc.getLogger("x.y1");
114     LoggerTestHelper.assertNameEquals(xy1, "x.y1");
115 
116     LoggerTestHelper.assertLevels(null, xy0, Level.DEBUG);
117     LoggerTestHelper.assertLevels(null, xy1, Level.DEBUG);
118     assertEquals(4, Logger.instanceCount);
119 
120     for (int i = 0; i < 100; i++) {
121       Logger xy_i = lc.getLogger("x.y" + i);
122       LoggerTestHelper.assertNameEquals(xy_i, "x.y" + i);
123       LoggerTestHelper.assertLevels(null, xy_i, Level.DEBUG);
124     }
125     assertEquals(102, Logger.instanceCount);
126   }
127 
128   @Test
129   public void testMultiLevel() {
130     Logger wxyz = lc.getLogger("w.x.y.z");
131     LoggerTestHelper.assertNameEquals(wxyz, "w.x.y.z");
132     LoggerTestHelper.assertLevels(null, wxyz, Level.DEBUG);
133 
134     Logger wx = lc.getLogger("w.x");
135     wx.setLevel(Level.INFO);
136     LoggerTestHelper.assertNameEquals(wx, "w.x");
137     LoggerTestHelper.assertLevels(Level.INFO, wx, Level.INFO);
138     LoggerTestHelper.assertLevels(null, lc.getLogger("w.x.y"), Level.INFO);
139     LoggerTestHelper.assertLevels(null, wxyz, Level.INFO);
140   }
141 
142   @Test
143   public void testStatusWithUnconfiguredContext() {
144     Logger logger = lc.getLogger(LoggerContextTest.class);
145 
146     for (int i = 0; i < 3; i++) {
147       logger.debug("test");
148     }
149 
150     logger = lc.getLogger("x.y.z");
151 
152     for (int i = 0; i < 3; i++) {
153       logger.debug("test");
154     }
155 
156     StatusManager sm = lc.getStatusManager();
157     assertTrue("StatusManager has recieved too many messages",
158         sm.getCount() == 1);
159   }
160 
161   
162   @Test
163   public void resetTest() {
164 
165     Logger root = lc.getLogger(LoggerContext.ROOT_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     assertEquals(Level.DEBUG, a.getEffectiveLevel());
174     assertEquals(Level.DEBUG, ab.getEffectiveLevel());
175     
176     assertEquals(Level.DEBUG, root.getLevel());    
177     assertNull(a.getLevel());
178     assertNull(ab.getLevel());
179   }
180   
181   // http://jira.qos.ch/browse/LBCLASSIC-89
182   @Test
183   public void turboFilterStopOnReset() {
184     NOPTurboFilter nopTF = new NOPTurboFilter();
185     nopTF.start();
186     lc.addTurboFilter(nopTF);
187     assertTrue(nopTF.isStarted());
188     lc.reset();
189     assertFalse(nopTF.isStarted());
190   }
191 }