NIFI-1376 Provide access to logged messages from TestRunner
Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/13c6aeec Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/13c6aeec Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/13c6aeec Branch: refs/heads/master Commit: 13c6aeec952488acf6d4181700bc6606f552e9f5 Parents: beb9249 Author: Richard Miskin <[email protected]> Authored: Sat Jan 9 20:39:57 2016 +0000 Committer: Mark Payne <[email protected]> Committed: Mon Jan 25 16:32:28 2016 -0500 ---------------------------------------------------------------------- .../org/apache/nifi/util/CapturingLogger.java | 413 +++++++++++++++++++ .../java/org/apache/nifi/util/LogMessage.java | 29 ++ .../MockProcessorInitializationContext.java | 5 +- .../org/apache/nifi/util/MockProcessorLog.java | 41 +- .../nifi/util/StandardProcessorTestRunner.java | 14 +- .../java/org/apache/nifi/util/TestRunner.java | 14 + 6 files changed, 510 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/13c6aeec/nifi-mock/src/main/java/org/apache/nifi/util/CapturingLogger.java ---------------------------------------------------------------------- diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/CapturingLogger.java b/nifi-mock/src/main/java/org/apache/nifi/util/CapturingLogger.java new file mode 100644 index 0000000..f404529 --- /dev/null +++ b/nifi-mock/src/main/java/org/apache/nifi/util/CapturingLogger.java @@ -0,0 +1,413 @@ +package org.apache.nifi.util; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.Marker; + +/** + * Implementation of SLF4J logger that records every log message and provides a mechanism + * to retrieve them. + * + */ +public class CapturingLogger implements Logger { + + private final Logger logger; + + private List<LogMessage> traceMessages = new ArrayList<>(); + private List<LogMessage> debugMessages = new ArrayList<>(); + private List<LogMessage> infoMessages = new ArrayList<>(); + private List<LogMessage> warnMessages = new ArrayList<>(); + private List<LogMessage> errorMessages = new ArrayList<>(); + + public CapturingLogger(final Logger logger) { + this.logger = logger; + } + public List<LogMessage> getTraceMessages() { + return Collections.unmodifiableList(traceMessages); + } + public List<LogMessage> getDebugMessages() { + return Collections.unmodifiableList(debugMessages); + } + public List<LogMessage> getInfoMessages() { + return Collections.unmodifiableList(infoMessages); + } + public List<LogMessage> getWarnMessages() { + return Collections.unmodifiableList(warnMessages); + } + public List<LogMessage> getErrorMessages() { + return Collections.unmodifiableList(errorMessages); + } + + @Override + public String getName() { + return logger.getName(); + } + + @Override + public boolean isTraceEnabled() { + return logger.isTraceEnabled(); + } + + @Override + public void trace(String msg) { + traceMessages.add(new LogMessage(null, msg, null)); + logger.trace(msg); + } + + @Override + public void trace(String format, Object arg) { + traceMessages.add(new LogMessage(null, format, null, arg)); + logger.trace(format, arg); + } + + @Override + public void trace(String format, Object arg1, Object arg2) { + traceMessages.add(new LogMessage(null, format, null, arg1, arg2)); + logger.trace(format, arg1, arg2); + } + + @Override + public void trace(String format, Object... arguments) { + traceMessages.add(new LogMessage(null, format, null, arguments)); + logger.trace(format, arguments); + } + + @Override + public void trace(String msg, Throwable t) { + traceMessages.add(new LogMessage(null, msg, t)); + logger.trace(msg, t); + } + + @Override + public boolean isTraceEnabled(Marker marker) { + return logger.isTraceEnabled(marker); + } + + @Override + public void trace(Marker marker, String msg) { + traceMessages.add(new LogMessage(marker, msg, null)); + logger.trace(marker, msg); + + } + + @Override + public void trace(Marker marker, String format, Object arg) { + traceMessages.add(new LogMessage(marker, format, null, arg)); + logger.trace(marker, format, arg); + + } + + @Override + public void trace(Marker marker, String format, Object arg1, Object arg2) { + traceMessages.add(new LogMessage(marker, format, null, arg1, arg2)); + logger.trace(marker, format, arg1, arg2); + } + + @Override + public void trace(Marker marker, String format, Object... argArray) { + traceMessages.add(new LogMessage(marker, format, null, argArray)); + logger.trace(marker, format, argArray); + } + + @Override + public void trace(Marker marker, String msg, Throwable t) { + traceMessages.add(new LogMessage(marker, msg, t)); + logger.trace(marker, msg, t); + } + + // DEBUG + @Override + public boolean isDebugEnabled() { + return logger.isDebugEnabled(); + } + + @Override + public void debug(String msg) { + debugMessages.add(new LogMessage(null, msg, null)); + logger.debug(msg); + } + + @Override + public void debug(String format, Object arg) { + debugMessages.add(new LogMessage(null, format, null, arg)); + logger.debug(format, arg); + } + + @Override + public void debug(String format, Object arg1, Object arg2) { + debugMessages.add(new LogMessage(null, format, null, arg1, arg2)); + logger.debug(format, arg1, arg2); + } + + @Override + public void debug(String format, Object... arguments) { + debugMessages.add(new LogMessage(null, format, null, arguments)); + logger.debug(format, arguments); + } + + @Override + public void debug(String msg, Throwable t) { + debugMessages.add(new LogMessage(null, msg, t)); + logger.debug(msg, t); + } + + @Override + public boolean isDebugEnabled(Marker marker) { + return logger.isDebugEnabled(marker); + } + + @Override + public void debug(Marker marker, String msg) { + debugMessages.add(new LogMessage(marker, msg, null)); + logger.debug(marker, msg); + + } + + @Override + public void debug(Marker marker, String format, Object arg) { + debugMessages.add(new LogMessage(marker, format, null, arg)); + logger.debug(marker, format, arg); + + } + + @Override + public void debug(Marker marker, String format, Object arg1, Object arg2) { + debugMessages.add(new LogMessage(marker, format, null, arg1, arg2)); + logger.debug(marker, format, arg1, arg2); + } + + @Override + public void debug(Marker marker, String format, Object... argArray) { + debugMessages.add(new LogMessage(marker, format, null, argArray)); + logger.debug(marker, format, argArray); + } + + @Override + public void debug(Marker marker, String msg, Throwable t) { + debugMessages.add(new LogMessage(marker, msg, t)); + logger.debug(marker, msg, t); + } + + + + // INFO + @Override + public boolean isInfoEnabled() { + return logger.isInfoEnabled(); + } + + @Override + public void info(String msg) { + infoMessages.add(new LogMessage(null, msg, null)); + logger.info(msg); + } + + @Override + public void info(String format, Object arg) { + infoMessages.add(new LogMessage(null, format, null, arg)); + logger.info(format, arg); + } + + @Override + public void info(String format, Object arg1, Object arg2) { + infoMessages.add(new LogMessage(null, format, null, arg1, arg2)); + logger.info(format, arg1, arg2); + } + + @Override + public void info(String format, Object... arguments) { + infoMessages.add(new LogMessage(null, format, null, arguments)); + logger.info(format, arguments); + } + + @Override + public void info(String msg, Throwable t) { + infoMessages.add(new LogMessage(null, msg, t)); + logger.info(msg, t); + } + + @Override + public boolean isInfoEnabled(Marker marker) { + return logger.isInfoEnabled(marker); + } + + @Override + public void info(Marker marker, String msg) { + infoMessages.add(new LogMessage(marker, msg, null)); + logger.info(marker, msg); + + } + + @Override + public void info(Marker marker, String format, Object arg) { + infoMessages.add(new LogMessage(marker, format, null, arg)); + logger.info(marker, format, arg); + + } + + @Override + public void info(Marker marker, String format, Object arg1, Object arg2) { + infoMessages.add(new LogMessage(marker, format, null, arg1, arg2)); + logger.info(marker, format, arg1, arg2); + } + + @Override + public void info(Marker marker, String format, Object... argArray) { + infoMessages.add(new LogMessage(marker, format, null, argArray)); + logger.info(marker, format, argArray); + } + + @Override + public void info(Marker marker, String msg, Throwable t) { + infoMessages.add(new LogMessage(marker, msg, t)); + logger.debug(marker, msg, t); + } + // WARN + @Override + public boolean isWarnEnabled() { + return logger.isWarnEnabled(); + } + + @Override + public void warn(String msg) { + warnMessages.add(new LogMessage(null, msg, null)); + logger.warn(msg); + } + + @Override + public void warn(String format, Object arg) { + warnMessages.add(new LogMessage(null, format, null, arg)); + logger.warn(format, arg); + } + + @Override + public void warn(String format, Object arg1, Object arg2) { + warnMessages.add(new LogMessage(null, format, null, arg1, arg2)); + logger.warn(format, arg1, arg2); + } + + @Override + public void warn(String format, Object... arguments) { + warnMessages.add(new LogMessage(null, format, null, arguments)); + logger.warn(format, arguments); + } + + @Override + public void warn(String msg, Throwable t) { + warnMessages.add(new LogMessage(null, msg, t)); + logger.warn(msg, t); + } + + @Override + public boolean isWarnEnabled(Marker marker) { + return logger.isWarnEnabled(marker); + } + + @Override + public void warn(Marker marker, String msg) { + warnMessages.add(new LogMessage(marker, msg, null)); + logger.warn(marker, msg); + + } + + @Override + public void warn(Marker marker, String format, Object arg) { + warnMessages.add(new LogMessage(marker, format, null, arg)); + logger.warn(marker, format, arg); + + } + + @Override + public void warn(Marker marker, String format, Object arg1, Object arg2) { + warnMessages.add(new LogMessage(marker, format, null, arg1, arg2)); + logger.warn(marker, format, arg1, arg2); + } + + @Override + public void warn(Marker marker, String format, Object... argArray) { + warnMessages.add(new LogMessage(marker, format, null, argArray)); + logger.warn(marker, format, argArray); + } + + @Override + public void warn(Marker marker, String msg, Throwable t) { + warnMessages.add(new LogMessage(marker, msg, t)); + logger.warn(marker, msg, t); + } + // ERROR + @Override + public boolean isErrorEnabled() { + return logger.isErrorEnabled(); + } + + @Override + public void error(String msg) { + errorMessages.add(new LogMessage(null, msg, null)); + logger.error(msg); + } + + @Override + public void error(String format, Object arg) { + errorMessages.add(new LogMessage(null, format, null, arg)); + logger.error(format, arg); + } + + @Override + public void error(String format, Object arg1, Object arg2) { + errorMessages.add(new LogMessage(null, format, null, arg1, arg2)); + logger.error(format, arg1, arg2); + } + + @Override + public void error(String format, Object... arguments) { + errorMessages.add(new LogMessage(null, format, null, arguments)); + logger.error(format, arguments); + } + + @Override + public void error(String msg, Throwable t) { + errorMessages.add(new LogMessage(null, msg, t)); + logger.error(msg, t); + } + + @Override + public boolean isErrorEnabled(Marker marker) { + return logger.isErrorEnabled(marker); + } + + @Override + public void error(Marker marker, String msg) { + errorMessages.add(new LogMessage(marker, msg, null)); + logger.error(marker, msg); + + } + + @Override + public void error(Marker marker, String format, Object arg) { + errorMessages.add(new LogMessage(marker, format, null, arg)); + logger.error(marker, format, arg); + + } + + @Override + public void error(Marker marker, String format, Object arg1, Object arg2) { + errorMessages.add(new LogMessage(marker, format, null, arg1, arg2)); + logger.error(marker, format, arg1, arg2); + } + + @Override + public void error(Marker marker, String format, Object... argArray) { + errorMessages.add(new LogMessage(marker, format, null, argArray)); + logger.error(marker, format, argArray); + } + + @Override + public void error(Marker marker, String msg, Throwable t) { + errorMessages.add(new LogMessage(marker, msg, t)); + logger.error(marker, msg, t); + } + +} http://git-wip-us.apache.org/repos/asf/nifi/blob/13c6aeec/nifi-mock/src/main/java/org/apache/nifi/util/LogMessage.java ---------------------------------------------------------------------- diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/LogMessage.java b/nifi-mock/src/main/java/org/apache/nifi/util/LogMessage.java new file mode 100644 index 0000000..e12b695 --- /dev/null +++ b/nifi-mock/src/main/java/org/apache/nifi/util/LogMessage.java @@ -0,0 +1,29 @@ +package org.apache.nifi.util; + +import org.slf4j.Marker; + +public class LogMessage { + private final Marker marker; + private final String msg; + private final Throwable throwable; + private final Object[] args; + public LogMessage(final Marker marker, final String msg, final Throwable t, final Object... args) { + this.marker = marker; + this.msg = msg; + this.throwable = t; + this.args = args; + } + + public Marker getMarker() { + return marker; + } + public String getMsg() { + return msg; + } + public Throwable getThrowable() { + return throwable; + } + public Object[] getArgs() { + return args; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/nifi/blob/13c6aeec/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorInitializationContext.java ---------------------------------------------------------------------- diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorInitializationContext.java b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorInitializationContext.java index 2e5d3eb..6e94943 100644 --- a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorInitializationContext.java +++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorInitializationContext.java @@ -21,13 +21,12 @@ import java.util.UUID; import org.apache.nifi.controller.ControllerService; import org.apache.nifi.controller.ControllerServiceLookup; -import org.apache.nifi.logging.ProcessorLog; import org.apache.nifi.processor.Processor; import org.apache.nifi.processor.ProcessorInitializationContext; public class MockProcessorInitializationContext implements ProcessorInitializationContext, ControllerServiceLookup { - private final ProcessorLog logger; + private final MockProcessorLog logger; private final String processorId; private final MockProcessContext context; @@ -43,7 +42,7 @@ public class MockProcessorInitializationContext implements ProcessorInitializati } @Override - public ProcessorLog getLogger() { + public MockProcessorLog getLogger() { return logger; } http://git-wip-us.apache.org/repos/asf/nifi/blob/13c6aeec/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java ---------------------------------------------------------------------- diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java index 837784b..0bc587f 100644 --- a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java +++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessorLog.java @@ -16,19 +16,56 @@ */ package org.apache.nifi.util; +import java.util.List; + import org.apache.nifi.logging.ProcessorLog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MockProcessorLog implements ProcessorLog { - private final Logger logger; + private final CapturingLogger logger; private final Object component; public MockProcessorLog(final String componentId, final Object component) { - this.logger = LoggerFactory.getLogger(component.getClass()); + this.logger = new CapturingLogger(LoggerFactory.getLogger(component.getClass())); this.component = component; } + + /** + * @return a {@link List} of all TRACE level messages recorded by this {@link Logger}. + */ + public List<LogMessage> getTraceMessages() { + return logger.getTraceMessages(); + } + + /** + * @return a {@link List} of all DEBUG level messages recorded by this {@link Logger}. + */ + public List<LogMessage> getDebugMessages() { + return logger.getDebugMessages(); + } + + /** + * @return a {@link List} of all INFO level messages recorded by this {@link Logger}. + */ + public List<LogMessage> getInfoMessages() { + return logger.getInfoMessages(); + } + + /** + * @return a {@link List} of all WARN level messages recorded by this {@link Logger}. + */ + public List<LogMessage> getWarnMessages() { + return logger.getWarnMessages(); + } + + /** + * @return a {@link List} of all ERROR level messages recorded by this {@link Logger}. + */ + public List<LogMessage> getErrorMessages() { + return logger.getErrorMessages(); + } private Object[] addProcessor(final Object[] originalArgs) { return prependToArgs(originalArgs, component); http://git-wip-us.apache.org/repos/asf/nifi/blob/13c6aeec/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java ---------------------------------------------------------------------- diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java index 925f0d8..9cb514a 100644 --- a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java +++ b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java @@ -86,6 +86,8 @@ public class StandardProcessorTestRunner implements TestRunner { private static final Set<Class<? extends Annotation>> deprecatedTypeAnnotations = new HashSet<>(); private static final Set<Class<? extends Annotation>> deprecatedMethodAnnotations = new HashSet<>(); + private final Map<String, MockProcessorLog> controllerServiceLoggers = new HashMap<>(); + private final MockProcessorLog logger; static { // do this in a separate method, just so that we can add a @SuppressWarnings annotation @@ -106,6 +108,7 @@ public class StandardProcessorTestRunner implements TestRunner { final MockProcessorInitializationContext mockInitContext = new MockProcessorInitializationContext(processor, context); processor.initialize(mockInitContext); + logger = mockInitContext.getLogger(); try { ReflectionUtils.invokeMethodsWithAnnotation(OnAdded.class, processor); @@ -574,7 +577,8 @@ public class StandardProcessorTestRunner implements TestRunner { // } // } - final ComponentLog logger = new MockProcessorLog(identifier, service); + final MockProcessorLog logger = new MockProcessorLog(identifier, service); + controllerServiceLoggers.put(identifier, logger); final MockControllerServiceInitializationContext initContext = new MockControllerServiceInitializationContext(requireNonNull(service), requireNonNull(identifier), logger); initContext.addControllerServices(context); service.initialize(initContext); @@ -767,5 +771,13 @@ public class StandardProcessorTestRunner implements TestRunner { public void clearProvenanceEvents() { sharedState.clearProvenanceEvents(); } + + public MockProcessorLog getLogger() { + return logger; + } + public MockProcessorLog getControllerServiceLogger(final String identifier) { + return controllerServiceLoggers.get(identifier); + } + } http://git-wip-us.apache.org/repos/asf/nifi/blob/13c6aeec/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java ---------------------------------------------------------------------- diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java b/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java index 6c8f192..0bb588c 100644 --- a/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java +++ b/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java @@ -824,4 +824,18 @@ public interface TestRunner { * Clears the Provenance Events that have been emitted by the Processor */ void clearProvenanceEvents(); + + /** + * Returns the {@link MockProcessorLog} that is used by the Processor under test. + * @return the logger + */ + public MockProcessorLog getLogger(); + + /** + * Returns the {@link MockProcessorLog} that is used by the specified controller service. + * + * @param identifier a controller service identifier + * @return the logger + */ + public MockProcessorLog getControllerServiceLogger(final String identifier); }
