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.providerapi.AbstractProvider;
29 import org.apache.maven.surefire.providerapi.ProviderParameters;
30 import org.apache.maven.surefire.report.ConsoleLogger;
31 import org.apache.maven.surefire.report.ConsoleOutputCapture;
32 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
33 import org.apache.maven.surefire.report.ReporterException;
34 import org.apache.maven.surefire.report.ReporterFactory;
35 import org.apache.maven.surefire.report.RunListener;
36 import org.apache.maven.surefire.suite.RunResult;
37 import org.apache.maven.surefire.testset.TestSetFailedException;
38 import org.apache.maven.surefire.util.DirectoryScanner;
39 import org.apache.maven.surefire.util.ScannerFilter;
40 import org.apache.maven.surefire.util.TestsToRun;
41
42
43
44
45 @SuppressWarnings( { "UnusedDeclaration" } )
46 public class JUnitCoreProvider
47 extends AbstractProvider
48 {
49 private final ClassLoader testClassLoader;
50
51 private final DirectoryScanner directoryScanner;
52
53 private final JUnitCoreParameters jUnitCoreParameters;
54
55 private final ScannerFilter scannerFilter;
56
57 private final List<org.junit.runner.notification.RunListener> customRunListeners;
58
59 private final ProviderParameters providerParameters;
60
61 private TestsToRun testsToRun;
62
63
64 public JUnitCoreProvider( ProviderParameters providerParameters )
65 {
66 this.providerParameters = providerParameters;
67 this.testClassLoader = providerParameters.getTestClassLoader();
68 this.directoryScanner = providerParameters.getDirectoryScanner();
69 this.jUnitCoreParameters = new JUnitCoreParameters( providerParameters.getProviderProperties() );
70 this.scannerFilter = new JUnit4TestChecker( testClassLoader );
71 customRunListeners = JUnit4RunListenerFactory.
72 createCustomListeners( providerParameters.getProviderProperties().getProperty( "listener" ) );
73
74 }
75
76 public Boolean isRunnable()
77 {
78 return Boolean.TRUE;
79 }
80
81 public Iterator getSuites()
82 {
83 testsToRun = scanClassPath();
84 return testsToRun.iterator();
85 }
86
87 public RunResult invoke( Object forkTestSet )
88 throws TestSetFailedException, ReporterException
89 {
90 final String message = "Concurrency config is " + jUnitCoreParameters.toString() + "\n";
91 final ReporterFactory reporterFactory = providerParameters.getReporterFactory();
92
93 final ConsoleLogger consoleLogger = providerParameters.getConsoleLogger();
94 consoleLogger.info( 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 = ConcurrentReporterManager.createInstance( testSetMap, reporterFactory,
103 jUnitCoreParameters.isParallelClasses(),
104 jUnitCoreParameters.isParallelBoth(),
105 consoleLogger );
106
107 ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) listener );
108
109 org.junit.runner.notification.RunListener jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
110 customRunListeners.add( 0, jUnit4RunListener );
111
112 JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners );
113 return reporterFactory.close();
114 }
115
116 private TestsToRun scanClassPath()
117 {
118 return directoryScanner.locateTestClasses( testClassLoader, scannerFilter );
119 }
120 }