View Javadoc
1   package org.apache.maven.surefire.junit;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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.providerapi.AbstractProvider;
25  import org.apache.maven.surefire.providerapi.ProviderParameters;
26  import org.apache.maven.surefire.report.ConsoleOutputCapture;
27  import org.apache.maven.surefire.report.ConsoleOutputReceiver;
28  import org.apache.maven.surefire.report.ReportEntry;
29  import org.apache.maven.surefire.report.ReporterFactory;
30  import org.apache.maven.surefire.report.RunListener;
31  import org.apache.maven.surefire.report.SimpleReportEntry;
32  import org.apache.maven.surefire.suite.RunResult;
33  import org.apache.maven.surefire.testset.TestSetFailedException;
34  import org.apache.maven.surefire.util.ReflectionUtils;
35  import org.apache.maven.surefire.util.RunOrderCalculator;
36  import org.apache.maven.surefire.util.ScanResult;
37  import org.apache.maven.surefire.util.TestsToRun;
38  
39  /**
40   * @author Kristian Rosenvold
41   */
42  public class JUnit3Provider
43      extends AbstractProvider
44  {
45      private final ClassLoader testClassLoader;
46  
47      private final PojoAndJUnit3Checker testChecker;
48  
49      private final JUnit3TestChecker jUnit3TestChecker;
50  
51      private final JUnit3Reflector reflector;
52  
53      private final ProviderParameters providerParameters;
54  
55      private final RunOrderCalculator runOrderCalculator;
56  
57      private final ScanResult scanResult;
58  
59      private TestsToRun testsToRun;
60  
61      public JUnit3Provider( ProviderParameters booterParameters )
62      {
63          this.providerParameters = booterParameters;
64          testClassLoader = booterParameters.getTestClassLoader();
65          scanResult = booterParameters.getScanResult();
66          runOrderCalculator = booterParameters.getRunOrderCalculator();
67          reflector = new JUnit3Reflector( testClassLoader );
68          jUnit3TestChecker = new JUnit3TestChecker( testClassLoader );
69          testChecker = new PojoAndJUnit3Checker( jUnit3TestChecker ); // Todo; use reflector
70      }
71  
72      public RunResult invoke( Object forkTestSet )
73          throws TestSetFailedException
74      {
75          if ( testsToRun == null )
76          {
77              if ( forkTestSet instanceof TestsToRun )
78              {
79                  testsToRun = (TestsToRun) forkTestSet;
80              }
81              else if ( forkTestSet instanceof Class )
82              {
83                  testsToRun = TestsToRun.fromClass( (Class<?>) forkTestSet );
84              }
85              else
86              {
87                  testsToRun = scanClassPath();
88              }
89          }
90  
91          ReporterFactory reporterFactory = providerParameters.getReporterFactory();
92          final RunListener reporter = reporterFactory.createReporter();
93          ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) reporter );
94  
95          final String smClassName = System.getProperty( "surefire.security.manager" );
96          if ( smClassName != null )
97          {
98              SecurityManager securityManager =
99                  ReflectionUtils.instantiate( getClass().getClassLoader(), smClassName, SecurityManager.class );
100             System.setSecurityManager( securityManager );
101         }
102 
103         for ( Class<?> clazz : testsToRun )
104         {
105             SurefireTestSet surefireTestSet = createTestSet( clazz );
106             executeTestSet( surefireTestSet, reporter, testClassLoader );
107         }
108 
109         return reporterFactory.close();
110     }
111 
112     private SurefireTestSet createTestSet( Class<?> clazz )
113         throws TestSetFailedException
114     {
115         return reflector.isJUnit3Available() && jUnit3TestChecker.accept( clazz )
116             ? new JUnitTestSet( clazz, reflector )
117             : new PojoTestSet( clazz );
118     }
119 
120     private void executeTestSet( SurefireTestSet testSet, RunListener reporter, ClassLoader classLoader )
121         throws TestSetFailedException
122     {
123 
124         ReportEntry report = new SimpleReportEntry( this.getClass().getName(), testSet.getName() );
125 
126         reporter.testSetStarting( report );
127 
128         testSet.execute( reporter, classLoader );
129 
130         reporter.testSetCompleted( report );
131     }
132 
133     private TestsToRun scanClassPath()
134     {
135         final TestsToRun testsToRun = scanResult.applyFilter( testChecker, testClassLoader );
136         return runOrderCalculator.orderTestClasses( testsToRun );
137     }
138 
139     public Iterable<Class<?>> getSuites()
140     {
141         testsToRun = scanClassPath();
142         return testsToRun;
143     }
144 }