This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git
commit 32470525d6fef222d8a4d82dcf697aa10109b966 Author: Chetan Mehrotra <[email protected]> AuthorDate: Tue Jun 16 06:19:56 2015 +0000 SLING-4739 - Log Tracer - To enable logs for specific category at specific level and only for specific request Adding more tests git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1685715 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 11 + ...{LogTracerTest.java => LogTracerModelTest.java} | 2 +- .../sling/tracer/internal/LogTracerTest.java | 260 +++++++++++++++++---- 3 files changed, 232 insertions(+), 41 deletions(-) diff --git a/pom.xml b/pom.xml index ac55563..d9852a4 100644 --- a/pom.xml +++ b/pom.xml @@ -112,6 +112,17 @@ <artifactId>junit</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.testing.osgi-mock</artifactId> + <version>1.3.0</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <version>1.10.19</version> + </dependency> </dependencies> </project> diff --git a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java b/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java similarity index 98% copy from src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java copy to src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java index 9895561..09c55f1 100644 --- a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java @@ -28,7 +28,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -public class LogTracerTest { +public class LogTracerModelTest { @Test(expected = IllegalArgumentException.class) public void parseInvalidConfig() throws Exception { diff --git a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java b/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java index 9895561..d476a64 100644 --- a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java @@ -16,77 +16,257 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.sling.tracer.internal; -import java.util.Arrays; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.classic.turbo.TurboFilter; +import ch.qos.logback.core.read.ListAppender; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.testing.mock.osgi.MockOsgi; +import org.apache.sling.testing.mock.osgi.junit.OsgiContext; +import org.apache.sling.testing.mock.osgi.junit.OsgiContextCallback; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestWatcher; +import org.junit.runner.Description; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.slf4j.LoggerFactory; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.slf4j.LoggerFactory.getLogger; public class LogTracerTest { - @Test(expected = IllegalArgumentException.class) - public void parseInvalidConfig() throws Exception { - new TracerSet("foo"); + @Rule + public final LogCollector logCollector = new LogCollector(); + + @Rule + public final OsgiContext context = new OsgiContext(null, new OsgiContextCallback() { + @Override + public void execute(OsgiContext context) throws IOException { + if (context.getService(TurboFilter.class) != null) { + TurboFilter[] tfs = context.getServices(TurboFilter.class, null); + for (TurboFilter tf : tfs) { + getLogContext().getTurboFilterList().remove(tf); + } + } + } + }); + + @Test + public void defaultSetup() throws Exception { + context.registerInjectActivateService(new LogTracer()); + assertNull("Filters should not be registered unless enabled", context.getService(Filter.class)); } @Test - public void parseTracerSet() throws Exception { - TracerSet a = new TracerSet("foo : com.foo, com.bar;level=INFO"); - assertEquals("foo", a.getName()); - TracerConfig tcfoo = a.getConfig("com.foo"); - assertNotNull(tcfoo); - assertEquals(Level.DEBUG, tcfoo.getLevel()); + public void enableTracer() throws Exception { + LogTracer tracer = context.registerInjectActivateService(new LogTracer(), + ImmutableMap.<String, Object>of("enabled", "true")); + assertEquals(2, context.getServices(Filter.class, null).length); - assertNotNull("Config for parent should match for child", a.getConfig("com.foo.bar")); + MockOsgi.deactivate(tracer); + assertNull(context.getService(Filter.class)); + } + + @Test + public void noTurboFilterRegisteredUnlessTracingRequested() throws Exception { + HttpServletRequest request = mock(HttpServletRequest.class); + HttpServletResponse response = mock(HttpServletResponse.class); + activateTracer(); + FilterChain chain = new FilterChain() { + @Override + public void doFilter(ServletRequest request, ServletResponse response) + throws IOException, ServletException { + assertNull(context.getService(TurboFilter.class)); + } + }; - TracerConfig tcbar = a.getConfig("com.bar"); - assertNotNull(tcbar); - assertEquals(Level.INFO, tcbar.getLevel()); + Filter filter = getFilter(false); + filter.doFilter(request, response, chain); } @Test - public void childLoggerLevelDiff() throws Exception { - TracerSet ts = new TracerSet("foo : a.b;level=trace, a.b.c;level=info"); - TracerContext tc = getContext(ts); + public void turboFilterRegisteredWhenTracingRequested() throws Exception { + HttpServletRequest request = mock(HttpServletRequest.class); + HttpServletResponse response = mock(HttpServletResponse.class); - assertTrue(tc.shouldLog("a.b", Level.TRACE)); - assertTrue(tc.shouldLog("a.b.d", Level.TRACE)); - assertFalse(tc.shouldLog("a.b.c", Level.TRACE)); + when(request.getHeader(LogTracer.HEADER_TRACER_CONFIG)).thenReturn("foo.bar"); + activateTracer(); + FilterChain chain = new FilterChain() { + @Override + public void doFilter(ServletRequest request, ServletResponse response) + throws IOException, ServletException { + assertNotNull(context.getService(TurboFilter.class)); + } + }; + + Filter filter = getFilter(false); + filter.doFilter(request, response, chain); + assertNull("TurboFilter should get removed once request is done", + context.getService(TurboFilter.class)); } @Test - public void tracerConfigTest() throws Exception { - TracerConfig tc = new TracerConfig("a.b.c", Level.DEBUG); - assertEquals(3, tc.getDepth()); - assertEquals(TracerConfig.MatchResult.MATCH_LOG, tc.match("a.b.c.d", Level.DEBUG)); - assertEquals(TracerConfig.MatchResult.MATCH_NO_LOG, tc.match("a.b.c.d", Level.TRACE)); - assertEquals(TracerConfig.MatchResult.NO_MATCH, tc.match("a.b.d", Level.TRACE)); + public void turboFilterRegisteredWhenTracingRequested_Sling() throws Exception { + HttpServletRequest request = mock(SlingHttpServletRequest.class); + HttpServletResponse response = mock(HttpServletResponse.class); + + when(request.getParameter(LogTracer.PARAM_TRACER_CONFIG)).thenReturn("foo.bar"); + activateTracer(); + FilterChain chain = new FilterChain() { + @Override + public void doFilter(ServletRequest request, ServletResponse response) + throws IOException, ServletException { + assertNotNull(context.getService(TurboFilter.class)); + } + }; + + Filter filter = getFilter(true); + filter.doFilter(request, response, chain); + assertNull("TurboFilter should get removed once request is done", + context.getService(TurboFilter.class)); } @Test - public void tracerConfigSort() throws Exception { - TracerConfig[] configs = new TracerConfig[]{ - new TracerConfig("a.b.c.d", Level.DEBUG), - new TracerConfig("a", Level.DEBUG), - new TracerConfig("a.b.e", Level.DEBUG), + public void checkTracing() throws Exception { + HttpServletRequest request = mock(SlingHttpServletRequest.class); + HttpServletResponse response = mock(HttpServletResponse.class); + + when(request.getParameter(LogTracer.PARAM_TRACER_CONFIG)).thenReturn("a.b.c;level=trace,a.b;level=debug"); + activateTracer(); + Level oldLevel = rootLogger().getLevel(); + rootLogger().setLevel(Level.INFO); + + FilterChain chain = new FilterChain() { + @Override + public void doFilter(ServletRequest request, ServletResponse response) + throws IOException, ServletException { + TurboFilter turboFilter = context.getService(TurboFilter.class); + assertNotNull(turboFilter); + getLogContext().addTurboFilter(turboFilter); + getLogger("a").info("a-info"); + getLogger("a").debug("a-debug"); + getLogger("a.b").info("a.b-info"); + getLogger("a.b").debug("a.b-debug"); + getLogger("a.b").trace("a.b-trace"); + getLogger("a.b.c").debug("a.b.c-debug"); + getLogger("a.b.c").trace("a.b.c-trace"); + getLogger("a.b.c.d").trace("a.b.c.d-trace"); + + if (getLogger("a.b.c").isTraceEnabled()){ + getLogger("a.b.c").trace("a.b.c-trace2"); + } + } }; - Arrays.sort(configs); - assertEquals("a.b.c.d", configs[0].getLoggerName()); - assertEquals("a.b.e", configs[1].getLoggerName()); - assertEquals("a", configs[2].getLoggerName()); + Filter filter = getFilter(true); + filter.doFilter(request, response, chain); + assertNull(context.getService(TurboFilter.class)); + List<String> logs = logCollector.getLogs(); + assertThat(logs, hasItem("a-info")); + assertThat(logs, not(hasItem("a-debug"))); + + assertThat(logs, hasItem("a.b-info")); + assertThat(logs, hasItem("a.b-debug")); + assertThat(logs, not(hasItem("a.b-trace"))); + + assertThat(logs, hasItem("a.b.c-debug")); + assertThat(logs, hasItem("a.b.c-trace")); + assertThat(logs, hasItem("a.b.c-trace2")); + assertThat(logs, hasItem("a.b.c.d-trace")); + + rootLogger().setLevel(oldLevel); + } + + + private void activateTracer() { + context.registerInjectActivateService(new LogTracer(), + ImmutableMap.<String, Object>of("enabled", "true")); + } + + private Filter getFilter(boolean slingFilter) throws InvalidSyntaxException { + Collection<ServiceReference<Filter>> refs = + context.bundleContext().getServiceReferences(Filter.class, null); + ServiceReference<Filter> result = null; + for (ServiceReference<Filter> ref : refs) { + if (slingFilter && ref.getProperty("filter.scope") != null) { + result = ref; + break; + } else if (!slingFilter && ref.getProperty("pattern") != null) { + result = ref; + break; + } + } + + if (result != null) { + return context.bundleContext().getService(result); + } + throw new AssertionError("No filter found"); } - private static TracerContext getContext(TracerSet ts) { - return new TracerContext(ts.getConfigs().toArray(new TracerConfig[ts.getConfigs().size()])); + private static LoggerContext getLogContext(){ + return (LoggerContext)LoggerFactory.getILoggerFactory(); + } + + private static ch.qos.logback.classic.Logger rootLogger() { + return getLogContext().getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); + } + + private static class LogCollector extends TestWatcher { + private List<String> msgs = Lists.newArrayList(); + private TestAppender appender = new TestAppender(); + + public List<String> getLogs(){ + return msgs; + } + + @Override + protected void starting(Description description) { + appender.setContext(getLogContext()); + appender.setName("TestLogCollector"); + appender.start(); + rootLogger().addAppender(appender); + } + + @Override + protected void finished(Description description) { + rootLogger().detachAppender(appender); + } + + private class TestAppender extends ListAppender<ILoggingEvent>{ + @Override + protected void append(ILoggingEvent iLoggingEvent) { + msgs.add(iLoggingEvent.getFormattedMessage()); + } + } } -} \ No newline at end of file +} -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
