/* * 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.tck.junit4; import org.mule.runtime.core.util.FileUtils; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.nio.charset.Charset; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; /** * A helper class for configuring logging on test cases * * @since 3.7.0 */ public class TestsLogConfigurationHelper { private static final ThreadLocal<String> LOGGING_CONFIG_CACHE = new ThreadLocal<>(); private static final String LOG4J_CONFIGURATION_FILE = "log4j.configurationFile"; private static final String NULL_CONFIG_FILE = "NULL_CONFIG_FILE"; /** * Looks for a logging config file on the directory tree where the binaries for {@code testClass} resides. If found, that * logging config file is used, otherwise Log4j2 is allowed to search for the config file using its own logic. * <p/> * A file called {@code log4j2-test.xml} will be searched first. If not found, will try with {@code log4j2.xml}. * <p/> * In either case, this method ends by reconfiguring all loggers in the current {@link LoggerContext} * * @param testClass the class holding the tests to be executed */ public static void configureLoggingForTest(Class<?> testClass) { String logConfigPath = LOGGING_CONFIG_CACHE.get(); if (logConfigPath == null) { logConfigPath = findLogConfigurationPath(testClass); } forceConfigFile(logConfigPath); } /** * Clears the configurations generated by {@link #configureLoggingForTest(Class)} */ public static void clearLoggingConfig() { LOGGING_CONFIG_CACHE.remove(); System.clearProperty(LOG4J_CONFIGURATION_FILE); } private static String findLogConfigurationPath(Class<?> testClass) { String encodedFolder = testClass.getClassLoader().getResource("").getPath().toString(); String folderPath; try { folderPath = URLDecoder.decode(encodedFolder, Charset.defaultCharset().name()); } catch (UnsupportedEncodingException e) { return NULL_CONFIG_FILE; } File folder = new File(folderPath); if (folder != null && "target".equals(folder.getParentFile().getName())) { folder = folder.getParentFile(); } File logConfigFile = FileUtils.findFileByName(folder, "log4j2-test.xml", true); if (logConfigFile == null) { logConfigFile = FileUtils.findFileByName(folder, "log4j2.xml", true); } String logConfigPath = logConfigFile != null && logConfigFile.isFile() ? logConfigFile.toURI().toString() : NULL_CONFIG_FILE; LOGGING_CONFIG_CACHE.set(logConfigPath); return logConfigPath; } private static void forceConfigFile(String logConfigFile) { if (!NULL_CONFIG_FILE.equals(logConfigFile)) { System.setProperty(LOG4J_CONFIGURATION_FILE, logConfigFile); } LoggerContext ctx = (LoggerContext) LogManager.getContext(false); ctx.reconfigure(); } }