Do not force toString() in NetconfClientSession
[controller.git] / opendaylight / config / logback-config / src / test / java / org / opendaylight / controller / config / yang / logback / config / ContextSetterImplTest.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.config.yang.logback.config;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15
16 import java.util.Collection;
17 import java.util.Iterator;
18 import java.util.List;
19
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.mockito.Mock;
23 import org.mockito.MockitoAnnotations;
24 import org.opendaylight.controller.config.api.DependencyResolver;
25 import org.opendaylight.controller.config.api.ModuleIdentifier;
26 import org.slf4j.LoggerFactory;
27
28 import ch.qos.logback.classic.LoggerContext;
29 import ch.qos.logback.classic.spi.ILoggingEvent;
30 import ch.qos.logback.core.Appender;
31
32 import com.google.common.collect.HashMultimap;
33 import com.google.common.collect.Lists;
34 import com.google.common.collect.Multimap;
35
36 public class ContextSetterImplTest {
37
38     @Mock
39     private LogbackRuntimeRegistrator runtimeRegistratorMock;
40     @Mock
41     private DependencyResolver dependencyResolverMock;
42
43     @Before
44     public void setUp() throws Exception {
45         MockitoAnnotations.initMocks(this);
46         LogbackRuntimeRegistration reg = mock(LogbackRuntimeRegistration.class);
47         doReturn(reg).when(runtimeRegistratorMock).register(any(LogbackRuntimeMXBean.class));
48     }
49
50     @Test
51     public void testUpdate() throws Exception {
52         Multimap<String, String> loggersToAppenders = HashMultimap.create();
53         loggersToAppenders.put("l1", "a1");
54         loggersToAppenders.put("l1", "a2");
55         createContextSetter(loggersToAppenders);
56
57         assertLoggerWithAppenders("l1", "a1", "a2");
58     }
59
60     @Test
61     public void testUpdateTwice() throws Exception {
62         Multimap<String, String> loggersToAppenders = HashMultimap.create();
63         loggersToAppenders.put("l1", "a1");
64         loggersToAppenders.put("l1", "a2");
65         createContextSetter(loggersToAppenders);
66
67         loggersToAppenders.clear();
68         loggersToAppenders.put("l1", "a3");
69         loggersToAppenders.put("l1", "a2");
70         loggersToAppenders.put("l1", "a4");
71         createContextSetter(loggersToAppenders);
72
73         assertLoggerWithAppenders("l1", "a2", "a3", "a4");
74     }
75
76     @Test
77     public void testKeepOtherLoggers() throws Exception {
78         Multimap<String, String> loggersToAppenders = HashMultimap.create();
79         loggersToAppenders.put("l1", "a1");
80         loggersToAppenders.put("l1", "a2");
81         loggersToAppenders.put("l2", "a22");
82         createContextSetter(loggersToAppenders);
83
84         loggersToAppenders.clear();
85         loggersToAppenders.put("l1", "a3");
86         createContextSetter(loggersToAppenders);
87
88         assertLoggerWithAppenders("l1", "a3");
89         assertLoggerWithAppenders("l2", "a22");
90     }
91
92     private void createContextSetter(Multimap<String, String> loggersToAppenders) {
93         ContextSetterImpl setter = new ContextSetterImpl(runtimeRegistratorMock);
94
95         List<LoggerTO> logger = Lists.newArrayList();
96         List<ConsoleAppenderTO> consoleAppenders = Lists.newArrayList();
97
98         for (String loggerName : loggersToAppenders.keySet()) {
99             LoggerTO l1 = createLogger(loggerName, loggersToAppenders.get(loggerName));
100             logger.add(l1);
101             for (String appenderName : loggersToAppenders.get(loggerName)) {
102                 consoleAppenders.add(createConsoleAppender(appenderName));
103             }
104
105         }
106
107         LogbackModule logbackModule = createLogbackModule(logger, consoleAppenders);
108         setter.updateContext(logbackModule);
109     }
110
111     private void assertLoggerWithAppenders(String name, String... appenders) {
112         LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
113         ch.qos.logback.classic.Logger logger = context.getLogger(name);
114         Iterator<Appender<ILoggingEvent>> it = logger.iteratorForAppenders();
115
116         Multimap<String, Appender<?>> foundAppenders = HashMultimap.create();
117         while (it.hasNext()) {
118             final Appender<ILoggingEvent> app = it.next();
119             foundAppenders.put(app.getName(), app);
120         }
121
122         if (appenders.length == 0) {
123             assertEquals(0, foundAppenders.values().size());
124         }
125
126         for (String appender : appenders) {
127             boolean isPresent = foundAppenders.get(appender).isEmpty();
128             assertFalse("Appender " + appender + " for logger " + name + " was not present, present appenders: "
129                     + foundAppenders.keys(), isPresent);
130         }
131
132     }
133
134     private LogbackModule createLogbackModule(List<LoggerTO> logger, List<ConsoleAppenderTO> consoleAppenders) {
135         LogbackModule logbackModule = new LogbackModule(new ModuleIdentifier("fact", "first"), dependencyResolverMock);
136         logbackModule.setLoggerTO(logger);
137         logbackModule.setConsoleAppenderTO(consoleAppenders);
138         logbackModule.setRollingFileAppenderTO(Lists.<RollingFileAppenderTO> newArrayList());
139         logbackModule.setFileAppenderTO(Lists.<FileAppenderTO> newArrayList());
140         return logbackModule;
141     }
142
143     private LoggerTO createLogger(String name, Collection<String> appenders) {
144         LoggerTO l1 = new LoggerTO();
145         l1.setAppenders(Lists.newArrayList(appenders));
146         l1.setLoggerName(name);
147         l1.setLevel("INFO");
148         return l1;
149     }
150
151     private ConsoleAppenderTO createConsoleAppender(String name) {
152         ConsoleAppenderTO a = new ConsoleAppenderTO();
153         a.setName(name);
154         a.setEncoderPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n");
155         return a;
156     }
157 }