View Javadoc
1   package uk.org.lidalia.slf4jtest;
2   
3   import java.util.Collections;
4   import java.util.HashMap;
5   import java.util.List;
6   import java.util.Map;
7   import java.util.Set;
8   import java.util.concurrent.atomic.AtomicReference;
9   
10  import org.apache.commons.lang3.RandomStringUtils;
11  import org.junit.After;
12  import org.junit.Before;
13  import org.junit.Rule;
14  import org.junit.Test;
15  import org.slf4j.MDC;
16  import org.slf4j.Marker;
17  
18  import com.google.common.base.Function;
19  import com.google.common.collect.ImmutableMap;
20  import com.google.common.collect.ImmutableSet;
21  import com.google.common.collect.Lists;
22  
23  import uk.org.lidalia.slf4jext.Level;
24  import uk.org.lidalia.slf4jext.Logger;
25  import uk.org.lidalia.test.SystemOutputRule;
26  
27  import static com.google.common.collect.Sets.difference;
28  import static com.google.common.collect.Sets.newHashSet;
29  import static java.util.Arrays.asList;
30  import static java.util.Collections.EMPTY_LIST;
31  import static org.hamcrest.CoreMatchers.containsString;
32  import static org.hamcrest.Matchers.is;
33  import static org.hamcrest.Matchers.isEmptyString;
34  import static org.junit.Assert.assertEquals;
35  import static org.junit.Assert.assertFalse;
36  import static org.junit.Assert.assertThat;
37  import static org.junit.Assert.assertTrue;
38  import static org.mockito.Mockito.mock;
39  import static uk.org.lidalia.slf4jext.Level.DEBUG;
40  import static uk.org.lidalia.slf4jext.Level.ERROR;
41  import static uk.org.lidalia.slf4jext.Level.INFO;
42  import static uk.org.lidalia.slf4jext.Level.TRACE;
43  import static uk.org.lidalia.slf4jext.Level.WARN;
44  import static uk.org.lidalia.slf4jext.Level.enablableValueSet;
45  import static uk.org.lidalia.slf4jtest.LoggingEvent.debug;
46  import static uk.org.lidalia.slf4jtest.LoggingEvent.error;
47  import static uk.org.lidalia.slf4jtest.LoggingEvent.info;
48  import static uk.org.lidalia.slf4jtest.LoggingEvent.trace;
49  import static uk.org.lidalia.slf4jtest.LoggingEvent.warn;
50  
51  public class TestLoggerTests {
52  
53      private static final String LOGGER_NAME = "uk.org";
54      private final TestLogger testLogger = new TestLogger(LOGGER_NAME, TestLoggerFactory.getInstance());
55      private final Marker marker = mock(Marker.class);
56      private final String message = "message {} {} {}";
57      private final Object arg1 = "arg1";
58      private final Object arg2 = "arg2";
59      private final Object[] args = new Object[]{arg1, arg2, "arg3"};
60      private final Throwable throwable = new Throwable();
61      private final Object[] argsWithThrowable = new Object[]{arg1, arg2, "arg3", throwable};
62  
63      private final Map<String, String> mdcValues = new HashMap<>();
64  
65      @Rule public SystemOutputRule systemOutputRule = new SystemOutputRule();
66  
67      @Before
68      public void setUp() {
69          mdcValues.put("key1", "value1");
70          mdcValues.put("key2", "value2");
71          MDC.setContextMap(mdcValues);
72      }
73  
74      @After
75      public void tearDown() {
76          MDC.clear();
77          TestLoggerFactory.getInstance().setPrintLevel(Level.OFF);
78      }
79  
80      @Test
81      public void name() {
82          String name = RandomStringUtils.random(10);
83          TestLogger logger = new TestLogger(name, TestLoggerFactory.getInstance());
84          assertEquals(name, logger.getName());
85      }
86  
87      @Test
88      public void clearRemovesEvents() {
89          testLogger.debug("message1");
90          testLogger.debug("message2");
91          assertEquals(asList(debug(mdcValues, "message1"), debug(mdcValues, "message2")), testLogger.getLoggingEvents());
92          testLogger.clear();
93          assertEquals(Collections.emptyList(), testLogger.getLoggingEvents());
94      }
95  
96      @Test
97      public void clearResetsLevel() {
98          testLogger.setEnabledLevels();
99          testLogger.clear();
100         assertEquals(newHashSet(TRACE, DEBUG, INFO, WARN, ERROR), testLogger.getEnabledLevels());
101     }
102 
103     @Test
104     public void traceEnabled() {
105         assertEnabledReturnsCorrectly(TRACE);
106     }
107 
108     @Test
109     public void traceMessage() {
110         testLogger.trace(message);
111 
112         assertEquals(asList(trace(mdcValues, message)), testLogger.getLoggingEvents());
113     }
114 
115     @Test
116     public void traceMessageOneArg() {
117         testLogger.trace(message, arg1);
118 
119         assertEquals(asList(trace(mdcValues, message, arg1)), testLogger.getLoggingEvents());
120     }
121 
122     @Test
123     public void traceMessageTwoArgs() {
124         testLogger.trace(message, arg1, arg2);
125 
126         assertEquals(asList(trace(mdcValues, message, arg1, arg2)), testLogger.getLoggingEvents());
127     }
128 
129     @Test
130     public void traceMessageManyArgs() {
131         testLogger.trace(message, args);
132 
133         assertEquals(asList(trace(mdcValues, message, args)), testLogger.getLoggingEvents());
134     }
135 
136     @Test
137     public void traceMessageManyArgsWithThrowable() {
138         testLogger.trace(message, argsWithThrowable);
139 
140         assertEquals(asList(trace(mdcValues, throwable, message, args)), testLogger.getLoggingEvents());
141     }
142 
143     @Test
144     public void traceMessageThrowable() {
145         testLogger.trace(message, throwable);
146 
147         assertEquals(asList(trace(mdcValues, throwable, message)), testLogger.getLoggingEvents());
148     }
149 
150     @Test
151     public void traceEnabledMarker() {
152         assertEnabledReturnsCorrectly(TRACE, marker);
153     }
154 
155     @Test
156     public void traceMarkerMessage() {
157         testLogger.trace(marker, message);
158 
159         assertEquals(asList(trace(mdcValues, marker, message)), testLogger.getLoggingEvents());
160     }
161 
162     @Test
163     public void traceMarkerMessageOneArg() {
164         testLogger.trace(marker, message, arg1);
165 
166         assertEquals(asList(trace(mdcValues, marker, message, arg1)), testLogger.getLoggingEvents());
167     }
168 
169     @Test
170     public void traceMarkerMessageTwoArgs() {
171         testLogger.trace(marker, message, arg1, arg2);
172 
173         assertEquals(asList(trace(mdcValues, marker, message, arg1, arg2)), testLogger.getLoggingEvents());
174     }
175 
176     @Test
177     public void traceMarkerMessageManyArgs() {
178         testLogger.trace(marker, message, args);
179 
180         assertEquals(asList(trace(mdcValues, marker, message, args)), testLogger.getLoggingEvents());
181     }
182 
183     @Test
184     public void traceMarkerMessageManyArgsWithThrowable() {
185         testLogger.trace(marker, message, argsWithThrowable);
186 
187         assertEquals(asList(trace(mdcValues, marker, throwable, message, args)), testLogger.getLoggingEvents());
188     }
189 
190     @Test
191     public void traceMarkerMessageThrowable() {
192         testLogger.trace(marker, message, throwable);
193 
194         assertEquals(asList(trace(mdcValues, marker, throwable, message)), testLogger.getLoggingEvents());
195     }
196 
197     @Test
198     public void debugEnabled() {
199         assertEnabledReturnsCorrectly(DEBUG);
200     }
201 
202     @Test
203     public void debugMessage() {
204         testLogger.debug(message);
205 
206         assertEquals(asList(debug(mdcValues, message)), testLogger.getLoggingEvents());
207     }
208 
209     @Test
210     public void debugMessageOneArg() {
211         testLogger.debug(message, arg1);
212 
213         assertEquals(asList(debug(mdcValues, message, arg1)), testLogger.getLoggingEvents());
214     }
215 
216     @Test
217     public void debugMessageTwoArgs() {
218         testLogger.debug(message, arg1, arg2);
219 
220         assertEquals(asList(debug(mdcValues, message, arg1, arg2)), testLogger.getLoggingEvents());
221     }
222 
223     @Test
224     public void debugMessageManyArgs() {
225         testLogger.debug(message, args);
226 
227         assertEquals(asList(debug(mdcValues, message, args)), testLogger.getLoggingEvents());
228     }
229 
230     @Test
231     public void debugMessageManyArgsWithThrowable() {
232         testLogger.debug(message, argsWithThrowable);
233 
234         assertEquals(asList(debug(mdcValues, throwable, message, args)), testLogger.getLoggingEvents());
235     }
236 
237     @Test
238     public void debugMessageThrowable() {
239         testLogger.debug(message, throwable);
240 
241         assertEquals(asList(debug(mdcValues, throwable, message)), testLogger.getLoggingEvents());
242     }
243 
244     @Test
245     public void debugEnabledMarker() {
246         assertEnabledReturnsCorrectly(DEBUG, marker);
247     }
248 
249     @Test
250     public void debugMarkerMessage() {
251         testLogger.debug(marker, message);
252 
253         assertEquals(asList(debug(mdcValues, marker, message)), testLogger.getLoggingEvents());
254     }
255 
256     @Test
257     public void debugMarkerMessageOneArg() {
258         testLogger.debug(marker, message, arg1);
259 
260         assertEquals(asList(debug(mdcValues, marker, message, arg1)), testLogger.getLoggingEvents());
261     }
262 
263     @Test
264     public void debugMarkerMessageTwoArgs() {
265         testLogger.debug(marker, message, arg1, arg2);
266 
267         assertEquals(asList(debug(mdcValues, marker, message, arg1, arg2)), testLogger.getLoggingEvents());
268     }
269 
270     @Test
271     public void debugMarkerMessageManyArgs() {
272         testLogger.debug(marker, message, args);
273 
274         assertEquals(asList(debug(mdcValues, marker, message, args)), testLogger.getLoggingEvents());
275     }
276 
277     @Test
278     public void debugMarkerMessageManyArgsWithThrowable() {
279         testLogger.debug(marker, message, argsWithThrowable);
280 
281         assertEquals(asList(debug(mdcValues, marker, throwable, message, args)), testLogger.getLoggingEvents());
282     }
283 
284     @Test
285     public void debugMarkerMessageThrowable() {
286         testLogger.debug(marker, message, throwable);
287 
288         assertEquals(asList(debug(mdcValues, marker, throwable, message)), testLogger.getLoggingEvents());
289     }
290 
291     @Test
292     public void infoEnabled() {
293         assertEnabledReturnsCorrectly(INFO);
294     }
295 
296     @Test
297     public void infoMessage() {
298         testLogger.info(message);
299 
300         assertEquals(asList(info(mdcValues, message)), testLogger.getLoggingEvents());
301     }
302 
303     @Test
304     public void infoMessageOneArg() {
305         testLogger.info(message, arg1);
306 
307         assertEquals(asList(info(mdcValues, message, arg1)), testLogger.getLoggingEvents());
308     }
309 
310     @Test
311     public void infoMessageTwoArgs() {
312         testLogger.info(message, arg1, arg2);
313 
314         assertEquals(asList(info(mdcValues, message, arg1, arg2)), testLogger.getLoggingEvents());
315     }
316 
317     @Test
318     public void infoMessageManyArgs() {
319         testLogger.info(message, args);
320 
321         assertEquals(asList(info(mdcValues, message, args)), testLogger.getLoggingEvents());
322     }
323 
324     @Test
325     public void infoMessageManyArgsWithThrowable() {
326         testLogger.info(message, argsWithThrowable);
327 
328         assertEquals(asList(info(mdcValues, throwable, message, args)), testLogger.getLoggingEvents());
329     }
330 
331     @Test
332     public void infoMessageThrowable() {
333         testLogger.info(message, throwable);
334 
335         assertEquals(asList(info(mdcValues, throwable, message)), testLogger.getLoggingEvents());
336     }
337 
338     @Test
339     public void infoEnabledMarker() {
340         assertEnabledReturnsCorrectly(INFO, marker);
341     }
342 
343     @Test
344     public void infoMarkerMessage() {
345         testLogger.info(marker, message);
346 
347         assertEquals(asList(info(mdcValues, marker, message)), testLogger.getLoggingEvents());
348     }
349 
350     @Test
351     public void infoMarkerMessageOneArg() {
352         testLogger.info(marker, message, arg1);
353 
354         assertEquals(asList(info(mdcValues, marker, message, arg1)), testLogger.getLoggingEvents());
355     }
356 
357     @Test
358     public void infoMarkerMessageTwoArgs() {
359         testLogger.info(marker, message, arg1, arg2);
360 
361         assertEquals(asList(info(mdcValues, marker, message, arg1, arg2)), testLogger.getLoggingEvents());
362     }
363 
364     @Test
365     public void infoMarkerMessageManyArgs() {
366         testLogger.info(marker, message, args);
367 
368         assertEquals(asList(info(mdcValues, marker, message, args)), testLogger.getLoggingEvents());
369     }
370 
371     @Test
372     public void infoMarkerMessageManyArgsWithThrowable() {
373         testLogger.info(marker, message, argsWithThrowable);
374 
375         assertEquals(asList(info(mdcValues, marker, throwable, message, args)), testLogger.getLoggingEvents());
376     }
377 
378     @Test
379     public void infoMarkerMessageThrowable() {
380         testLogger.info(marker, message, throwable);
381 
382         assertEquals(asList(info(mdcValues, marker, throwable, message)), testLogger.getLoggingEvents());
383     }
384 
385     @Test
386     public void warnEnabled() {
387         assertEnabledReturnsCorrectly(WARN);
388     }
389 
390     @Test
391     public void warnMessage() {
392         testLogger.warn(message);
393 
394         assertEquals(asList(warn(mdcValues, message)), testLogger.getLoggingEvents());
395     }
396 
397     @Test
398     public void warnMessageOneArg() {
399         testLogger.warn(message, arg1);
400 
401         assertEquals(asList(warn(mdcValues, message, arg1)), testLogger.getLoggingEvents());
402     }
403 
404     @Test
405     public void warnMessageTwoArgs() {
406         testLogger.warn(message, arg1, arg2);
407 
408         assertEquals(asList(warn(mdcValues, message, arg1, arg2)), testLogger.getLoggingEvents());
409     }
410 
411     @Test
412     public void warnMessageManyArgs() {
413         testLogger.warn(message, args);
414 
415         assertEquals(asList(warn(mdcValues, message, args)), testLogger.getLoggingEvents());
416     }
417 
418     @Test
419     public void warnMessageManyArgsWithThrowable() {
420         testLogger.warn(message, argsWithThrowable);
421 
422         assertEquals(asList(warn(mdcValues, throwable, message, args)), testLogger.getLoggingEvents());
423     }
424 
425     @Test
426     public void warnMessageThrowable() {
427         testLogger.warn(message, throwable);
428 
429         assertEquals(asList(warn(mdcValues, throwable, message)), testLogger.getLoggingEvents());
430     }
431 
432     @Test
433     public void warnEnabledMarker() {
434         assertEnabledReturnsCorrectly(WARN, marker);
435     }
436 
437     @Test
438     public void warnMarkerMessage() {
439         testLogger.warn(marker, message);
440 
441         assertEquals(asList(warn(mdcValues, marker, message)), testLogger.getLoggingEvents());
442     }
443 
444     @Test
445     public void warnMarkerMessageOneArg() {
446         testLogger.warn(marker, message, arg1);
447 
448         assertEquals(asList(warn(mdcValues, marker, message, arg1)), testLogger.getLoggingEvents());
449     }
450 
451     @Test
452     public void warnMarkerMessageTwoArgs() {
453         testLogger.warn(marker, message, arg1, arg2);
454 
455         assertEquals(asList(warn(mdcValues, marker, message, arg1, arg2)), testLogger.getLoggingEvents());
456     }
457 
458     @Test
459     public void warnMarkerMessageManyArgs() {
460         testLogger.warn(marker, message, args);
461 
462         assertEquals(asList(warn(mdcValues, marker, message, args)), testLogger.getLoggingEvents());
463     }
464 
465     @Test
466     public void warnMarkerMessageManyArgsWithThrowable() {
467         testLogger.warn(marker, message, argsWithThrowable);
468 
469         assertEquals(asList(warn(mdcValues, marker, throwable, message, args)), testLogger.getLoggingEvents());
470     }
471 
472     @Test
473     public void warnMarkerMessageThrowable() {
474         testLogger.warn(marker, message, throwable);
475 
476         assertEquals(asList(warn(mdcValues, marker, throwable, message)), testLogger.getLoggingEvents());
477     }
478 
479     @Test
480     public void errorEnabled() {
481         assertEnabledReturnsCorrectly(ERROR);
482     }
483 
484     @Test
485     public void errorMessage() {
486         testLogger.error(message);
487 
488         assertEquals(asList(error(mdcValues, message)), testLogger.getLoggingEvents());
489     }
490 
491     @Test
492     public void errorMessageOneArg() {
493         testLogger.error(message, arg1);
494 
495         assertEquals(asList(error(mdcValues, message, arg1)), testLogger.getLoggingEvents());
496     }
497 
498     @Test
499     public void errorMessageTwoArgs() {
500         testLogger.error(message, arg1, arg2);
501 
502         assertEquals(asList(error(mdcValues, message, arg1, arg2)), testLogger.getLoggingEvents());
503     }
504 
505     @Test
506     public void errorMessageManyArgs() {
507         testLogger.error(message, args);
508 
509         assertEquals(asList(error(mdcValues, message, args)), testLogger.getLoggingEvents());
510     }
511 
512     @Test
513     public void errorMessageManyArgsWithThrowable() {
514         testLogger.error(message, argsWithThrowable);
515 
516         assertEquals(asList(error(mdcValues, throwable, message, args)), testLogger.getLoggingEvents());
517     }
518 
519     @Test
520     public void errorMessageThrowable() {
521         testLogger.error(message, throwable);
522 
523         assertEquals(asList(error(mdcValues, throwable, message)), testLogger.getLoggingEvents());
524     }
525 
526     @Test
527     public void errorEnabledMarker() {
528         assertEnabledReturnsCorrectly(ERROR, marker);
529     }
530 
531     @Test
532     public void errorMarkerMessage() {
533         testLogger.error(marker, message);
534 
535         assertEquals(asList(error(mdcValues, marker, message)), testLogger.getLoggingEvents());
536     }
537 
538     @Test
539     public void errorMarkerMessageOneArg() {
540         testLogger.error(marker, message, arg1);
541 
542         assertEquals(asList(error(mdcValues, marker, message, arg1)), testLogger.getLoggingEvents());
543     }
544 
545     @Test
546     public void errorMarkerMessageTwoArgs() {
547         testLogger.error(marker, message, arg1, arg2);
548 
549         assertEquals(asList(error(mdcValues, marker, message, arg1, arg2)), testLogger.getLoggingEvents());
550     }
551 
552     @Test
553     public void errorMarkerMessageManyArgs() {
554         testLogger.error(marker, message, args);
555 
556         assertEquals(asList(error(mdcValues, marker, message, args)), testLogger.getLoggingEvents());
557     }
558 
559     @Test
560     public void errorMarkerMessageManyArgsWithThrowable() {
561         testLogger.error(marker, message, argsWithThrowable);
562 
563         assertEquals(asList(error(mdcValues, marker, throwable, message, args)), testLogger.getLoggingEvents());
564     }
565 
566     @Test
567     public void errorMarkerMessageThrowable() {
568         testLogger.error(marker, message, throwable);
569 
570         assertEquals(asList(error(mdcValues, marker, throwable, message)), testLogger.getLoggingEvents());
571     }
572 
573     @Test
574     public void loggerSetToOff() {
575         logsIfEnabled();
576     }
577 
578     @Test
579     public void loggerSetToError() {
580         logsIfEnabled(ERROR);
581     }
582 
583     @Test
584     public void loggerSetToWarn() {
585         logsIfEnabled(ERROR, WARN);
586     }
587 
588     @Test
589     public void loggerSetToInfo() {
590         logsIfEnabled(ERROR, WARN, INFO);
591     }
592 
593     @Test
594     public void loggerSetToDebug() {
595         logsIfEnabled(ERROR, WARN, INFO, DEBUG);
596     }
597 
598     @Test
599     public void loggerSetToTrace() {
600         logsIfEnabled(ERROR, WARN, INFO, DEBUG, TRACE);
601     }
602 
603     private void logsIfEnabled(Level... shouldLog) {
604         testLogger.setEnabledLevels(shouldLog);
605         testLogger.error(message);
606         testLogger.warn(message);
607         testLogger.info(message);
608         testLogger.debug(message);
609         testLogger.trace(message);
610 
611         List<LoggingEvent> expectedEvents = Lists.transform(asList(shouldLog), new Function<Level, LoggingEvent>() {
612             @Override
613             public LoggingEvent apply(Level level) {
614                 return new LoggingEvent(level, mdcValues, message);
615             }
616         });
617 
618         assertEquals(expectedEvents, testLogger.getLoggingEvents());
619         testLogger.clear();
620     }
621 
622     @Test
623     public void getLoggingEventsReturnsCopyNotView() {
624         testLogger.debug(message);
625         List<LoggingEvent> loggingEvents = testLogger.getLoggingEvents();
626         testLogger.info(message);
627 
628         assertEquals(asList(debug(mdcValues, message)), loggingEvents);
629     }
630 
631     @Test(expected = UnsupportedOperationException.class)
632     public void getLoggingEventsReturnsUnmodifiableList() {
633         List<LoggingEvent> loggingEvents = testLogger.getLoggingEvents();
634         loggingEvents.add(debug("hello"));
635     }
636 
637     @Test
638     public void getLoggingEventsOnlyReturnsEventsLoggedInThisThread() throws InterruptedException {
639         Thread t = new Thread(new Runnable() {
640             @Override
641             public void run() {
642                 testLogger.info(message);
643             }
644         });
645         t.start();
646         t.join();
647         assertEquals(EMPTY_LIST, testLogger.getLoggingEvents());
648     }
649 
650     @Test
651     public void getAllLoggingEventsReturnsEventsLoggedInAllThreads() throws InterruptedException {
652         Thread t = new Thread(new Runnable() {
653             @Override
654             public void run() {
655                 testLogger.info(message);
656             }
657         });
658         t.start();
659         t.join();
660         testLogger.info(message);
661         assertEquals(asList(info(message), info(mdcValues, message)), testLogger.getAllLoggingEvents());
662     }
663 
664     @Test
665     public void clearOnlyClearsEventsLoggedInThisThread() throws InterruptedException {
666         Thread t = new Thread(new Runnable() {
667             @Override
668             public void run() {
669                 testLogger.info(message);
670             }
671         });
672         t.start();
673         t.join();
674         testLogger.clear();
675         assertEquals(asList(info(message)), testLogger.getAllLoggingEvents());
676     }
677 
678     @Test
679     public void clearAllClearsEventsLoggedInAllThreads() throws InterruptedException {
680         testLogger.info(message);
681         Thread t = new Thread(new Runnable() {
682             @Override
683             public void run() {
684                 testLogger.info(message);
685                 testLogger.clearAll();
686             }
687         });
688         t.start();
689         t.join();
690         assertEquals(EMPTY_LIST, testLogger.getAllLoggingEvents());
691         assertEquals(EMPTY_LIST, testLogger.getLoggingEvents());
692     }
693 
694     @Test
695     public void setEnabledLevelOnlyChangesLevelForCurrentThread() throws Exception {
696         final AtomicReference<ImmutableSet<Level>> inThreadEnabledLevels = new AtomicReference<ImmutableSet<Level>>();
697         Thread t = new Thread(new Runnable() {
698             @Override
699             public void run() {
700                 testLogger.setEnabledLevels(Level.WARN, Level.ERROR);
701                 inThreadEnabledLevels.set(testLogger.getEnabledLevels());
702             }
703         });
704         t.start();
705         t.join();
706         assertEquals(ImmutableSet.of(Level.WARN, Level.ERROR), inThreadEnabledLevels.get());
707         assertEquals(Level.enablableValueSet(), testLogger.getEnabledLevels());
708     }
709 
710     @Test
711     public void clearOnlyChangesLevelForCurrentThread() throws Exception {
712         testLogger.setEnabledLevels(Level.WARN, Level.ERROR);
713         Thread t = new Thread(new Runnable() {
714             @Override
715             public void run() {
716                 testLogger.clear();
717             }
718         });
719         t.start();
720         t.join();
721         assertEquals(ImmutableSet.of(Level.WARN, Level.ERROR), testLogger.getEnabledLevels());
722     }
723 
724     @Test
725     public void setEnabledLevelsForAllThreads() throws Exception {
726         final AtomicReference<ImmutableSet<Level>> inThreadEnabledLevels = new AtomicReference<ImmutableSet<Level>>();
727         Thread t = new Thread(new Runnable() {
728             @Override
729             public void run() {
730                 testLogger.setEnabledLevelsForAllThreads(Level.WARN, Level.ERROR);
731                 inThreadEnabledLevels.set(testLogger.getEnabledLevels());
732             }
733         });
734         t.start();
735         t.join();
736         assertEquals(ImmutableSet.of(Level.WARN, Level.ERROR), inThreadEnabledLevels.get());
737         assertEquals(ImmutableSet.of(Level.WARN, Level.ERROR), testLogger.getEnabledLevels());
738     }
739 
740     @Test
741     public void clearAllChangesAllLevels() throws Exception {
742         testLogger.setEnabledLevels(Level.WARN, Level.ERROR);
743         Thread t = new Thread(new Runnable() {
744             @Override
745             public void run() {
746                 testLogger.clearAll();
747             }
748         });
749         t.start();
750         t.join();
751         assertEquals(Level.enablableValueSet(), testLogger.getEnabledLevels());
752     }
753 
754     @Test
755     public void printsWhenPrintLevelEqualToEventLevel() {
756         TestLoggerFactory.getInstance().setPrintLevel(Level.INFO);
757 
758         testLogger.info(message);
759 
760         assertThat(systemOutputRule.getSystemOut(), containsString(message));
761     }
762 
763     @Test
764     public void printsWhenPrintLevelLessThanEventLevel() {
765         TestLoggerFactory.getInstance().setPrintLevel(Level.DEBUG);
766 
767         testLogger.info(message);
768 
769         assertThat(systemOutputRule.getSystemOut(), containsString(message));
770     }
771 
772     @Test
773     public void doesNotWhenPrintLevelGreaterThanThanEventLevel() {
774         TestLoggerFactory.getInstance().setPrintLevel(Level.WARN);
775 
776         testLogger.info(message);
777 
778         assertThat(systemOutputRule.getSystemOut(), isEmptyString());
779     }
780 
781     @Test
782     public void nullMdcValue() {
783         MDC.clear();
784         MDC.put("key", null);
785 
786         testLogger.info(message);
787 
788         assertThat(testLogger.getLoggingEvents(), is(asList(info(ImmutableMap.of("key", "null"), message))));
789     }
790 
791     private void assertEnabledReturnsCorrectly(Level levelToTest) {
792         testLogger.setEnabledLevels(levelToTest);
793         assertTrue("Logger level set to " + levelToTest + " means " + levelToTest + " should be enabled",
794                 new Logger(testLogger).isEnabled(levelToTest));
795 
796         Set<Level> disabledLevels = difference(enablableValueSet(), newHashSet(levelToTest));
797         for (Level disabledLevel: disabledLevels) {
798             assertFalse("Logger level set to " + levelToTest + " means " + levelToTest + " should be disabled",
799                     new Logger(testLogger).isEnabled(disabledLevel));
800         }
801     }
802 
803     private void assertEnabledReturnsCorrectly(Level levelToTest, Marker marker) {
804         testLogger.setEnabledLevels(levelToTest);
805         assertTrue("Logger level set to " + levelToTest + " means " + levelToTest + " should be enabled",
806                 new Logger(testLogger).isEnabled(levelToTest, marker));
807 
808         Set<Level> disabledLevels = difference(enablableValueSet(), newHashSet(levelToTest));
809         for (Level disabledLevel: disabledLevels) {
810             assertFalse("Logger level set to " + levelToTest + " means " + levelToTest + " should be disabled",
811                     new Logger(testLogger).isEnabled(disabledLevel, marker));
812         }
813     }
814 }