1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }