Merge "Make neutron a simple osgi app"
[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 ch.qos.logback.classic.LoggerContext;
17 import ch.qos.logback.classic.spi.ILoggingEvent;
18 import ch.qos.logback.core.Appender;
19 import com.google.common.collect.HashMultimap;
20 import com.google.common.collect.Lists;
21 import com.google.common.collect.Multimap;
22 import java.util.Collection;
23 import java.util.Iterator;
24 import java.util.List;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.mockito.Mock;
28 import org.mockito.MockitoAnnotations;
29 import org.opendaylight.controller.config.api.DependencyResolver;
30 import org.opendaylight.controller.config.api.ModuleIdentifier;
31 import org.slf4j.LoggerFactory;
32
33 public class ContextSetterImplTest {
34
35     @Mock
36     private LogbackRuntimeRegistrator runtimeRegistratorMock;
37     @Mock
38     private DependencyResolver dependencyResolverMock;
39
40     @Before
41     public void setUp() throws Exception {
42         MockitoAnnotations.initMocks(this);
43         LogbackRuntimeRegistration reg = mock(LogbackRuntimeRegistration.class);
44         doReturn(reg).when(runtimeRegistratorMock).register(any(LogbackRuntimeMXBean.class));
45     }
46
47     @Test
48     public void testUpdate() throws Exception {
49         Multimap<String, String> loggersToAppenders = HashMultimap.create();
50         loggersToAppenders.put("l1", "a1");
51         loggersToAppenders.put("l1", "a2");
52         createContextSetter(loggersToAppenders);
53
54         assertLoggerWithAppenders("l1", "a1", "a2");
55     }
56
57     @Test
58     public void testUpdateTwice() throws Exception {
59         Multimap<String, String> loggersToAppenders = HashMultimap.create();
60         loggersToAppenders.put("l1", "a1");
61         loggersToAppenders.put("l1", "a2");
62         createContextSetter(loggersToAppenders);
63
64         loggersToAppenders.clear();
65         loggersToAppenders.put("l1", "a3");
66         loggersToAppenders.put("l1", "a2");
67         loggersToAppenders.put("l1", "a4");
68         createContextSetter(loggersToAppenders);
69
70         assertLoggerWithAppenders("l1", "a2", "a3", "a4");
71     }
72
73     @Test
74     public void testKeepOtherLoggers() throws Exception {
75         Multimap<String, String> loggersToAppenders = HashMultimap.create();
76         loggersToAppenders.put("l1", "a1");
77         loggersToAppenders.put("l1", "a2");
78         loggersToAppenders.put("l2", "a22");
79         createContextSetter(loggersToAppenders);
80
81         loggersToAppenders.clear();
82         loggersToAppenders.put("l1", "a3");
83         createContextSetter(loggersToAppenders);
84
85         assertLoggerWithAppenders("l1", "a3");
86         assertLoggerWithAppenders("l2", "a22");
87     }
88
89     private void createContextSetter(Multimap<String, String> loggersToAppenders) {
90         ContextSetterImpl setter = new ContextSetterImpl(runtimeRegistratorMock);
91
92         List<LoggerTO> logger = Lists.newArrayList();
93         List<ConsoleAppenderTO> consoleAppenders = Lists.newArrayList();
94
95         for (String loggerName : loggersToAppenders.keySet()) {
96             LoggerTO l1 = createLogger(loggerName, loggersToAppenders.get(loggerName));
97             logger.add(l1);
98             for (String appenderName : loggersToAppenders.get(loggerName)) {
99                 consoleAppenders.add(createConsoleAppender(appenderName));
100             }
101
102         }
103
104         LogbackModule logbackModule = createLogbackModule(logger, consoleAppenders);
105         setter.updateContext(logbackModule);
106     }
107
108     private void assertLoggerWithAppenders(String name, String... appenders) {
109         LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
110         ch.qos.logback.classic.Logger logger = context.getLogger(name);
111         Iterator<Appender<ILoggingEvent>> it = logger.iteratorForAppenders();
112
113         Multimap<String, Appender<?>> foundAppenders = HashMultimap.create();
114         while (it.hasNext()) {
115             final Appender<ILoggingEvent> app = it.next();
116             foundAppenders.put(app.getName(), app);
117         }
118
119         if (appenders.length == 0) {
120             assertEquals(0, foundAppenders.values().size());
121         }
122
123         for (String appender : appenders) {
124             boolean isPresent = foundAppenders.get(appender).isEmpty();
125             assertFalse("Appender " + appender + " for logger " + name + " was not present, present appenders: "
126                     + foundAppenders.keys(), isPresent);
127         }
128
129     }
130
131     private LogbackModule createLogbackModule(List<LoggerTO> logger, List<ConsoleAppenderTO> consoleAppenders) {
132         LogbackModule logbackModule = new LogbackModule(new ModuleIdentifier("fact", "first"), dependencyResolverMock);
133         logbackModule.setLoggerTO(logger);
134         logbackModule.setConsoleAppenderTO(consoleAppenders);
135         logbackModule.setRollingFileAppenderTO(Lists.<RollingFileAppenderTO> newArrayList());
136         logbackModule.setFileAppenderTO(Lists.<FileAppenderTO> newArrayList());
137         return logbackModule;
138     }
139
140     private LoggerTO createLogger(String name, Collection<String> appenders) {
141         LoggerTO l1 = new LoggerTO();
142         l1.setAppenders(Lists.newArrayList(appenders));
143         l1.setLoggerName(name);
144         l1.setLevel("INFO");
145         return l1;
146     }
147
148     private ConsoleAppenderTO createConsoleAppender(String name) {
149         ConsoleAppenderTO a = new ConsoleAppenderTO();
150         a.setName(name);
151         a.setEncoderPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n");
152         return a;
153     }
154
155 }