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 import org.apache.maven.surefire.common.junit4.JUnit4RunListenerFactory;
27 import org.apache.maven.surefire.common.junit4.JUnit4TestChecker;
28 import org.apache.maven.surefire.common.junit48.FilterFactory;
29 import org.apache.maven.surefire.common.junit48.JUnit48Reflector;
30 import org.apache.maven.surefire.providerapi.AbstractProvider;
31 import org.apache.maven.surefire.providerapi.ProviderParameters;
32 import org.apache.maven.surefire.report.ConsoleLogger;
33 import org.apache.maven.surefire.report.ConsoleOutputCapture;
34 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
35 import org.apache.maven.surefire.report.ReporterException;
36 import org.apache.maven.surefire.report.ReporterFactory;
37 import org.apache.maven.surefire.report.RunListener;
38 import org.apache.maven.surefire.suite.RunResult;
39 import org.apache.maven.surefire.testset.TestSetFailedException;
40 import org.apache.maven.surefire.util.RunOrderCalculator;
41 import org.apache.maven.surefire.util.ScanResult;
42 import org.apache.maven.surefire.util.ScannerFilter;
43 import org.apache.maven.surefire.util.TestsToRun;
44 import org.apache.maven.surefire.util.internal.StringUtils;
45
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 JUnit4TestChecker( 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 String message = jUnitCoreParameters.toString() + "\n";
111
112 final ReporterFactory reporterFactory = providerParameters.getReporterFactory();
113
114 final ConsoleLogger consoleLogger = providerParameters.getConsoleLogger();
115 consoleLogger.info( message );
116
117 Filter filter = jUnit48Reflector.isJUnit48Available() ? createJUnit48Filter() : null;
118
119 if ( testsToRun == null )
120 {
121 if ( forkTestSet instanceof TestsToRun )
122 {
123 testsToRun = (TestsToRun) forkTestSet;
124 }
125 else if ( forkTestSet instanceof Class )
126 {
127 Class theClass = (Class) forkTestSet;
128 testsToRun = TestsToRun.fromClass( theClass );
129 }
130 else
131 {
132 testsToRun = scanClassPath();
133 }
134 }
135
136 org.junit.runner.notification.RunListener jUnit4RunListener = getRunListener( reporterFactory, consoleLogger );
137 customRunListeners.add( 0, jUnit4RunListener );
138 JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners, filter );
139 return reporterFactory.close();
140 }
141
142 private org.junit.runner.notification.RunListener getRunListener( ReporterFactory reporterFactory,
143 ConsoleLogger consoleLogger )
144 throws TestSetFailedException
145 {
146 org.junit.runner.notification.RunListener jUnit4RunListener;
147 if ( isSingleThreaded() )
148 {
149 NonConcurrentRunListener rm = new NonConcurrentRunListener( reporterFactory.createReporter() );
150 ConsoleOutputCapture.startCapture( rm );
151 jUnit4RunListener = rm;
152 }
153 else
154 {
155 final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, TestSet>();
156
157 RunListener listener =
158 ConcurrentRunListener.createInstance( testSetMap, reporterFactory,
159 jUnitCoreParameters.isParallelClasses(),
160 jUnitCoreParameters.isParallelBoth(), consoleLogger );
161 ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) listener );
162
163 jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
164 }
165 return jUnit4RunListener;
166 }
167
168 private Filter createJUnit48Filter()
169 {
170 final FilterFactory filterFactory = new FilterFactory( testClassLoader );
171 Filter groupFilter = filterFactory.createGroupFilter( providerParameters.getProviderProperties() );
172 return isMethodFilterSpecified() ? filterFactory.and( groupFilter,
173 filterFactory.createMethodFilter( requestedTestMethod ) )
174 : groupFilter;
175 }
176
177 private TestsToRun scanClassPath()
178 {
179 final TestsToRun scanned = scanResult.applyFilter( scannerFilter, testClassLoader );
180 return runOrderCalculator.orderTestClasses( scanned );
181 }
182
183 private boolean isMethodFilterSpecified()
184 {
185 return !StringUtils.isBlank( requestedTestMethod );
186 }
187 }