1   /** 
2    * LOGBack: the reliable, fast and flexible logging library for Java.
3    *
4    * Copyright (C) 1999-2005, QOS.ch, LOGBack.com
5    *
6    * This library is free software, you can redistribute it and/or
7    * modify it under the terms of the GNU Lesser General Public License as
8    * published by the Free Software Foundation.
9    */
10  package ch.qos.logback.classic;
11  
12  import static org.junit.Assert.assertEquals;
13  import static org.junit.Assert.assertNull;
14  
15  import java.util.List;
16  import java.util.Map;
17  
18  import org.junit.Ignore;
19  import org.junit.Test;
20  
21  import ch.qos.logback.classic.control.ControlLogger;
22  import ch.qos.logback.classic.control.ControlLoggerContext;
23  import ch.qos.logback.classic.control.CreateLogger;
24  import ch.qos.logback.classic.control.ScenarioAction;
25  import ch.qos.logback.classic.control.ScenarioMaker;
26  import ch.qos.logback.classic.control.SetLevel;
27  import ch.qos.logback.classic.control.Scenario;
28  
29  
30  public class ScenarioBasedLoggerContextTest  {
31    LoggerContext lc;
32  
33    
34    @Test
35    public void testLen3() {
36      doScenarioedTest(3);
37    }
38  
39    @Test
40    public void testLength_30() {
41      doScenarioedTest(30);
42    }
43  
44    @Test
45    public void testLength_20000() {
46      doScenarioedTest(20*1000);
47    }
48  
49    @Test
50    @Ignore
51    public void testLengthLong() {
52      doScenarioedTest(100*1000);
53    }
54  
55    private void doScenarioedTest(int len) {
56      LoggerContext lc = new LoggerContext();
57      ControlLoggerContext controlContext = new ControlLoggerContext();
58      Scenario s = ScenarioMaker.makeRealisticCreationScenario(len);
59      List actionList = s.getActionList();
60      int size = actionList.size();
61      for (int i = 0; i < size; i++) {
62        ScenarioAction action = (ScenarioAction) actionList.get(i);
63        if (action instanceof CreateLogger) {
64          CreateLogger cl = (CreateLogger) action;
65          lc.getLogger(cl.getLoggerName());
66          controlContext.getLogger(cl.getLoggerName());
67        } else if (action instanceof SetLevel) {
68          SetLevel sl = (SetLevel) action;
69          Logger l = lc.getLogger(sl.getLoggerName());
70          ControlLogger controlLogger = controlContext.getLogger(sl.getLoggerName());
71          l.setLevel(sl.getLevel());
72          controlLogger.setLevel(sl.getLevel());
73        }
74      }
75  
76      compareLoggerContexts(controlContext, lc);
77    }
78  
79    void compareLoggerContexts(ControlLoggerContext controlLC, LoggerContext lc) {
80      Map<String, ControlLogger> controlLoggerMap = controlLC.getLoggerMap();
81  
82      assertEquals(controlLoggerMap.size()+1, lc.size());
83  
84      for (String loggerName: controlLoggerMap.keySet()) {
85          
86        Logger logger = lc.exists(loggerName);
87        ControlLogger controlLogger = (ControlLogger) controlLoggerMap.get(loggerName);
88        if (logger == null) {
89          throw new IllegalStateException("logger" + loggerName + " should exist");
90        }
91        assertEquals(loggerName, logger.getName());
92        assertEquals(loggerName, controlLogger.getName());
93  
94        compareLoggers(controlLogger, logger);
95      }
96    }
97  
98    void compareLoggers(ControlLogger controlLogger, Logger logger) {
99      assertEquals(controlLogger.getName(), logger.getName());
100     assertEquals(controlLogger.getEffectiveLevel(), logger.getEffectiveLevel());
101 
102     Level controlLevel = controlLogger.getLevel();
103     Level level = logger.getLevel();
104 
105     if (controlLevel == null) {
106       assertNull(level);
107     } else {
108       assertEquals(controlLevel, level);
109     }
110   }
111 }