1 package org.apache.maven.surefire.junitcore;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.surefire.common.junit4.JUnit4RunListenerFactory;
23 import org.apache.maven.surefire.common.junit4.JUnit4TestChecker;
24 import org.apache.maven.surefire.providerapi.AbstractProvider;
25 import org.apache.maven.surefire.providerapi.ProviderParameters;
26 import org.apache.maven.surefire.report.RunListener;
27 import org.apache.maven.surefire.report.ReporterConfiguration;
28 import org.apache.maven.surefire.report.ReporterException;
29 import org.apache.maven.surefire.report.ReporterFactory;
30 import org.apache.maven.surefire.suite.RunResult;
31 import org.apache.maven.surefire.testset.TestSetFailedException;
32 import org.apache.maven.surefire.util.DirectoryScanner;
33 import org.apache.maven.surefire.util.ScannerFilter;
34 import org.apache.maven.surefire.util.TestsToRun;
35
36 import java.util.Iterator;
37 import java.util.List;
38 import java.util.Map;
39 import java.util.concurrent.ConcurrentHashMap;
40
41
42
43
44 @SuppressWarnings( { "UnusedDeclaration" } )
45 public class JUnitCoreProvider
46 extends AbstractProvider
47 {
48 private final ClassLoader testClassLoader;
49
50 private final DirectoryScanner directoryScanner;
51
52 private final JUnitCoreParameters jUnitCoreParameters;
53
54 private final ScannerFilter scannerFilter;
55
56 private final List<org.junit.runner.notification.RunListener> customRunListeners;
57
58 private final ProviderParameters providerParameters;
59
60 private TestsToRun testsToRun;
61
62 private final ReporterConfiguration reporterConfiguration;
63
64 public JUnitCoreProvider( ProviderParameters booterParameters )
65 {
66 this.providerParameters = booterParameters;
67 reporterConfiguration = booterParameters.getReporterConfiguration();
68 this.testClassLoader = booterParameters.getTestClassLoader();
69 this.directoryScanner = booterParameters.getDirectoryScanner();
70 this.jUnitCoreParameters = new JUnitCoreParameters( booterParameters.getProviderProperties() );
71 this.scannerFilter = new JUnit4TestChecker( testClassLoader );
72 customRunListeners = JUnit4RunListenerFactory.
73 createCustomListeners( booterParameters.getProviderProperties().getProperty( "listener" ) );
74
75 }
76
77 public Boolean isRunnable()
78 {
79 return Boolean.TRUE;
80 }
81
82 public Iterator getSuites()
83 {
84 testsToRun = scanClassPath();
85 return testsToRun.iterator();
86 }
87
88 public RunResult invoke( Object forkTestSet )
89 throws TestSetFailedException, ReporterException
90 {
91 final String message = "Concurrency config is " + jUnitCoreParameters.toString();
92 final ReporterFactory reporterFactory = providerParameters.getReporterFactory();
93
94 reporterFactory.createConsoleReporter().writeMessage( message );
95
96 if ( testsToRun == null )
97 {
98 testsToRun = forkTestSet == null ? scanClassPath() : TestsToRun.fromClass( (Class) forkTestSet );
99 }
100 final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, TestSet>();
101
102 RunListener listener =
103 ConcurrentReporterManager.createInstance( testSetMap, reporterFactory, this.reporterConfiguration,
104 jUnitCoreParameters.isParallelClasses(),
105 jUnitCoreParameters.isParallelBoth() );
106 org.junit.runner.notification.RunListener jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
107 customRunListeners.add( 0, jUnit4RunListener );
108
109 JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners );
110 return reporterFactory.close();
111 }
112
113 private TestsToRun scanClassPath()
114 {
115 return directoryScanner.locateTestClasses( testClassLoader, scannerFilter );
116 }
117 }