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