/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2013, 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.joran;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import ch.qos.logback.core.joran.spi.ElementSelector;
import org.junit.Test;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.joran.action.Action;
import ch.qos.logback.core.joran.action.NOPAction;
import ch.qos.logback.core.joran.action.ext.BadBeginAction;
import ch.qos.logback.core.joran.action.ext.BadEndAction;
import ch.qos.logback.core.joran.action.ext.HelloAction;
import ch.qos.logback.core.joran.action.ext.TouchAction;
import ch.qos.logback.core.joran.spi.ActionException;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusManager;
import ch.qos.logback.core.util.CoreTestConstants;
/**
* Test the way Interpreter skips child elements in case of exceptions thrown by
* Actions. It also tests addition of status messages in case of exceptions.
*
* @author Ceki Gulcu
*/
public class SkippingInInterpreterTest {
HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
Context context = new ContextBase();
StatusManager sm = context.getStatusManager();
SAXParser createParser() throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
return spf.newSAXParser();
}
void doTest(String filename, Integer expectedInt, Class<?> exceptionClass)
throws Exception {
rulesMap.put(new ElementSelector("test"), new NOPAction());
rulesMap.put(new ElementSelector("test/badBegin"), new BadBeginAction());
rulesMap.put(new ElementSelector("test/badBegin/touch"), new TouchAction());
rulesMap.put(new ElementSelector("test/badEnd"), new BadEndAction());
rulesMap.put(new ElementSelector("test/badEnd/touch"), new TouchAction());
rulesMap.put(new ElementSelector("test/hello"), new HelloAction());
rulesMap.put(new ElementSelector("test/isolate"), new NOPAction());
rulesMap.put(new ElementSelector("test/isolate/badEnd"), new BadEndAction());
rulesMap.put(new ElementSelector("test/isolate/badEnd/touch"), new TouchAction());
rulesMap.put(new ElementSelector("test/isolate/touch"), new TouchAction());
rulesMap.put(new ElementSelector("test/hello"), new HelloAction());
TrivialConfigurator tc = new TrivialConfigurator(rulesMap);
tc.setContext(context);
tc.doConfigure(CoreTestConstants.TEST_SRC_PREFIX + "input/joran/skip/" + filename);
String str = context.getProperty(HelloAction.PROPERTY_KEY);
assertEquals("Hello John Doe.", str);
Integer i = (Integer) context.getObject(TouchAction.KEY);
if (expectedInt == null) {
assertNull(i);
} else {
assertEquals(expectedInt, i);
}
// check the existence of an ERROR status
List<Status> statusList = sm.getCopyOfStatusList();
Status s0 = statusList.get(0);
assertEquals(Status.ERROR, s0.getLevel());
assertTrue(s0.getThrowable().getClass() == exceptionClass);
}
@Test
public void testSkippingRuntimeExInBadBegin() throws Exception {
doTest("badBegin1.xml", null, IllegalStateException.class);
}
@Test
public void testSkippingActionExInBadBegin() throws Exception {
doTest("badBegin2.xml", null, ActionException.class);
}
@Test
public void testSkippingRuntimeExInBadEnd() throws Exception {
doTest("badEnd1.xml", new Integer(2), IllegalStateException.class);
}
@Test
public void testSkippingActionExInBadEnd() throws Exception {
doTest("badEnd2.xml", new Integer(2), ActionException.class);
}
}