View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.plugin.surefire.extensions;
20  
21  import java.io.File;
22  import java.lang.reflect.Field;
23  import java.util.Deque;
24  import java.util.HashMap;
25  import java.util.Map;
26  
27  import org.apache.maven.plugin.surefire.extensions.junit5.JUnit5Xml30StatelessReporter;
28  import org.apache.maven.plugin.surefire.report.StatelessXmlReporter;
29  import org.apache.maven.plugin.surefire.report.TestSetStats;
30  import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
31  import org.apache.maven.surefire.extensions.StatelessReportEventListener;
32  import org.junit.jupiter.api.Test;
33  
34  import static org.assertj.core.api.Assertions.assertThat;
35  
36  /**
37   * tests for {@link SurefireStatelessReporter} and {@link JUnit5Xml30StatelessReporter}.
38   */
39  public class StatelessReporterTest {
40  
41      @SuppressWarnings("unchecked")
42      private static <T> T getInternalState(Object target, String fieldName) {
43          try {
44              Class<?> clazz = target.getClass();
45              while (clazz != null) {
46                  try {
47                      Field field = clazz.getDeclaredField(fieldName);
48                      field.setAccessible(true);
49                      return (T) field.get(target);
50                  } catch (NoSuchFieldException e) {
51                      clazz = clazz.getSuperclass();
52                  }
53              }
54              throw new NoSuchFieldException(fieldName);
55          } catch (Exception e) {
56              throw new RuntimeException(e);
57          }
58      }
59  
60      @Test
61      public void shouldCloneXmlReporter() {
62          SurefireStatelessReporter extension = new SurefireStatelessReporter();
63          extension.setDisable(true);
64          extension.setVersion("V1");
65          ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
66  
67          Object clone = extension.clone(classLoader);
68          assertThat(clone).isNotSameAs(extension);
69          assertThat(clone).isInstanceOf(SurefireStatelessReporter.class);
70          assertThat(clone.toString()).isEqualTo("SurefireStatelessReporter{version=V1, disable=true}");
71          assertThat(((SurefireStatelessReporter) clone).isDisable()).isTrue();
72          assertThat(((SurefireStatelessReporter) clone).getVersion()).isEqualTo("V1");
73      }
74  
75      @Test
76      public void shouldAssertToStringXmlReporter() {
77          SurefireStatelessReporter extension = new SurefireStatelessReporter();
78          assertThat(extension.toString()).isEqualTo("SurefireStatelessReporter{version=3.0.2, disable=false}");
79      }
80  
81      @Test
82      public void shouldCreateConsoleListener() {
83          File target = new File(System.getProperty("user.dir"), "target");
84          File reportsDirectory = new File(target, "surefire-reports");
85          String reportNameSuffix = "suffix";
86          String schema = "https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd";
87          Map<String, Deque<WrappedReportEntry>> testClassMethodRunHistory = new HashMap<>();
88          DefaultStatelessReportMojoConfiguration config = new DefaultStatelessReportMojoConfiguration(
89                  reportsDirectory, reportNameSuffix, true, 5, schema, true, true, false, testClassMethodRunHistory);
90          SurefireStatelessReporter extension = new SurefireStatelessReporter();
91  
92          assertThat(extension.getVersion()).isEqualTo("3.0.2");
93          extension.setVersion("V3");
94          assertThat(extension.getVersion()).isEqualTo("V3");
95  
96          assertThat(extension.isDisable()).isFalse();
97          extension.setDisable(true);
98          assertThat(extension.isDisable()).isTrue();
99  
100         StatelessReportEventListener<WrappedReportEntry, TestSetStats> listener = extension.createListener(config);
101         assertThat(listener).isInstanceOf(StatelessXmlReporter.class);
102         assertThat((File) getInternalState(listener, "reportsDirectory")).isSameAs(reportsDirectory);
103         assertThat((String) getInternalState(listener, "reportNameSuffix")).isSameAs(reportNameSuffix);
104         assertThat((boolean) getInternalState(listener, "trimStackTrace")).isEqualTo(true);
105         assertThat((Integer) getInternalState(listener, "rerunFailingTestsCount"))
106                 .isEqualTo(5);
107         assertThat((String) getInternalState(listener, "xsdSchemaLocation")).isSameAs(schema);
108         assertThat((String) getInternalState(listener, "xsdVersion")).isEqualTo("V3");
109         assertThat((Map<?, ?>) getInternalState(listener, "testClassMethodRunHistoryMap"))
110                 .isSameAs(testClassMethodRunHistory);
111         assertThat((boolean) getInternalState(listener, "phrasedFileName")).isEqualTo(false);
112         assertThat((boolean) getInternalState(listener, "phrasedSuiteName")).isEqualTo(false);
113         assertThat((boolean) getInternalState(listener, "phrasedClassName")).isEqualTo(false);
114         assertThat((boolean) getInternalState(listener, "phrasedMethodName")).isEqualTo(false);
115     }
116 
117     @Test
118     public void shouldCloneJUnit5XmlReporter() {
119         JUnit5Xml30StatelessReporter extension = new JUnit5Xml30StatelessReporter();
120         extension.setDisable(true);
121         extension.setVersion("V1");
122         extension.setUsePhrasedFileName(true);
123         extension.setUsePhrasedTestSuiteClassName(true);
124         extension.setUsePhrasedTestCaseClassName(true);
125         extension.setUsePhrasedTestCaseMethodName(true);
126         ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
127 
128         Object clone = extension.clone(classLoader);
129         assertThat(clone).isNotSameAs(extension);
130         assertThat(clone).isInstanceOf(JUnit5Xml30StatelessReporter.class);
131         assertThat(clone.toString())
132                 .isEqualTo("JUnit5Xml30StatelessReporter{version=V1, disable=true, usePhrasedFileName=true, "
133                         + "usePhrasedTestSuiteClassName=true, usePhrasedTestCaseClassName=true, "
134                         + "usePhrasedTestCaseMethodName=true}");
135         assertThat(((JUnit5Xml30StatelessReporter) clone).isDisable()).isTrue();
136         assertThat(((JUnit5Xml30StatelessReporter) clone).getVersion()).isEqualTo("V1");
137         assertThat(((JUnit5Xml30StatelessReporter) clone).getUsePhrasedFileName())
138                 .isTrue();
139         assertThat(((JUnit5Xml30StatelessReporter) clone).getUsePhrasedTestCaseClassName())
140                 .isTrue();
141         assertThat(((JUnit5Xml30StatelessReporter) clone).getUsePhrasedTestCaseMethodName())
142                 .isTrue();
143         assertThat(((JUnit5Xml30StatelessReporter) clone).getUsePhrasedTestSuiteClassName())
144                 .isTrue();
145     }
146 
147     @Test
148     public void shouldAssertToStringJUnit5ConsoleReporter() {
149         JUnit5Xml30StatelessReporter extension = new JUnit5Xml30StatelessReporter();
150         assertThat(extension.toString())
151                 .isEqualTo("JUnit5Xml30StatelessReporter{version=3.0.2, disable=false, "
152                         + "usePhrasedFileName=false, usePhrasedTestSuiteClassName=false, "
153                         + "usePhrasedTestCaseClassName=false, usePhrasedTestCaseMethodName=false}");
154     }
155 
156     @Test
157     public void shouldCreateJUnit5ConsoleListener() {
158         File target = new File(System.getProperty("user.dir"), "target");
159         File reportsDirectory = new File(target, "surefire-reports");
160         String reportNameSuffix = "suffix";
161         String schema = "https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd";
162         Map<String, Deque<WrappedReportEntry>> testClassMethodRunHistory = new HashMap<>();
163         DefaultStatelessReportMojoConfiguration config = new DefaultStatelessReportMojoConfiguration(
164                 reportsDirectory, reportNameSuffix, true, 5, schema, true, true, false, testClassMethodRunHistory);
165         JUnit5Xml30StatelessReporter extension = new JUnit5Xml30StatelessReporter();
166 
167         assertThat(extension.getVersion()).isEqualTo("3.0.2");
168         extension.setVersion("V3");
169         assertThat(extension.getVersion()).isEqualTo("V3");
170 
171         assertThat(extension.isDisable()).isFalse();
172         extension.setDisable(true);
173         assertThat(extension.isDisable()).isTrue();
174 
175         assertThat(extension.getUsePhrasedFileName()).isFalse();
176         extension.setUsePhrasedFileName(true);
177         assertThat(extension.getUsePhrasedFileName()).isTrue();
178 
179         assertThat(extension.getUsePhrasedTestSuiteClassName()).isFalse();
180         extension.setUsePhrasedTestSuiteClassName(true);
181         assertThat(extension.getUsePhrasedTestSuiteClassName()).isTrue();
182 
183         assertThat(extension.getUsePhrasedTestCaseClassName()).isFalse();
184         extension.setUsePhrasedTestCaseClassName(true);
185         assertThat(extension.getUsePhrasedTestSuiteClassName()).isTrue();
186 
187         assertThat(extension.getUsePhrasedTestCaseMethodName()).isFalse();
188         extension.setUsePhrasedTestCaseMethodName(true);
189         assertThat(extension.getUsePhrasedTestCaseMethodName()).isTrue();
190 
191         StatelessReportEventListener<WrappedReportEntry, TestSetStats> listener = extension.createListener(config);
192         assertThat(listener).isInstanceOf(StatelessXmlReporter.class);
193         assertThat((File) getInternalState(listener, "reportsDirectory")).isSameAs(reportsDirectory);
194         assertThat((String) getInternalState(listener, "reportNameSuffix")).isSameAs(reportNameSuffix);
195         assertThat((boolean) getInternalState(listener, "trimStackTrace")).isEqualTo(true);
196         assertThat((Integer) getInternalState(listener, "rerunFailingTestsCount"))
197                 .isEqualTo(5);
198         assertThat((String) getInternalState(listener, "xsdSchemaLocation")).isSameAs(schema);
199         assertThat((String) getInternalState(listener, "xsdVersion")).isEqualTo("V3");
200         assertThat((Map<?, ?>) getInternalState(listener, "testClassMethodRunHistoryMap"))
201                 .isSameAs(testClassMethodRunHistory);
202         assertThat((boolean) getInternalState(listener, "phrasedFileName")).isEqualTo(true);
203         assertThat((boolean) getInternalState(listener, "phrasedSuiteName")).isEqualTo(true);
204         assertThat((boolean) getInternalState(listener, "phrasedClassName")).isEqualTo(true);
205         assertThat((boolean) getInternalState(listener, "phrasedMethodName")).isEqualTo(true);
206     }
207 }