1 package org.apache.maven.surefire.extensions;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter;
23 import org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoReporter;
24 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
25 import org.apache.maven.plugin.surefire.report.ConsoleReporter;
26 import org.apache.maven.plugin.surefire.report.FileReporter;
27 import org.apache.maven.plugin.surefire.report.TestSetStats;
28 import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
29 import org.apache.maven.surefire.api.report.TestSetReportEntry;
30 import org.apache.maven.surefire.shared.utils.logging.MessageUtils;
31 import org.junit.Test;
32 import org.junit.runner.RunWith;
33 import org.mockito.ArgumentCaptor;
34 import org.mockito.Mock;
35 import org.powermock.core.classloader.annotations.PowerMockIgnore;
36 import org.powermock.modules.junit4.PowerMockRunner;
37
38 import java.io.File;
39 import java.nio.charset.Charset;
40 import java.nio.charset.StandardCharsets;
41 import java.util.List;
42
43 import static java.util.Collections.singletonList;
44 import static org.fest.assertions.Assertions.assertThat;
45 import static org.mockito.ArgumentMatchers.anyString;
46 import static org.mockito.Mockito.never;
47 import static org.mockito.Mockito.reset;
48 import static org.mockito.Mockito.times;
49 import static org.mockito.Mockito.verify;
50 import static org.mockito.Mockito.verifyNoMoreInteractions;
51 import static org.mockito.Mockito.when;
52 import static org.powermock.reflect.Whitebox.getInternalState;
53
54
55
56
57 @RunWith( PowerMockRunner.class )
58 @PowerMockIgnore( { "org.jacoco.agent.rt.*", "com.vladium.emma.rt.*" } )
59 public class StatelessTestsetInfoReporterTest
60 {
61 @Mock
62 private ConsoleLogger consoleLogger;
63
64 @Mock
65 private TestSetReportEntry eventTestsetStarting;
66
67 @Mock
68 private WrappedReportEntry eventTestsetFinished;
69
70 @Test
71 public void shouldCloneReporter()
72 {
73 SurefireStatelessTestsetInfoReporter extension = new SurefireStatelessTestsetInfoReporter();
74 extension.setDisable( true );
75 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
76
77 Object clone = extension.clone( classLoader );
78 assertThat( clone )
79 .isNotSameAs( extension );
80 assertThat( clone )
81 .isInstanceOf( SurefireStatelessTestsetInfoReporter.class );
82 assertThat( clone.toString() )
83 .isEqualTo( "SurefireStatelessTestsetInfoReporter{disable=true}" );
84 assertThat( ( (SurefireStatelessTestsetInfoReporter) clone ).isDisable() )
85 .isTrue();
86 }
87
88 @Test
89 public void shouldAssertToStringReporter()
90 {
91 SurefireStatelessTestsetInfoReporter extension = new SurefireStatelessTestsetInfoReporter();
92 assertThat( extension.toString() )
93 .isEqualTo( "SurefireStatelessTestsetInfoReporter{disable=false}" );
94 }
95
96 @Test
97 public void shouldCreateFileReporterListener()
98 {
99 File target = new File( System.getProperty( "user.dir" ), "target" );
100 File reportsDirectory = new File( target, "surefire-reports" );
101 String reportNameSuffix = "suffix";
102 Charset encoding = StandardCharsets.UTF_8;
103 SurefireStatelessTestsetInfoReporter extension = new SurefireStatelessTestsetInfoReporter();
104
105 assertThat( extension.isDisable() )
106 .isFalse();
107 extension.setDisable( true );
108 assertThat( extension.isDisable() )
109 .isTrue();
110
111 StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> listener =
112 extension.createListener( reportsDirectory, reportNameSuffix, encoding );
113 assertThat( listener )
114 .isInstanceOf( FileReporter.class );
115 assertThat( listener.getReportsDirectory() )
116 .isSameAs( reportsDirectory );
117 assertThat( listener.getReportNameSuffix() )
118 .isSameAs( reportNameSuffix );
119 assertThat( listener.getEncoding() )
120 .isSameAs( encoding );
121 assertThat( getInternalState( listener, "usePhrasedFileName" ) )
122 .isEqualTo( false );
123 assertThat( getInternalState( listener, "usePhrasedClassNameInRunning" ) )
124 .isEqualTo( false );
125 assertThat( getInternalState( listener, "usePhrasedClassNameInTestCaseSummary" ) )
126 .isEqualTo( false );
127 }
128
129 @Test
130 public void shouldCreateConsoleReporterListener()
131 {
132 SurefireStatelessTestsetInfoReporter extension = new SurefireStatelessTestsetInfoReporter();
133
134 assertThat( extension.isDisable() )
135 .isFalse();
136 extension.setDisable( true );
137 assertThat( extension.isDisable() )
138 .isTrue();
139
140 StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> listener =
141 extension.createListener( consoleLogger );
142 assertThat( listener )
143 .isInstanceOf( ConsoleReporter.class );
144 assertThat( listener.getConsoleLogger() )
145 .isSameAs( consoleLogger );
146 assertThat( getInternalState( listener, "usePhrasedClassNameInRunning" ) )
147 .isEqualTo( false );
148 assertThat( getInternalState( listener, "usePhrasedClassNameInTestCaseSummary" ) )
149 .isEqualTo( false );
150 }
151
152 @Test
153 public void shouldCloneJUnit5Reporter()
154 {
155 JUnit5StatelessTestsetInfoReporter extension = new JUnit5StatelessTestsetInfoReporter();
156 extension.setDisable( true );
157 extension.setUsePhrasedFileName( true );
158 extension.setUsePhrasedClassNameInTestCaseSummary( true );
159 extension.setUsePhrasedClassNameInRunning( true );
160 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
161
162 Object clone = extension.clone( classLoader );
163 assertThat( clone )
164 .isNotSameAs( extension );
165 assertThat( clone )
166 .isInstanceOf( JUnit5StatelessTestsetInfoReporter.class );
167 assertThat( clone.toString() )
168 .isEqualTo( "JUnit5StatelessTestsetInfoReporter{disable=true, usePhrasedFileName=true, "
169 + "usePhrasedClassNameInRunning=true, usePhrasedClassNameInTestCaseSummary=true}" );
170 assertThat( ( (JUnit5StatelessTestsetInfoReporter) clone ).isDisable() )
171 .isTrue();
172 assertThat( ( (JUnit5StatelessTestsetInfoReporter) clone ).isUsePhrasedFileName() )
173 .isTrue();
174 assertThat( ( (JUnit5StatelessTestsetInfoReporter) clone ).isUsePhrasedClassNameInTestCaseSummary() )
175 .isTrue();
176 assertThat( ( (JUnit5StatelessTestsetInfoReporter) clone ).isUsePhrasedClassNameInRunning() )
177 .isTrue();
178 }
179
180 @Test
181 public void shouldAssertToStringJUnit5Reporter()
182 {
183 JUnit5StatelessTestsetInfoReporter extension = new JUnit5StatelessTestsetInfoReporter();
184 assertThat( extension.toString() )
185 .isEqualTo( "JUnit5StatelessTestsetInfoReporter{disable=false, usePhrasedFileName=false, "
186 + "usePhrasedClassNameInRunning=false, usePhrasedClassNameInTestCaseSummary=false}" );
187 }
188
189 @Test
190 public void shouldReportTestsetLifecycle()
191 {
192 ConsoleReporter consoleReporter = new ConsoleReporter( consoleLogger, false, false );
193 MessageUtils.setColorEnabled( false );
194
195 when( eventTestsetStarting.getNameWithGroup() ).thenReturn( "pkg.MyTest" );
196 when( eventTestsetFinished.getNameWithGroup() ).thenReturn( "pkg.MyTest" );
197 when( eventTestsetFinished.getElapsedTimeVerbose() ).thenReturn( "Time elapsed: 1.03 s" );
198
199 consoleReporter.testSetStarting( eventTestsetStarting );
200 ArgumentCaptor<String> logs = ArgumentCaptor.forClass( String.class );
201 verify( consoleLogger, times( 1 ) ).info( logs.capture() );
202 verifyNoMoreInteractions( consoleLogger );
203 assertThat( logs.getAllValues() )
204 .hasSize( 1 )
205 .contains( "Running pkg.MyTest" );
206
207 TestSetStats testSetStats = new TestSetStats( false, true );
208 testSetStats.testStart();
209 testSetStats.testFailure( eventTestsetFinished );
210 assertThat( testSetStats.getCompletedCount() ).isEqualTo( 1 );
211 assertThat( testSetStats.getFailures() ).isEqualTo( 1 );
212 assertThat( testSetStats.getErrors() ).isEqualTo( 0 );
213 assertThat( testSetStats.getSkipped() ).isEqualTo( 0 );
214 reset( consoleLogger );
215 consoleReporter.testSetCompleted( eventTestsetFinished, testSetStats, singletonList( "pkg.MyTest failed" ) );
216 consoleReporter.reset();
217 verify( consoleLogger, never() ).info( anyString() );
218 verify( consoleLogger, never() ).warning( anyString() );
219 logs = ArgumentCaptor.forClass( String.class );
220 verify( consoleLogger, times( 2 ) ).error( logs.capture() );
221 List<String> messages = logs.getAllValues();
222 assertThat( messages )
223 .hasSize( 2 )
224 .containsSequence(
225 "Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.03 s "
226 + "<<< FAILURE! - in pkg.MyTest", "pkg.MyTest failed" );
227 verifyNoMoreInteractions( consoleLogger );
228 }
229 }