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;
20  
21  import java.io.File;
22  import java.io.FileOutputStream;
23  import java.util.List;
24  import java.util.zip.ZipEntry;
25  import java.util.zip.ZipOutputStream;
26  
27  import org.apache.maven.artifact.Artifact;
28  import org.apache.maven.artifact.DefaultArtifact;
29  import org.apache.maven.artifact.handler.ArtifactHandler;
30  import org.apache.maven.artifact.handler.DefaultArtifactHandler;
31  import org.apache.maven.artifact.versioning.VersionRange;
32  import org.apache.maven.plugin.MojoFailureException;
33  import org.apache.maven.plugin.surefire.extensions.SurefireConsoleOutputReporter;
34  import org.apache.maven.plugin.surefire.extensions.SurefireStatelessReporter;
35  import org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter;
36  import org.apache.maven.surefire.api.suite.RunResult;
37  import org.apache.maven.surefire.api.util.DefaultScanResult;
38  import org.apache.maven.surefire.api.util.SureFireFileManager;
39  import org.apache.maven.surefire.extensions.ForkNodeFactory;
40  import org.apache.maven.surefire.providerapi.ProviderInfo;
41  import org.junit.Test;
42  import org.slf4j.Logger;
43  
44  import static java.util.Arrays.asList;
45  import static java.util.Collections.singletonList;
46  import static org.assertj.core.api.Assertions.assertThat;
47  import static org.junit.Assert.fail;
48  import static org.mockito.Mockito.mock;
49  import static org.powermock.reflect.Whitebox.invokeMethod;
50  import static org.powermock.reflect.Whitebox.setInternalState;
51  
52  /**
53   *
54   */
55  public class MojoMocklessTest {
56      @Test
57      public void testGetStartupReportConfiguration() throws Exception {
58          AbstractSurefireMojo surefirePlugin = new Mojo(null, null);
59          StartupReportConfiguration config =
60                  invokeMethod(surefirePlugin, "getStartupReportConfiguration", false, mock(ProviderInfo.class));
61  
62          assertThat(config.getXmlReporter()).isNotNull().isInstanceOf(SurefireStatelessReporter.class);
63  
64          assertThat(config.getConsoleOutputReporter()).isNotNull().isInstanceOf(SurefireConsoleOutputReporter.class);
65  
66          assertThat(config.getTestsetReporter()).isNotNull().isInstanceOf(SurefireStatelessTestsetInfoReporter.class);
67      }
68  
69      @Test
70      public void testGetStartupReportConfiguration2() throws Exception {
71          AbstractSurefireMojo surefirePlugin = new Mojo(null, null);
72          SurefireStatelessReporter xmlReporter = new SurefireStatelessReporter();
73          SurefireConsoleOutputReporter consoleReporter = new SurefireConsoleOutputReporter();
74          SurefireStatelessTestsetInfoReporter testsetInfoReporter = new SurefireStatelessTestsetInfoReporter();
75          setInternalState(surefirePlugin, "statelessTestsetReporter", xmlReporter);
76          setInternalState(surefirePlugin, "consoleOutputReporter", consoleReporter);
77          setInternalState(surefirePlugin, "statelessTestsetInfoReporter", testsetInfoReporter);
78  
79          StartupReportConfiguration config =
80                  invokeMethod(surefirePlugin, "getStartupReportConfiguration", false, mock(ProviderInfo.class));
81  
82          assertThat(config.getXmlReporter()).isNotNull().isSameAs(xmlReporter);
83  
84          assertThat(config.getConsoleOutputReporter()).isNotNull().isSameAs(consoleReporter);
85  
86          assertThat(config.getTestsetReporter()).isNotNull().isSameAs(testsetInfoReporter);
87      }
88  
89      @Test
90      @SuppressWarnings("checkstyle:magicnumber")
91      public void testForkCountComputation() {
92          AbstractSurefireMojo surefirePlugin = new Mojo(null, null);
93          assertConversionFails(surefirePlugin, "nothing");
94  
95          assertConversionFails(surefirePlugin, "5,0");
96          assertConversionFails(surefirePlugin, "5.0");
97          assertConversionFails(surefirePlugin, "5,0C");
98          assertConversionFails(surefirePlugin, "5.0CC");
99  
100         assertForkCount(surefirePlugin, 5, "5");
101 
102         int availableProcessors = Runtime.getRuntime().availableProcessors();
103         assertForkCount(surefirePlugin, 3 * availableProcessors, "3C");
104         assertForkCount(surefirePlugin, (int) (2.5 * availableProcessors), "2.5C");
105         assertForkCount(surefirePlugin, availableProcessors, "1.0001 C");
106         assertForkCount(surefirePlugin, 1, 1d / ((double) availableProcessors + 1) + "C");
107         assertForkCount(surefirePlugin, 0, "0 C");
108     }
109 
110     private static void assertForkCount(AbstractSurefireMojo surefirePlugin, int expected, String value) {
111         assertThat(surefirePlugin.convertWithCoreCount(value)).isEqualTo(expected);
112     }
113 
114     private static void assertConversionFails(AbstractSurefireMojo surefirePlugin, String value) {
115         try {
116             surefirePlugin.convertWithCoreCount(value);
117         } catch (NumberFormatException e) {
118             return;
119         }
120         fail("Expected NumberFormatException when converting " + value);
121     }
122 
123     @Test
124     public void scanDependenciesShouldReturnNull() throws MojoFailureException {
125         Mojo mojo = new Mojo(null, null);
126         DefaultScanResult result = mojo.scanDependencies();
127         assertThat(result).isNull();
128     }
129 
130     @Test
131     public void scanDependenciesShouldReturnNullAfterMissingBuildArtifact() throws MojoFailureException {
132         VersionRange version = VersionRange.createFromVersion("1.0");
133         ArtifactHandler handler = new DefaultArtifactHandler();
134         Artifact testDeps = new DefaultArtifact("g", "a", version, "compile", "jar", null, handler);
135         List<Artifact> projectTestArtifacts = singletonList(testDeps);
136         String[] dependenciesToScan = {"g:a"};
137         Mojo mojo = new Mojo(projectTestArtifacts, dependenciesToScan);
138         DefaultScanResult result = mojo.scanDependencies();
139         assertThat(result).isNull();
140     }
141 
142     @Test
143     public void scanDependenciesShouldReturnNullWithWAR() throws MojoFailureException {
144         VersionRange version = VersionRange.createFromVersion("1.0");
145         ArtifactHandler handler = new DefaultArtifactHandler();
146         Artifact testDeps = new DefaultArtifact("g", "a", version, "compile", "war", null, handler);
147         testDeps.setFile(new File(new File("target"), "a-1.0.war"));
148         List<Artifact> projectTestArtifacts = singletonList(testDeps);
149         String[] dependenciesToScan = {"g:a"};
150         Mojo mojo = new Mojo(projectTestArtifacts, dependenciesToScan);
151         DefaultScanResult result = mojo.scanDependencies();
152         assertThat(result).isNull();
153     }
154 
155     @Test
156     public void scanDependenciesShouldReturnNullWithExistingWAR() throws Exception {
157         VersionRange version = VersionRange.createFromVersion("1.0");
158         ArtifactHandler handler = new DefaultArtifactHandler();
159         Artifact testDeps = new DefaultArtifact("g", "a", version, "compile", "war", null, handler);
160         File artifactFile = SureFireFileManager.createTempFile("surefire", ".war");
161         testDeps.setFile(artifactFile);
162         List<Artifact> projectTestArtifacts = singletonList(testDeps);
163         String[] dependenciesToScan = {"g:a"};
164         Mojo mojo = new Mojo(projectTestArtifacts, dependenciesToScan);
165         DefaultScanResult result = mojo.scanDependencies();
166         assertThat(result).isNull();
167     }
168 
169     @Test
170     public void scanDependenciesShouldReturnClassWithExistingTestJAR() throws Exception {
171         VersionRange version = VersionRange.createFromVersion("1.0");
172         ArtifactHandler handler = new DefaultArtifactHandler();
173         Artifact testDeps = new DefaultArtifact("g", "a", version, "compile", "test-jar", null, handler);
174 
175         File artifactFile = SureFireFileManager.createTempFile("surefire", ".jar");
176         testDeps.setFile(artifactFile);
177         try (ZipOutputStream os = new ZipOutputStream(new FileOutputStream(artifactFile))) {
178             os.putNextEntry(new ZipEntry("pkg/"));
179             os.closeEntry();
180             os.putNextEntry(new ZipEntry("pkg/MyTest.class"));
181             os.closeEntry();
182             os.finish();
183         }
184 
185         List<Artifact> projectTestArtifacts = singletonList(testDeps);
186         String[] dependenciesToScan = {"g:a"};
187         Mojo mojo = new Mojo(projectTestArtifacts, dependenciesToScan);
188         mojo.setLogger(mock(Logger.class));
189         DefaultScanResult result = mojo.scanDependencies();
190 
191         assertThat(result).isNotNull();
192 
193         assertThat(result.isEmpty()).isFalse();
194 
195         assertThat(result.getClasses()).contains("pkg.MyTest");
196     }
197 
198     @Test
199     public void scanDependenciesShouldReturnNullWithEmptyTestJAR() throws Exception {
200         VersionRange version = VersionRange.createFromVersion("1.0");
201         ArtifactHandler handler = new DefaultArtifactHandler();
202         Artifact testDeps = new DefaultArtifact("g", "a", version, "compile", "jar", null, handler);
203 
204         File artifactFile = SureFireFileManager.createTempFile("surefire", ".jar");
205         testDeps.setFile(artifactFile);
206         try (ZipOutputStream os = new ZipOutputStream(new FileOutputStream(artifactFile))) {
207             os.putNextEntry(new ZipEntry("pkg/"));
208             os.closeEntry();
209             os.finish();
210         }
211 
212         List<Artifact> projectTestArtifacts = singletonList(testDeps);
213         String[] dependenciesToScan = {"g:a"};
214         Mojo mojo = new Mojo(projectTestArtifacts, dependenciesToScan);
215         mojo.setLogger(mock(Logger.class));
216         DefaultScanResult result = mojo.scanDependencies();
217 
218         assertThat(result).isNotNull();
219 
220         assertThat(result.isEmpty()).isTrue();
221     }
222 
223     @Test
224     public void scanDependenciesShouldReturnClassWithDirectory() throws Exception {
225         VersionRange version = VersionRange.createFromVersion("1.0");
226         ArtifactHandler handler = new DefaultArtifactHandler();
227         Artifact testDeps = new DefaultArtifact("g", "a", version, "compile", "test-jar", null, handler);
228 
229         File artifactFile = SureFireFileManager.createTempFile("surefire", "-classes");
230         String classDir = artifactFile.getCanonicalPath();
231         assertThat(artifactFile.delete()).isTrue();
232         File classes = new File(classDir);
233         assertThat(classes.mkdir()).isTrue();
234 
235         testDeps.setFile(classes);
236 
237         assertThat(new File(classes, "AnotherTest.class").createNewFile()).isTrue();
238 
239         List<Artifact> projectTestArtifacts = singletonList(testDeps);
240         String[] dependenciesToScan = {"g:a"};
241         Mojo mojo = new Mojo(projectTestArtifacts, dependenciesToScan);
242         mojo.setLogger(mock(Logger.class));
243         DefaultScanResult result = mojo.scanDependencies();
244 
245         assertThat(result).isNotNull();
246 
247         assertThat(result.isEmpty()).isFalse();
248 
249         assertThat(result.getClasses()).contains("AnotherTest");
250     }
251 
252     @Test
253     public void scanMultipleDependencies() throws Exception {
254         VersionRange version = VersionRange.createFromVersion("1.0");
255         ArtifactHandler handler = new DefaultArtifactHandler();
256         Artifact testDep1 = new DefaultArtifact("g", "x", version, "compile", "jar", null, handler);
257 
258         File artifactFile1 = SureFireFileManager.createTempFile("surefire", "-classes");
259         String classDir = artifactFile1.getCanonicalPath();
260         assertThat(artifactFile1.delete()).isTrue();
261         File classes = new File(classDir);
262         assertThat(classes.mkdir()).isTrue();
263 
264         testDep1.setFile(classes);
265 
266         assertThat(new File(classes, "AnotherTest.class").createNewFile()).isTrue();
267 
268         Artifact testDep2 = new DefaultArtifact("g", "a", version, "test", "jar", null, handler);
269         File artifactFile2 = SureFireFileManager.createTempFile("surefire", ".jar");
270         testDep2.setFile(artifactFile2);
271         try (ZipOutputStream os = new ZipOutputStream(new FileOutputStream(artifactFile2))) {
272             os.putNextEntry(new ZipEntry("pkg/"));
273             os.closeEntry();
274             os.putNextEntry(new ZipEntry("pkg/MyTest.class"));
275             os.closeEntry();
276             os.finish();
277         }
278 
279         List<Artifact> projectTestArtifacts = asList(testDep1, testDep2);
280         String[] dependenciesToScan = {"g:a"};
281         Mojo mojo = new Mojo(projectTestArtifacts, dependenciesToScan);
282         mojo.setLogger(mock(Logger.class));
283         DefaultScanResult result = mojo.scanDependencies();
284 
285         assertThat(result).isNotNull();
286 
287         assertThat(result.isEmpty()).isFalse();
288 
289         assertThat(result.getClasses()).hasSize(1);
290 
291         assertThat(result.getClasses()).contains("pkg.MyTest");
292     }
293 
294     private static final class Mojo extends AbstractSurefireMojo {
295         private final List<Artifact> projectTestArtifacts;
296         private final String[] dependenciesToScan;
297 
298         Mojo(List<Artifact> projectTestArtifacts, String[] dependenciesToScan) {
299             this.projectTestArtifacts = projectTestArtifacts;
300             this.dependenciesToScan = dependenciesToScan;
301         }
302 
303         @Override
304         protected String getPluginName() {
305             return null;
306         }
307 
308         @Override
309         protected int getRerunFailingTestsCount() {
310             return 0;
311         }
312 
313         @Override
314         public boolean isSkipTests() {
315             return false;
316         }
317 
318         @Override
319         public void setSkipTests(boolean skipTests) {}
320 
321         @Override
322         public boolean isSkipExec() {
323             return false;
324         }
325 
326         @Override
327         public void setSkipExec(boolean skipExec) {}
328 
329         @Override
330         public boolean isSkip() {
331             return false;
332         }
333 
334         @Override
335         public void setSkip(boolean skip) {}
336 
337         @Override
338         public File getBasedir() {
339             return null;
340         }
341 
342         @Override
343         public void setBasedir(File basedir) {}
344 
345         @Override
346         public File getTestClassesDirectory() {
347             return null;
348         }
349 
350         @Override
351         public void setTestClassesDirectory(File testClassesDirectory) {}
352 
353         @Override
354         public File getMainBuildPath() {
355             return null;
356         }
357 
358         @Override
359         public void setMainBuildPath(File mainBuildPath) {}
360 
361         @Override
362         public File getReportsDirectory() {
363             return null;
364         }
365 
366         @Override
367         public void setReportsDirectory(File reportsDirectory) {}
368 
369         @Override
370         public String getTest() {
371             return null;
372         }
373 
374         @Override
375         public void setTest(String test) {}
376 
377         @Override
378         public List<String> getIncludes() {
379             return null;
380         }
381 
382         @Override
383         public File getIncludesFile() {
384             return null;
385         }
386 
387         @Override
388         public void setIncludes(List<String> includes) {}
389 
390         @Override
391         public List<String> getExcludes() {
392             return null;
393         }
394 
395         @Override
396         public void setExcludes(List<String> excludes) {}
397 
398         @Override
399         public boolean isPrintSummary() {
400             return false;
401         }
402 
403         @Override
404         public void setPrintSummary(boolean printSummary) {}
405 
406         @Override
407         public String getReportFormat() {
408             return null;
409         }
410 
411         @Override
412         public void setReportFormat(String reportFormat) {}
413 
414         @Override
415         public boolean isUseFile() {
416             return false;
417         }
418 
419         @Override
420         public void setUseFile(boolean useFile) {}
421 
422         @Override
423         public String getDebugForkedProcess() {
424             return null;
425         }
426 
427         @Override
428         public void setDebugForkedProcess(String debugForkedProcess) {}
429 
430         @Override
431         public int getForkedProcessTimeoutInSeconds() {
432             return 0;
433         }
434 
435         @Override
436         public void setForkedProcessTimeoutInSeconds(int forkedProcessTimeoutInSeconds) {}
437 
438         @Override
439         public int getForkedProcessExitTimeoutInSeconds() {
440             return 0;
441         }
442 
443         @Override
444         public void setForkedProcessExitTimeoutInSeconds(int forkedProcessTerminationTimeoutInSeconds) {}
445 
446         @Override
447         public double getParallelTestsTimeoutInSeconds() {
448             return 0;
449         }
450 
451         @Override
452         public void setParallelTestsTimeoutInSeconds(double parallelTestsTimeoutInSeconds) {}
453 
454         @Override
455         public double getParallelTestsTimeoutForcedInSeconds() {
456             return 0;
457         }
458 
459         @Override
460         public void setParallelTestsTimeoutForcedInSeconds(double parallelTestsTimeoutForcedInSeconds) {}
461 
462         @Override
463         public boolean isUseSystemClassLoader() {
464             return false;
465         }
466 
467         @Override
468         public void setUseSystemClassLoader(boolean useSystemClassLoader) {}
469 
470         @Override
471         public boolean isUseManifestOnlyJar() {
472             return false;
473         }
474 
475         @Override
476         public void setUseManifestOnlyJar(boolean useManifestOnlyJar) {}
477 
478         @Override
479         public String getEncoding() {
480             return null;
481         }
482 
483         @Override
484         public void setEncoding(String encoding) {}
485 
486         @Override
487         public boolean getFailIfNoSpecifiedTests() {
488             return false;
489         }
490 
491         @Override
492         public void setFailIfNoSpecifiedTests(boolean failIfNoSpecifiedTests) {}
493 
494         @Override
495         public int getSkipAfterFailureCount() {
496             return 0;
497         }
498 
499         @Override
500         public String getShutdown() {
501             return null;
502         }
503 
504         @Override
505         public File getExcludesFile() {
506             return null;
507         }
508 
509         @Override
510         protected List<File> suiteXmlFiles() {
511             return null;
512         }
513 
514         @Override
515         protected boolean hasSuiteXmlFiles() {
516             return false;
517         }
518 
519         @Override
520         protected String[] getExcludedEnvironmentVariables() {
521             return new String[0];
522         }
523 
524         @Override
525         public File[] getSuiteXmlFiles() {
526             return new File[0];
527         }
528 
529         @Override
530         public void setSuiteXmlFiles(File[] suiteXmlFiles) {}
531 
532         @Override
533         public String getRunOrder() {
534             return null;
535         }
536 
537         @Override
538         public void setRunOrder(String runOrder) {}
539 
540         @Override
541         public Long getRunOrderRandomSeed() {
542             return null;
543         }
544 
545         @Override
546         public void setRunOrderRandomSeed(Long runOrderRandomSeed) {}
547 
548         @Override
549         public String getRunOrderStatisticsFileChecksum() {
550             return "dummyStatistics";
551         }
552 
553         @Override
554         public void setRunOrderStatisticsFileChecksum(String runOrderStatisticsFileChecksum) {}
555 
556         @Override
557         public String[] getDependenciesToScan() {
558             return dependenciesToScan;
559         }
560 
561         @Override
562         protected void handleSummary(RunResult summary, Exception firstForkException) {}
563 
564         @Override
565         protected boolean isSkipExecution() {
566             return false;
567         }
568 
569         @Override
570         protected String[] getDefaultIncludes() {
571             return new String[0];
572         }
573 
574         @Override
575         protected String getReportSchemaLocation() {
576             return null;
577         }
578 
579         @Override
580         protected boolean useModulePath() {
581             return false;
582         }
583 
584         @Override
585         protected void setUseModulePath(boolean useModulePath) {}
586 
587         @Override
588         protected ForkNodeFactory getForkNode() {
589             return null;
590         }
591 
592         @Override
593         protected String getEnableProcessChecker() {
594             return null;
595         }
596 
597         @Override
598         protected Artifact getMojoArtifact() {
599             return null;
600         }
601 
602         @Override
603         List<Artifact> getProjectTestArtifacts() {
604             return projectTestArtifacts;
605         }
606 
607         @Override
608         public File getSystemPropertiesFile() {
609             return null;
610         }
611 
612         @Override
613         public void setSystemPropertiesFile(File systemPropertiesFile) {}
614 
615         @Override
616         public String[] getIncludeJUnit5Engines() {
617             return null;
618         }
619 
620         @Override
621         public void setIncludeJUnit5Engines(String[] includeJUnit5Engines) {}
622 
623         @Override
624         public String[] getExcludeJUnit5Engines() {
625             return null;
626         }
627 
628         @Override
629         public void setExcludeJUnit5Engines(String[] excludeJUnit5Engines) {}
630     }
631 }