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.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 }