blob: 5a40400905a2061a822507b840c41488384e11ea [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.juli;
import java.io.File;
import java.util.Collections;
import java.util.Random;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import org.junit.Assert;
import org.junit.Test;
/**
* Test cases for {@link ClassLoaderLogManager}.
*/
public class TestClassLoaderLogManager {
@Test
public void testReplace() {
ClassLoaderLogManager logManager = new ClassLoaderLogManager();
Assert.assertEquals("", logManager.replace(""));
Assert.assertEquals("${", logManager.replace("${"));
Assert.assertEquals("${undefinedproperty}", logManager.replace("${undefinedproperty}"));
Assert.assertEquals(
System.lineSeparator() + File.pathSeparator + File.separator,
logManager.replace("${line.separator}${path.separator}${file.separator}"));
Assert.assertEquals(
"foo" + File.separator + "bar" + System.lineSeparator() + File.pathSeparator + "baz",
logManager.replace("foo${file.separator}bar${line.separator}${path.separator}baz"));
// BZ 51249
Assert.assertEquals(
"%{file.separator}" + File.separator,
logManager.replace("%{file.separator}${file.separator}"));
Assert.assertEquals(
File.separator + "${undefinedproperty}" + File.separator,
logManager.replace("${file.separator}${undefinedproperty}${file.separator}"));
Assert.assertEquals("${}" + File.pathSeparator, logManager.replace("${}${path.separator}"));
}
@Test
public void testBug56082() {
ClassLoaderLogManager logManager = new ClassLoaderLogManager();
LoggerCreateThread[] createThreads = new LoggerCreateThread[10];
for (int i = 0; i < createThreads.length; i ++) {
createThreads[i] = new LoggerCreateThread(logManager);
createThreads[i].setName("LoggerCreate-" + i);
createThreads[i].start();
}
LoggerListThread listThread = new LoggerListThread(logManager);
listThread.setName("LoggerList");
listThread.start();
try {
listThread.join(2000);
} catch (InterruptedException e) {
// Ignore
}
for (int i = 0; i < createThreads.length; i ++) {
createThreads[i].setRunning(false);
}
Assert.assertTrue(listThread.isRunning());
listThread.setRunning(false);
}
private static class LoggerCreateThread extends Thread {
private final LogManager logManager;
private volatile boolean running = true;
public LoggerCreateThread(LogManager logManager) {
this.logManager = logManager;
}
@Override
public void run() {
Random r = new Random();
while (running) {
Logger logger = Logger.getLogger("Bug56082-" + r.nextInt(100000));
logManager.addLogger(logger);
}
}
public void setRunning(boolean running) {
this.running = running;
}
}
private static class LoggerListThread extends Thread {
private final LogManager logManager;
private volatile boolean running = true;
public LoggerListThread(LogManager logManager) {
this.logManager = logManager;
}
@Override
public void run() {
while (running) {
try {
Collections.list(logManager.getLoggerNames());
} catch (Exception e) {
e.printStackTrace();
running = false;
}
}
}
public boolean isRunning() {
return running;
}
public void setRunning(boolean running) {
this.running = running;
}
}
}