55package com .yahoo .validatar ;
66
77import org .apache .commons .io .output .NullOutputStream ;
8- import org .apache .log4j .Appender ;
9- import org .apache .log4j .Level ;
10- import org .apache .log4j .Logger ;
11- import org .apache .log4j .spi .LoggingEvent ;
12- import org .mockito .ArgumentCaptor ;
138
149import java .io .FileDescriptor ;
1510import java .io .FileOutputStream ;
1611import java .io .PrintStream ;
17- import java .util .List ;
1812
19- import static org .mockito .Mockito .atLeastOnce ;
20- import static org .mockito .Mockito .mock ;
21- import static org .mockito .Mockito .never ;
22- import static org .mockito .Mockito .verify ;
23-
24- /**
25- * Extend this class to capture logging output without printing to stdout
26- * Call setupMockedAppender and teardownMockedAppender to start and stop
27- * the capturing and use isStringInLog to check if desired output in log
28- * was seen.
29- */
3013public class OutputCaptor {
31- protected Appender mockedAppender ;
32- protected Level originalLevel ;
33- protected Appender originalAppender ;
34-
3514 public static final PrintStream NULL = new PrintStream (NullOutputStream .NULL_OUTPUT_STREAM );
3615 public static final PrintStream OUT = new PrintStream (new FileOutputStream (FileDescriptor .out ));
3716 public static final PrintStream ERR = new PrintStream (new FileOutputStream (FileDescriptor .err ));
3817
39- private boolean contains (String source , String target , boolean isCaseSensitive ) {
40- String superString = source ;
41- String subString = target ;
42- if (!isCaseSensitive ) {
43- superString = superString .toLowerCase ();
44- subString = subString .toLowerCase ();
45- }
46- return superString .contains (subString );
47- }
48-
49- protected boolean isStringInLog (String message ) {
50- return isStringInLog (message , false );
51- }
52-
53- protected boolean isStringInLog (String message , boolean isCaseSensitive ) {
54- ArgumentCaptor <LoggingEvent > arguments = ArgumentCaptor .forClass (LoggingEvent .class );
55- verify (mockedAppender , atLeastOnce ()).doAppend (arguments .capture ());
56- List <LoggingEvent > events = arguments .getAllValues ();
57- for (LoggingEvent event : events ) {
58- String log = event .getRenderedMessage ();
59- if (contains (log , message , isCaseSensitive )) {
60- return true ;
61- }
62- }
63- return false ;
64- }
65-
66- protected boolean noStringInLog () {
67- ArgumentCaptor <LoggingEvent > arguments = ArgumentCaptor .forClass (LoggingEvent .class );
68- try {
69- verify (mockedAppender , never ()).doAppend (arguments .capture ());
70- } catch (Exception e ) {
71- return false ;
72- }
73- return true ;
74- }
75-
76- protected void setupMockedAppender () {
77- setupMockedAppender (Level .ERROR );
78- }
79-
80- protected void setupMockedAppender (Level level ) {
81- originalLevel = Logger .getRootLogger ().getLevel ();
82- originalAppender = Logger .getRootLogger ().getAppender ("stdout" );
83- Logger .getRootLogger ().removeAllAppenders ();
84- mockedAppender = mock (Appender .class );
85- Logger .getRootLogger ().setLevel (level );
86- Logger .getRootLogger ().addAppender (mockedAppender );
87- }
88-
89- protected void teardownMockedAppender () {
90- Logger .getRootLogger ().removeAllAppenders ();
91- Logger .getRootLogger ().setLevel (originalLevel );
92- Logger .getRootLogger ().addAppender (originalAppender );
93- }
94-
9518 public static void redirectToDevNull () {
9619 System .setOut (NULL );
9720 System .setErr (NULL );
@@ -108,4 +31,3 @@ public static void runWithoutOutput(Runnable function) {
10831 redirectToStandard ();
10932 }
11033}
111-
0 commit comments