1 package org.apache.maven.surefire.junit;
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 org.apache.maven.surefire.common.junit3.JUnit3Reflector;
24 import org.apache.maven.surefire.common.junit3.JUnit3TestChecker;
25 import org.apache.maven.surefire.providerapi.AbstractProvider;
26 import org.apache.maven.surefire.providerapi.ProviderParameters;
27 import org.apache.maven.surefire.report.ConsoleOutputCapture;
28 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
29 import org.apache.maven.surefire.report.ReportEntry;
30 import org.apache.maven.surefire.report.ReporterException;
31 import org.apache.maven.surefire.report.ReporterFactory;
32 import org.apache.maven.surefire.report.RunListener;
33 import org.apache.maven.surefire.report.SimpleReportEntry;
34 import org.apache.maven.surefire.suite.RunResult;
35 import org.apache.maven.surefire.testset.TestSetFailedException;
36 import org.apache.maven.surefire.util.ReflectionUtils;
37 import org.apache.maven.surefire.util.RunOrderCalculator;
38 import org.apache.maven.surefire.util.ScanResult;
39 import org.apache.maven.surefire.util.TestsToRun;
40
41
42
43
44 public class JUnit3Provider
45 extends AbstractProvider
46 {
47 private final ClassLoader testClassLoader;
48
49 private final PojoAndJUnit3Checker testChecker;
50
51 private final JUnit3TestChecker jUnit3TestChecker;
52
53 private final JUnit3Reflector reflector;
54
55 private final ProviderParameters providerParameters;
56
57 private final RunOrderCalculator runOrderCalculator;
58
59 private TestsToRun testsToRun;
60
61 private final ScanResult scanResult;
62
63 public JUnit3Provider( ProviderParameters booterParameters )
64 {
65 this.providerParameters = booterParameters;
66 this.testClassLoader = booterParameters.getTestClassLoader();
67 this.scanResult = booterParameters.getScanResult();
68 this.runOrderCalculator = booterParameters.getRunOrderCalculator();
69 this.reflector = new JUnit3Reflector( testClassLoader );
70 jUnit3TestChecker = new JUnit3TestChecker( testClassLoader );
71 this.testChecker = new PojoAndJUnit3Checker( jUnit3TestChecker );
72 }
73
74 public RunResult invoke( Object forkTestSet )
75 throws TestSetFailedException, ReporterException
76 {
77 if ( testsToRun == null )
78 {
79 if ( forkTestSet instanceof TestsToRun )
80 {
81 testsToRun = (TestsToRun) forkTestSet;
82 }
83 else if ( forkTestSet instanceof Class )
84 {
85 testsToRun = TestsToRun.fromClass( (Class<?>) forkTestSet );
86 }
87 else
88 {
89 testsToRun = scanClassPath();
90 }
91 }
92
93 ReporterFactory reporterFactory = providerParameters.getReporterFactory();
94 final RunListener reporter = reporterFactory.createReporter();
95 ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) reporter );
96
97 final String smClassName = System.getProperty( "surefire.security.manager" );
98 if ( smClassName != null )
99 {
100 SecurityManager securityManager =
101 (SecurityManager) ReflectionUtils.instantiate( this.getClass().getClassLoader(), smClassName );
102 System.setSecurityManager( securityManager );
103 }
104
105 for ( Iterator iter = testsToRun.iterator(); iter.hasNext(); )
106 {
107 Class clazz = (Class) iter.next();
108 SurefireTestSet surefireTestSet = createTestSet( clazz );
109 executeTestSet( surefireTestSet, reporter, testClassLoader );
110 }
111
112 return reporterFactory.close();
113 }
114
115 private SurefireTestSet createTestSet( Class<?> clazz )
116 throws TestSetFailedException
117 {
118 return reflector.isJUnit3Available() && jUnit3TestChecker.accept( clazz )
119 ? new JUnitTestSet( clazz, reflector )
120 : new PojoTestSet( clazz );
121
122 }
123
124 private void executeTestSet( SurefireTestSet testSet, RunListener reporter, ClassLoader classLoader )
125 throws ReporterException, TestSetFailedException
126 {
127
128 ReportEntry report = new SimpleReportEntry( this.getClass().getName(), testSet.getName() );
129
130 reporter.testSetStarting( report );
131
132 testSet.execute( reporter, classLoader );
133
134 reporter.testSetCompleted( report );
135 }
136
137 private TestsToRun scanClassPath()
138 {
139 final TestsToRun testsToRun = scanResult.applyFilter( testChecker, testClassLoader );
140 return runOrderCalculator.orderTestClasses( testsToRun );
141 }
142
143 public Iterator getSuites()
144 {
145 testsToRun = scanClassPath();
146 return testsToRun.iterator();
147 }
148 }