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 java.util.Iterator;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.concurrent.ConcurrentHashMap;
26
27 import org.apache.maven.surefire.common.junit4.JUnit4RunListenerFactory;
28 import org.apache.maven.surefire.common.junit48.FilterFactory;
29 import org.apache.maven.surefire.common.junit48.JUnit48Reflector;
30 import org.apache.maven.surefire.common.junit48.JUnit48TestChecker;
31 import org.apache.maven.surefire.providerapi.AbstractProvider;
32 import org.apache.maven.surefire.providerapi.ProviderParameters;
33 import org.apache.maven.surefire.report.ConsoleLogger;
34 import org.apache.maven.surefire.report.ConsoleOutputCapture;
35 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
36 import org.apache.maven.surefire.report.ReporterException;
37 import org.apache.maven.surefire.report.ReporterFactory;
38 import org.apache.maven.surefire.report.RunListener;
39 import org.apache.maven.surefire.suite.RunResult;
40 import org.apache.maven.surefire.testset.TestSetFailedException;
41 import org.apache.maven.surefire.util.RunOrderCalculator;
42 import org.apache.maven.surefire.util.ScanResult;
43 import org.apache.maven.surefire.util.ScannerFilter;
44 import org.apache.maven.surefire.util.TestsToRun;
45 import org.apache.maven.surefire.util.internal.StringUtils;
46 import org.junit.runner.manipulation.Filter;
47
48
49
50
51 @SuppressWarnings( { "UnusedDeclaration" } )
52 public class JUnitCoreProvider
53 extends AbstractProvider
54 {
55 private final ClassLoader testClassLoader;
56
57 private final JUnitCoreParameters jUnitCoreParameters;
58
59 private final ScannerFilter scannerFilter;
60
61 private final List<org.junit.runner.notification.RunListener> customRunListeners;
62
63 private final ProviderParameters providerParameters;
64
65 private TestsToRun testsToRun;
66
67 private JUnit48Reflector jUnit48Reflector;
68
69 private RunOrderCalculator runOrderCalculator;
70
71 private String requestedTestMethod;
72
73 private final ScanResult scanResult;
74
75 public JUnitCoreProvider( ProviderParameters providerParameters )
76 {
77 this.providerParameters = providerParameters;
78 this.testClassLoader = providerParameters.getTestClassLoader();
79 this.scanResult = providerParameters.getScanResult();
80 this.runOrderCalculator = providerParameters.getRunOrderCalculator();
81 this.jUnitCoreParameters = new JUnitCoreParameters( providerParameters.getProviderProperties() );
82 this.scannerFilter = new JUnit48TestChecker( testClassLoader );
83 this.requestedTestMethod = providerParameters.getTestRequest().getRequestedTestMethod();
84
85 customRunListeners =
86 JUnit4RunListenerFactory.createCustomListeners( providerParameters.getProviderProperties().getProperty( "listener" ) );
87 jUnit48Reflector = new JUnit48Reflector( testClassLoader );
88 }
89
90 public Boolean isRunnable()
91 {
92 return Boolean.TRUE;
93 }
94
95 public Iterator getSuites()
96 {
97 testsToRun = scanClassPath();
98 return testsToRun.iterator();
99 }
100
101 private boolean isSingleThreaded()
102 {
103 return !jUnitCoreParameters.isAnyParallelitySelected()
104 || ( testsToRun.containsExactly( 1 ) && !jUnitCoreParameters.isParallelMethod() );
105 }
106
107 public RunResult invoke( Object forkTestSet )
108 throws TestSetFailedException, ReporterException
109 {
110 final ReporterFactory reporterFactory = providerParameters.getReporterFactory();
111
112 final ConsoleLogger consoleLogger = providerParameters.getConsoleLogger();
113
114 Filter filter = jUnit48Reflector.isJUnit48Available() ? createJUnit48Filter() : null;
115
116 if ( testsToRun == null )
117 {
118 if ( forkTestSet instanceof TestsToRun )
119 {
120 testsToRun = (TestsToRun) forkTestSet;
121 }
122 else if ( forkTestSet instanceof Class )
123 {
124 Class theClass = (Class) forkTestSet;
125 testsToRun = TestsToRun.fromClass( theClass );
126 }
127 else
128 {
129 testsToRun = scanClassPath();
130 }
131 }
132
133 org.junit.runner.notification.RunListener jUnit4RunListener = getRunListener( reporterFactory, consoleLogger );
134 customRunListeners.add( 0, jUnit4RunListener );
135 JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners, filter );
136 return reporterFactory.close();
137 }
138
139 private org.junit.runner.notification.RunListener getRunListener( ReporterFactory reporterFactory,
140 ConsoleLogger consoleLogger )
141 throws TestSetFailedException
142 {
143 org.junit.runner.notification.RunListener jUnit4RunListener;
144 if ( isSingleThreaded() )
145 {
146 NonConcurrentRunListener rm = new NonConcurrentRunListener( reporterFactory.createReporter() );
147 ConsoleOutputCapture.startCapture( rm );
148 jUnit4RunListener = rm;
149 }
150 else
151 {
152 final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, TestSet>();
153
154 RunListener listener =
155 ConcurrentRunListener.createInstance( testSetMap, reporterFactory,
156 jUnitCoreParameters.isParallelClasses(),
157 jUnitCoreParameters.isParallelBoth(), consoleLogger );
158 ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) listener );
159
160 jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
161 }
162 return jUnit4RunListener;
163 }
164
165 private Filter createJUnit48Filter()
166 {
167 final FilterFactory filterFactory = new FilterFactory( testClassLoader );
168 Filter groupFilter = filterFactory.createGroupFilter( providerParameters.getProviderProperties() );
169 return isMethodFilterSpecified() ? filterFactory.and( groupFilter,
170 filterFactory.createMethodFilter( requestedTestMethod ) )
171 : groupFilter;
172 }
173
174 private TestsToRun scanClassPath()
175 {
176 final TestsToRun scanned = scanResult.applyFilter( scannerFilter, testClassLoader );
177 return runOrderCalculator.orderTestClasses( scanned );
178 }
179
180 private boolean isMethodFilterSpecified()
181 {
182 return !StringUtils.isBlank( requestedTestMethod );
183 }
184 }