/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2015, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.core;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import ch.qos.logback.core.spi.LifeCycle;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
public class ContextBaseTest {
private InstrumentedLifeCycleManager lifeCycleManager = new InstrumentedLifeCycleManager();
private InstrumentedContextBase context = new InstrumentedContextBase(lifeCycleManager);
@Test
public void renameDefault() {
context.setName(CoreConstants.DEFAULT_CONTEXT_NAME);
context.setName("hello");
}
@Test
public void idempotentNameTest() {
context.setName("hello");
context.setName("hello");
}
@Test
public void renameTest() {
context.setName("hello");
try {
context.setName("x");
fail("renaming is not allowed");
} catch (IllegalStateException ise) {
}
}
@Test
public void resetTest() {
context.setName("hello");
context.putProperty("keyA", "valA");
context.putObject("keyA", "valA");
assertEquals("valA", context.getProperty("keyA"));
assertEquals("valA", context.getObject("keyA"));
MockLifeCycleComponent component = new MockLifeCycleComponent();
context.register(component);
assertSame(component, lifeCycleManager.getLastComponent());
context.reset();
assertNull(context.getProperty("keyA"));
assertNull(context.getObject("keyA"));
assertTrue(lifeCycleManager.isReset());
}
@Test
public void contextNameProperty() {
assertNull(context.getProperty(CoreConstants.CONTEXT_NAME_KEY));
String HELLO = "hello";
context.setName(HELLO);
assertEquals(HELLO, context.getProperty(CoreConstants.CONTEXT_NAME_KEY));
// good to have a raw reference to the "CONTEXT_NAME" as most clients would
// not go through CoreConstants
assertEquals(HELLO, context.getProperty("CONTEXT_NAME"));
}
private static class InstrumentedContextBase extends ContextBase {
private final LifeCycleManager lifeCycleManager;
public InstrumentedContextBase(LifeCycleManager lifeCycleManager) {
this.lifeCycleManager = lifeCycleManager;
}
@Override
protected LifeCycleManager getLifeCycleManager() {
return lifeCycleManager;
}
}
private static class InstrumentedLifeCycleManager extends LifeCycleManager {
private LifeCycle lastComponent;
private boolean reset;
@Override
public void register(LifeCycle component) {
lastComponent = component;
super.register(component);
}
@Override
public void reset() {
reset = true;
super.reset();
}
public LifeCycle getLastComponent() {
return lastComponent;
}
public boolean isReset() {
return reset;
}
}
@Test
public void contextThreadpoolIsDaemonized() throws InterruptedException {
ExecutorService execSvc = context.getExecutorService();
final ArrayList<Thread> executingThreads = new ArrayList<Thread>();
execSvc.execute(new Runnable() {
@Override
public void run() {
synchronized (executingThreads) {
executingThreads.add(Thread.currentThread());
executingThreads.notifyAll();
}
}
});
synchronized (executingThreads) {
while (executingThreads.isEmpty()) {
executingThreads.wait();
}
}
assertTrue("executing thread should be a daemon thread.", executingThreads.get(0).isDaemon());
}
}