1
2
3
4
5
6
7
8
9
10
11
12
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
67
68
69
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
81
82
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
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
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 }