/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.module.launcher.log4j2; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mule.runtime.core.util.ClassUtils.withContextClassLoader; import org.mule.runtime.module.artifact.classloader.RegionClassLoader; import org.mule.tck.junit4.AbstractMuleTestCase; import org.mule.tck.size.SmallTest; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.selector.ContextSelector; import org.apache.logging.log4j.message.MessageFactory; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @SmallTest @RunWith(MockitoJUnitRunner.class) public class DispatchingLoggerTestCase extends AbstractMuleTestCase { private static final String LOGGER_NAME = DispatchingLoggerTestCase.class.getName(); private static final String MESSAGE = "Hello Log!"; private ClassLoader currentClassLoader; @Mock private ClassLoader additionalClassLoader; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Logger originalLogger; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private LoggerContext loggerContext; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private ContextSelector contextSelector; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private MessageFactory messageFactory; private Logger logger; @Before public void before() { currentClassLoader = Thread.currentThread().getContextClassLoader(); when(loggerContext.getConfiguration().getLoggerConfig(anyString()).getLevel()).thenReturn(Level.INFO); logger = new DispatchingLogger(originalLogger, currentClassLoader.hashCode(), loggerContext, contextSelector, messageFactory) { @Override public String getName() { return LOGGER_NAME; } }; } @Test public void currentClassLoader() { logger.info(MESSAGE); verify(originalLogger).info(MESSAGE); } @Test public void anotherClassLoader() { withContextClassLoader(additionalClassLoader, () -> { logger.info(MESSAGE); verify(originalLogger).info(MESSAGE); }); } @Test public void regionClassLoader() { RegionClassLoader regionClassLoader = mock(RegionClassLoader.class); withContextClassLoader(regionClassLoader, () -> { logger.info(MESSAGE); verify(contextSelector).getContext(LOGGER_NAME, regionClassLoader, true); }); } }