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