View Javadoc
1   package org.apache.maven.surefire.extensions;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * tests for {@link SurefireStatelessTestsetInfoReporter} and {@link JUnit5StatelessTestsetInfoReporter}.
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 }