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.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   * @author Kristian Rosenvold
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 ); // Todo; use reflector
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 }