Fix resource leaks in test cases
[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.doNothing;
14 import static org.mockito.Mockito.doReturn;
15 import static org.mockito.Mockito.mock;
16
17 import ch.qos.logback.classic.LoggerContext;
18 import ch.qos.logback.classic.spi.ILoggingEvent;
19 import ch.qos.logback.core.Appender;
20 import com.google.common.collect.HashMultimap;
21 import com.google.common.collect.Lists;
22 import com.google.common.collect.Multimap;
23 import java.io.IOException;
24 import java.util.Collection;
25 import java.util.Iterator;
26 import java.util.List;
27 import org.junit.Before;
28 import org.junit.Test;
29 import org.mockito.Mock;
30 import org.mockito.MockitoAnnotations;
31 import org.opendaylight.controller.config.api.DependencyResolver;
32 import org.opendaylight.controller.config.api.ModuleIdentifier;
33 import org.slf4j.LoggerFactory;
34
35 public class ContextSetterImplTest {
36
37     @Mock
38     private LogbackRuntimeRegistrator runtimeRegistratorMock;
39     @Mock
40     private DependencyResolver dependencyResolverMock;
41
42     @Before
43     public void setUp() throws Exception {
44         MockitoAnnotations.initMocks(this);
45         LogbackRuntimeRegistration reg = mock(LogbackRuntimeRegistration.class);
46         doReturn(reg).when(runtimeRegistratorMock).register(any(LogbackRuntimeMXBean.class));
47         doNothing().when(reg).close();
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) throws IOException {
93         try (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
112     private void assertLoggerWithAppenders(String name, String... appenders) {
113         LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
114         ch.qos.logback.classic.Logger logger = context.getLogger(name);
115         Iterator<Appender<ILoggingEvent>> it = logger.iteratorForAppenders();
116
117         Multimap<String, Appender<?>> foundAppenders = HashMultimap.create();
118         while (it.hasNext()) {
119             final Appender<ILoggingEvent> app = it.next();
120             foundAppenders.put(app.getName(), app);
121         }
122
123         if (appenders.length == 0) {
124             assertEquals(0, foundAppenders.values().size());
125         }
126
127         for (String appender : appenders) {
128             boolean isPresent = foundAppenders.get(appender).isEmpty();
129             assertFalse("Appender " + appender + " for logger " + name + " was not present, present appenders: "
130                     + foundAppenders.keys(), isPresent);
131         }
132
133     }
134
135     private LogbackModule createLogbackModule(List<LoggerTO> logger, List<ConsoleAppenderTO> consoleAppenders) {
136         LogbackModule logbackModule = new LogbackModule(new ModuleIdentifier("fact", "first"), dependencyResolverMock);
137         logbackModule.setLoggerTO(logger);
138         logbackModule.setConsoleAppenderTO(consoleAppenders);
139         logbackModule.setRollingFileAppenderTO(Lists.<RollingFileAppenderTO> newArrayList());
140         logbackModule.setFileAppenderTO(Lists.<FileAppenderTO> newArrayList());
141         return logbackModule;
142     }
143
144     private LoggerTO createLogger(String name, Collection<String> appenders) {
145         LoggerTO l1 = new LoggerTO();
146         l1.setAppenders(Lists.newArrayList(appenders));
147         l1.setLoggerName(name);
148         l1.setLevel("INFO");
149         return l1;
150     }
151
152     private ConsoleAppenderTO createConsoleAppender(String name) {
153         ConsoleAppenderTO a = new ConsoleAppenderTO();
154         a.setName(name);
155         a.setEncoderPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n");
156         return a;
157     }
158
159 }