/* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.config.yang.logback.config; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.junit.matchers.JUnitMatchers.containsString; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.ObjectName; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.opendaylight.controller.config.api.ConflictingVersionException; import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.jmx.CommitStatus; import org.opendaylight.controller.config.manager.impl.AbstractConfigTest; import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver; import org.opendaylight.controller.config.util.ConfigTransactionJMXClient; public class LogbackModuleTest extends AbstractConfigTest { private static final String INSTANCE_NAME = "singleton"; private LogbackModuleFactory factory; @Before public void setUp() throws IOException, ClassNotFoundException, InterruptedException { factory = new LogbackModuleFactory(); super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(factory)); } @Test public void testCreateBean() throws InstanceAlreadyExistsException { CommitStatus status = createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); assertBeanCount(1, factory.getImplementationName()); assertStatus(status, 1, 0, 0); } @Test public void testReusingInstance() throws InstanceAlreadyExistsException { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); assertBeanCount(1, factory.getImplementationName()); ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); CommitStatus status = transaction.commit(); assertBeanCount(1, factory.getImplementationName()); assertStatus(status, 0, 0, 1); } @Test public void testRecreateInstance() throws InstanceAlreadyExistsException, ValidationException, ConflictingVersionException, InstanceNotFoundException { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); assertBeanCount(1, LogbackModuleFactory.NAME); ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); ObjectName logback = transaction.lookupConfigBean(LogbackModuleFactory.NAME, "singleton"); LogbackModuleMXBean nwBean = transaction.newMXBeanProxy(logback, LogbackModuleMXBean.class); CommitStatus status = transaction.commit(); assertBeanCount(1, LogbackModuleFactory.NAME); assertStatus(status, 0, 0, 1); } @Test public void testDestroyInstance() throws InstanceNotFoundException, InstanceAlreadyExistsException { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); assertBeanCount(1, factory.getImplementationName()); ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); transaction.destroyConfigBean(factory.getImplementationName(), INSTANCE_NAME); CommitStatus status = transaction.commit(); assertBeanCount(0, factory.getImplementationName()); assertStatus(status, 0, 0, 0); } @Ignore @Test public void testValidation1() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("FileName is null")); } } @Test public void testValidation2() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", null, "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("EncoderPattern is null")); } } @Test public void testValidation4() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", null, 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("MaxFileSize is null")); } } @Test public void testValidation6() throws InstanceAlreadyExistsException { try { createBeans(true, "", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender") .commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("FileName needs to be set")); } } @Test public void testValidation7() throws InstanceAlreadyExistsException { try { createBeans( true, "target/rollingApp", "", "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("EncoderPattern needs to be set")); } } @Test public void testValidation8() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", null, "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("LoggerName is null")); } } @Test public void testValidation9() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, 5, "target/%i.log", "rolling", "consoleName", "ALL", "", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("LoggerName needs to be set")); } } @Test public void testValidation10() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", null, 5, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("MinIndex is null")); } } @Test public void testValidation11() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, null, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "FixedWindowRollingPolicy", 0, "FileAppender").commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("MaxIndex is null")); } } @Test public void testValidation12() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, null, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", null, 1, "FileAppender") .commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("RollingPolicyType is null")); } } @Test public void testValidation13() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, null, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "", 1, "FileAppender") .commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("RollingPolicyType is not set")); } } @Test public void testValidation14() throws InstanceAlreadyExistsException { try { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", 1, null, "target/%i.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "RollingPolicy", 1, "FileAppender").commit(); fail(); } catch (ValidationException e) { assertThat(e.getFailedValidations().toString(), containsString("RollingPolicyType is not supported")); } } @Test public void testTimeBasedRollingPolicy() throws InstanceAlreadyExistsException { createBeans(true, "target/rollingApp", "%-4relative [%thread] %-5level %logger{35} - %msg%n", "30MB", null, null, "target/%d.log", "rolling", "consoleName", "ALL", "logger1", "DEBUG", "TimeBasedRollingPolicy", 1, "FileAppender").commit(); } private ConfigTransactionJMXClient createBeans(Boolean isAppend, String rollingFileName, String encoderPattern, String maxFileSize, Integer minIndex, Integer maxIndex, String fileNamePattern, String rollingName, String consoleName, String thresholdFilter, String loggerName, String level, String rollingPolicyType, int maxHistory, String fileAppName) throws InstanceAlreadyExistsException { ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); ObjectName nameCreated = transaction.createModule(factory.getImplementationName(), INSTANCE_NAME); LogbackModuleMXBean bean = transaction.newMXBeanProxy(nameCreated, LogbackModuleMXBean.class); List rollingAppenders = new ArrayList<>(); RollingFileAppenderTO rollingAppender = new RollingFileAppenderTO(); rollingAppender.setAppend(isAppend); rollingAppender.setEncoderPattern(encoderPattern); rollingAppender.setFileName(rollingFileName); rollingAppender.setMaxFileSize(maxFileSize); rollingAppender.setMaxIndex(maxIndex); rollingAppender.setMinIndex(minIndex); rollingAppender.setFileNamePattern(fileNamePattern); rollingAppender.setName(rollingName); rollingAppender.setRollingPolicyType(rollingPolicyType); rollingAppender.setMaxHistory(maxHistory); rollingAppenders.add(rollingAppender); List consoleAppenders = new ArrayList<>(); ConsoleAppenderTO consoleAppender = new ConsoleAppenderTO(); consoleAppender.setEncoderPattern(encoderPattern); consoleAppender.setName(consoleName); consoleAppender.setThresholdFilter(thresholdFilter); consoleAppenders.add(consoleAppender); List fileAppenders = new ArrayList<>(); FileAppenderTO fileAppender = new FileAppenderTO(); fileAppender.setName(fileAppName); fileAppender.setAppend(isAppend); fileAppender.setEncoderPattern(encoderPattern); fileAppender.setFileName(rollingFileName); fileAppenders.add(fileAppender); List loggers = new ArrayList<>(); LoggerTO logger = new LoggerTO(); logger.setAppenders(Arrays. asList()); logger.setLevel(level); logger.setLoggerName(loggerName); loggers.add(logger); bean.setLoggerTO(loggers); bean.setRollingFileAppenderTO(rollingAppenders); bean.setConsoleAppenderTO(consoleAppenders); bean.setFileAppenderTO(fileAppenders); transaction.validateConfig(); return transaction; } }