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>.