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.doReturn;
14 import static org.mockito.Mockito.mock;
16 import java.util.Collection;
17 import java.util.Iterator;
18 import java.util.List;
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;
28 import ch.qos.logback.classic.LoggerContext;
29 import ch.qos.logback.classic.spi.ILoggingEvent;
30 import ch.qos.logback.core.Appender;
32 import com.google.common.collect.HashMultimap;
33 import com.google.common.collect.Lists;
34 import com.google.common.collect.Multimap;
36 public class ContextSetterImplTest {
39 private LogbackRuntimeRegistrator runtimeRegistratorMock;
41 private DependencyResolver dependencyResolverMock;
44 public void setUp() throws Exception {
45 MockitoAnnotations.initMocks(this);
46 LogbackRuntimeRegistration reg = mock(LogbackRuntimeRegistration.class);
47 doReturn(reg).when(runtimeRegistratorMock).register(
48 any(LogbackRuntimeMXBean.class));
52 public void testUpdate() throws Exception {
53 Multimap<String, String> loggersToAppenders = HashMultimap.create();
54 loggersToAppenders.put("l1", "a1");
55 loggersToAppenders.put("l1", "a2");
56 createContextSetter(loggersToAppenders);
58 assertLoggerWithAppenders("l1", "a1", "a2");
62 public void testUpdateTwice() throws Exception {
63 Multimap<String, String> loggersToAppenders = HashMultimap.create();
64 loggersToAppenders.put("l1", "a1");
65 loggersToAppenders.put("l1", "a2");
66 createContextSetter(loggersToAppenders);
68 loggersToAppenders.clear();
69 loggersToAppenders.put("l1", "a3");
70 loggersToAppenders.put("l1", "a2");
71 loggersToAppenders.put("l1", "a4");
72 createContextSetter(loggersToAppenders);
74 assertLoggerWithAppenders("l1", "a2", "a3", "a4");
78 public void testKeepOtherLoggers() throws Exception {
79 Multimap<String, String> loggersToAppenders = HashMultimap.create();
80 loggersToAppenders.put("l1", "a1");
81 loggersToAppenders.put("l1", "a2");
82 loggersToAppenders.put("l2", "a22");
83 createContextSetter(loggersToAppenders);
85 loggersToAppenders.clear();
86 loggersToAppenders.put("l1", "a3");
87 createContextSetter(loggersToAppenders);
89 assertLoggerWithAppenders("l1", "a3");
90 assertLoggerWithAppenders("l2", "a22");
93 private void createContextSetter(Multimap<String, String> loggersToAppenders) {
94 ContextSetterImpl setter = new ContextSetterImpl(runtimeRegistratorMock);
96 List<LoggerTO> logger = Lists.newArrayList();
97 List<ConsoleAppenderTO> consoleAppenders = Lists.newArrayList();
99 for (String loggerName : loggersToAppenders.keySet()) {
100 LoggerTO l1 = createLogger(loggerName,
101 loggersToAppenders.get(loggerName));
103 for (String appenderName : loggersToAppenders.get(loggerName)) {
104 consoleAppenders.add(createConsoleAppender(appenderName));
109 LogbackModule logbackModule = createLogbackModule(logger,
111 setter.updateContext(logbackModule);
114 private void assertLoggerWithAppenders(String name, String... appenders) {
115 LoggerContext context = (LoggerContext) LoggerFactory
116 .getILoggerFactory();
117 ch.qos.logback.classic.Logger logger = context.getLogger(name);
118 Iterator<Appender<ILoggingEvent>> it = logger.iteratorForAppenders();
120 Multimap<String, Appender<?>> foundAppenders = HashMultimap.create();
121 while (it.hasNext()) {
122 final Appender<ILoggingEvent> app = it.next();
123 foundAppenders.put(app.getName(), app);
126 if (appenders.length == 0) {
127 assertEquals(0, foundAppenders.values().size());
130 for (String appender : appenders) {
131 boolean isPresent = foundAppenders.get(appender).isEmpty();
133 "Appender " + appender + " for logger " + name
134 + " was not present, present appenders: "
135 + foundAppenders.keys(), isPresent);
140 private LogbackModule createLogbackModule(List<LoggerTO> logger,
141 List<ConsoleAppenderTO> consoleAppenders) {
142 LogbackModule logbackModule = new LogbackModule(new ModuleIdentifier(
143 "fact", "first"), dependencyResolverMock);
144 logbackModule.setLoggerTO(logger);
145 logbackModule.setConsoleAppenderTO(consoleAppenders);
146 logbackModule.setRollingFileAppenderTO(Lists
147 .<RollingFileAppenderTO> newArrayList());
148 return logbackModule;
151 private LoggerTO createLogger(String name, Collection<String> appenders) {
152 LoggerTO l1 = new LoggerTO();
153 l1.setAppenders(Lists.newArrayList(appenders));
154 l1.setLoggerName(name);
159 private ConsoleAppenderTO createConsoleAppender(String name) {
160 ConsoleAppenderTO a = new ConsoleAppenderTO();
162 a.setEncoderPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n");