2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.config.yang.logback.config;
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;
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;
35 public class ContextSetterImplTest {
38 private LogbackRuntimeRegistrator runtimeRegistratorMock;
40 private DependencyResolver dependencyResolverMock;
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();
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);
57 assertLoggerWithAppenders("l1", "a1", "a2");
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);
67 loggersToAppenders.clear();
68 loggersToAppenders.put("l1", "a3");
69 loggersToAppenders.put("l1", "a2");
70 loggersToAppenders.put("l1", "a4");
71 createContextSetter(loggersToAppenders);
73 assertLoggerWithAppenders("l1", "a2", "a3", "a4");
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);
84 loggersToAppenders.clear();
85 loggersToAppenders.put("l1", "a3");
86 createContextSetter(loggersToAppenders);
88 assertLoggerWithAppenders("l1", "a3");
89 assertLoggerWithAppenders("l2", "a22");
92 private void createContextSetter(Multimap<String, String> loggersToAppenders) throws IOException {
93 try (ContextSetterImpl setter = new ContextSetterImpl(runtimeRegistratorMock)) {
95 List<LoggerTO> logger = Lists.newArrayList();
96 List<ConsoleAppenderTO> consoleAppenders = Lists.newArrayList();
98 for (String loggerName : loggersToAppenders.keySet()) {
99 LoggerTO l1 = createLogger(loggerName, loggersToAppenders.get(loggerName));
101 for (String appenderName : loggersToAppenders.get(loggerName)) {
102 consoleAppenders.add(createConsoleAppender(appenderName));
107 LogbackModule logbackModule = createLogbackModule(logger, consoleAppenders);
108 setter.updateContext(logbackModule);
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();
117 Multimap<String, Appender<?>> foundAppenders = HashMultimap.create();
118 while (it.hasNext()) {
119 final Appender<ILoggingEvent> app = it.next();
120 foundAppenders.put(app.getName(), app);
123 if (appenders.length == 0) {
124 assertEquals(0, foundAppenders.values().size());
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);
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;
144 private LoggerTO createLogger(String name, Collection<String> appenders) {
145 LoggerTO l1 = new LoggerTO();
146 l1.setAppenders(Lists.newArrayList(appenders));
147 l1.setLoggerName(name);
152 private ConsoleAppenderTO createConsoleAppender(String name) {
153 ConsoleAppenderTO a = new ConsoleAppenderTO();
155 a.setEncoderPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n");