Author: chetanm
Date: Tue Jun 16 06:19:56 2015
New Revision: 1685715
URL: http://svn.apache.org/r1685715
Log:
SLING-4739 - Log Tracer - To enable logs for specific category at specific
level and only for specific request
Adding more tests
Added:
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java
- copied, changed from r1685576,
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
Modified:
sling/trunk/contrib/extensions/tracer/pom.xml
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
Modified: sling/trunk/contrib/extensions/tracer/pom.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tracer/pom.xml?rev=1685715&r1=1685714&r2=1685715&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/tracer/pom.xml (original)
+++ sling/trunk/contrib/extensions/tracer/pom.xml Tue Jun 16 06:19:56 2015
@@ -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>
Copied:
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java
(from r1685576,
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java)
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java?p2=sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java&p1=sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java&r1=1685576&r2=1685715&rev=1685715&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
(original)
+++
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java
Tue Jun 16 06:19:56 2015
@@ -28,7 +28,7 @@ import static org.junit.Assert.assertFal
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 {
Modified:
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java?rev=1685715&r1=1685714&r2=1685715&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
(original)
+++
sling/trunk/contrib/extensions/tracer/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
Tue Jun 16 06:19:56 2015
@@ -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);
+
+
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));
+ }
+ };
- assertTrue(tc.shouldLog("a.b", Level.TRACE));
- assertTrue(tc.shouldLog("a.b.d", Level.TRACE));
- assertFalse(tc.shouldLog("a.b.c", Level.TRACE));
+ 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 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 TracerContext getContext(TracerSet ts) {
- return new TracerContext(ts.getConfigs().toArray(new
TracerConfig[ts.getConfigs().size()]));
+ 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
+}