1   package ch.qos.logback.classic.selector;
2   
3   import static org.junit.Assert.assertEquals;
4   
5   import org.junit.After;
6   import org.junit.Before;
7   import org.junit.Test;
8   import org.slf4j.LoggerFactory;
9   import org.slf4j.impl.StaticLoggerBinder;
10  
11  import ch.qos.logback.classic.ClassicGlobal;
12  import ch.qos.logback.classic.selector.servlet.ContextDetachingSCL;
13  import ch.qos.logback.classic.util.MockInitialContext;
14  import ch.qos.logback.classic.util.MockInitialContextFactory;
15  
16  public class ContextDetachingSCLTest  {
17    
18    static String INITIAL_CONTEXT_KEY = "java.naming.factory.initial";
19  
20    ContextDetachingSCL listener;
21    
22    @Before
23    public void setUp() throws Exception {
24      System.setProperty(ClassicGlobal.LOGBACK_CONTEXT_SELECTOR, "JNDI");
25      //LoggerFactory.setup();
26      
27      listener = new ContextDetachingSCL();
28      
29      MockInitialContextFactory.initialize();
30      MockInitialContext mic = MockInitialContextFactory.getContext();
31      mic.map.put(ClassicGlobal.JNDI_CONTEXT_NAME, "toto");
32      
33      //The property must be set after we setup the Mock
34      System.setProperty(INITIAL_CONTEXT_KEY, MockInitialContextFactory.class.getName());
35      
36      //this call will create the context "toto"
37      LoggerFactory.getLogger(ContextDetachingSCLTest.class);
38  
39    }
40  
41    @After
42    public void tearDown() throws Exception {
43      System.clearProperty(INITIAL_CONTEXT_KEY);
44    }
45  
46    @Test
47    public void testDetach() {
48      ContextJNDISelector selector = (ContextJNDISelector) StaticLoggerBinder.getSingleton().getContextSelector();
49      listener.contextDestroyed(null);
50      assertEquals(0, selector.getCount());
51    }
52    
53  
54    @Test
55    public void testDetachWithMissingContext() {
56      MockInitialContext mic = MockInitialContextFactory.getContext();
57      mic.map.put(ClassicGlobal.JNDI_CONTEXT_NAME, "tata");
58      ContextJNDISelector selector = (ContextJNDISelector) StaticLoggerBinder.getSingleton().getContextSelector();
59      assertEquals("tata", selector.getLoggerContext().getName());
60  
61      mic.map.put(ClassicGlobal.JNDI_CONTEXT_NAME, "titi");
62      assertEquals("titi", selector.getLoggerContext().getName());
63      listener.contextDestroyed(null);
64  
65      assertEquals(2, selector.getCount());
66    }
67    
68  }