You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/10/18 23:25:47 UTC

[sling-org-apache-sling-tracer] 03/49: SLING-4739 - Log Tracer - To enable logs for specific category at specific level and only for specific request

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 <ch...@apache.org>
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
"commits@sling.apache.org" <co...@sling.apache.org>.