/*
* Copyright (c) 2002 Cunningham & Cunningham, Inc.
* Copyright (c) 2009-2015 by Jochen Wierum & Cologne Intelligence
*
* This file is part of FitGoodies.
*
* FitGoodies is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FitGoodies is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FitGoodies. If not, see <http://www.gnu.org/licenses/>.
*/
package de.cologneintelligence.fitgoodies.log4j;
import de.cologneintelligence.fitgoodies.testsupport.FitGoodiesTestCase;
import org.apache.log4j.Appender;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ThrowableInformation;
import org.junit.Before;
import org.junit.Test;
import java.util.Collections;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public final class CaptureAppenderTest extends FitGoodiesTestCase {
private static class TestFilter extends Filter {
@Override
public int decide(final LoggingEvent arg0) {
return 0;
}
}
private Appender appenderMock;
private Filter filterMock;
@Before
public void setUp() throws Exception {
appenderMock = mock(Appender.class);
filterMock = new TestFilter();
}
@Test
public void testStorage() {
when(appenderMock.getName()).thenReturn("BaseAppender");
CaptureAppender appender = CaptureAppender.newAppenderFrom(appenderMock);
LoggingEvent ev1 = event("fqdn", 42, Level.DEBUG, "message",
"thread", throwableInfo("x"), "ndc");
LoggingEvent ev2 = event("fqdn2", 42, Level.ERROR, "warning",
"thread2", throwableInfo("y"), "ndc2");
appender.doAppend(ev1);
appender.doAppend(ev2);
LoggingEvent[] events = appender.getAllEvents();
assertThat(events[0], is(sameInstance(ev1)));
assertThat(events[1], is(sameInstance(ev2)));
}
@Test
public void testReset() {
when(appenderMock.getName()).thenReturn("BaseAppender");
CaptureAppender appender = CaptureAppender.newAppenderFrom(appenderMock);
LoggingEvent ev1 = event("fqdn", 42, Level.DEBUG, "message",
"thread", throwableInfo("x"), "ndc");
LoggingEvent ev2 = event("fqdn2", 42, Level.ERROR, "warning",
"thread2", throwableInfo("y"), "ndc2");
appender.doAppend(ev1);
appender.doAppend(ev2);
appender.clear();
LoggingEvent[] events = appender.getAllEvents();
assertThat(events.length, is(equalTo((Object) 0)));
}
@Test
public void testParentValues() {
when(appenderMock.getName()).thenReturn("BaseAppender");
when(appenderMock.getFilter()).thenReturn(filterMock);
CaptureAppender appender = CaptureAppender.newAppenderFrom(appenderMock);
assertThat(appender.getFilter(), is(sameInstance(filterMock)));
assertThat(appender.getName(), is(equalTo("BaseAppender-fitgoodiescapture")));
}
@Test
public void testDefaultValues() {
when(appenderMock.getName()).thenReturn("BaseAppender");
CaptureAppender appender = CaptureAppender.newAppenderFrom(appenderMock);
appender.clearFilters();
appender.addFilter(new Filter() {
@Override
public int decide(final LoggingEvent event) {
return Filter.ACCEPT;
}
});
appender.close();
appender.setName("x");
appender.setLayout(new Layout() {
@Override
public String format(final LoggingEvent event) {
return null;
}
@Override
public boolean ignoresThrowable() {
return false;
}
@Override
public void activateOptions() {
}
});
assertThat(appender.getName(), is(equalTo(CaptureAppender.getAppenderNameFor("BaseAppender"))));
assertThat(appender.requiresLayout(), is(false));
}
@Test
public void testAppenderName() {
assertThat(CaptureAppender.getAppenderNameFor("test"), is(equalTo("test-fitgoodiescapture")));
assertThat(CaptureAppender.getAppenderNameFor("test2"), is(equalTo("test2-fitgoodiescapture")));
}
private LoggingEvent event(String fqnOfCategoryClass, long timeStamp, Level level, Object message,
String threadName, ThrowableInformation throwable, String ndc) {
return new LoggingEvent(fqnOfCategoryClass, null, timeStamp, level, message,
threadName, throwable, ndc, null, Collections.emptyMap());
}
protected ThrowableInformation throwableInfo(String text) {
return new ThrowableInformation(new RuntimeException(text));
}
}