View Javadoc

1   package org.apache.maven.surefire.junitcore;
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 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.common.junit48.FilterFactory;
29  import org.apache.maven.surefire.common.junit48.JUnit48Reflector;
30  import org.apache.maven.surefire.providerapi.AbstractProvider;
31  import org.apache.maven.surefire.providerapi.ProviderParameters;
32  import org.apache.maven.surefire.report.ConsoleLogger;
33  import org.apache.maven.surefire.report.ConsoleOutputCapture;
34  import org.apache.maven.surefire.report.ConsoleOutputReceiver;
35  import org.apache.maven.surefire.report.ReporterException;
36  import org.apache.maven.surefire.report.ReporterFactory;
37  import org.apache.maven.surefire.report.RunListener;
38  import org.apache.maven.surefire.suite.RunResult;
39  import org.apache.maven.surefire.testset.TestSetFailedException;
40  import org.apache.maven.surefire.util.RunOrderCalculator;
41  import org.apache.maven.surefire.util.ScanResult;
42  import org.apache.maven.surefire.util.ScannerFilter;
43  import org.apache.maven.surefire.util.TestsToRun;
44  import org.apache.maven.surefire.util.internal.StringUtils;
45  
46  import org.junit.runner.manipulation.Filter;
47  
48  /**
49   * @author Kristian Rosenvold
50   */
51  @SuppressWarnings( { "UnusedDeclaration" } )
52  public class JUnitCoreProvider
53      extends AbstractProvider
54  {
55      private final ClassLoader testClassLoader;
56  
57      private final JUnitCoreParameters jUnitCoreParameters;
58  
59      private final ScannerFilter scannerFilter;
60  
61      private final List<org.junit.runner.notification.RunListener> customRunListeners;
62  
63      private final ProviderParameters providerParameters;
64  
65      private TestsToRun testsToRun;
66  
67      private JUnit48Reflector jUnit48Reflector;
68  
69      private RunOrderCalculator runOrderCalculator;
70  
71      private String requestedTestMethod;
72  
73      private final ScanResult scanResult;
74  
75      public JUnitCoreProvider( ProviderParameters providerParameters )
76      {
77          this.providerParameters = providerParameters;
78          this.testClassLoader = providerParameters.getTestClassLoader();
79          this.scanResult = providerParameters.getScanResult();
80          this.runOrderCalculator = providerParameters.getRunOrderCalculator();
81          this.jUnitCoreParameters = new JUnitCoreParameters( providerParameters.getProviderProperties() );
82          this.scannerFilter = new JUnit4TestChecker( testClassLoader );
83          this.requestedTestMethod = providerParameters.getTestRequest().getRequestedTestMethod();
84  
85          customRunListeners =
86              JUnit4RunListenerFactory.createCustomListeners( providerParameters.getProviderProperties().getProperty( "listener" ) );
87          jUnit48Reflector = new JUnit48Reflector( testClassLoader );
88      }
89  
90      public Boolean isRunnable()
91      {
92          return Boolean.TRUE;
93      }
94  
95      public Iterator getSuites()
96      {
97          testsToRun = scanClassPath();
98          return testsToRun.iterator();
99      }
100 
101     private boolean isSingleThreaded()
102     {
103         return !jUnitCoreParameters.isAnyParallelitySelected()
104             || ( testsToRun.containsExactly( 1 ) && !jUnitCoreParameters.isParallelMethod() );
105     }
106 
107     public RunResult invoke( Object forkTestSet )
108         throws TestSetFailedException, ReporterException
109     {
110         final String message = jUnitCoreParameters.toString() + "\n";
111 
112         final ReporterFactory reporterFactory = providerParameters.getReporterFactory();
113 
114         final ConsoleLogger consoleLogger = providerParameters.getConsoleLogger();
115         consoleLogger.info( message );
116 
117         Filter filter = jUnit48Reflector.isJUnit48Available() ? createJUnit48Filter() : null;
118 
119         if ( testsToRun == null )
120         {
121             if ( forkTestSet instanceof TestsToRun )
122             {
123                 testsToRun = (TestsToRun) forkTestSet;
124             }
125             else if ( forkTestSet instanceof Class )
126             {
127                 Class theClass = (Class) forkTestSet;
128                 testsToRun = TestsToRun.fromClass( theClass );
129             }
130             else
131             {
132                 testsToRun = scanClassPath();
133             }
134         }
135 
136         org.junit.runner.notification.RunListener jUnit4RunListener = getRunListener( reporterFactory, consoleLogger );
137         customRunListeners.add( 0, jUnit4RunListener );
138         JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners, filter );
139         return reporterFactory.close();
140     }
141 
142     private org.junit.runner.notification.RunListener getRunListener( ReporterFactory reporterFactory,
143                                                                       ConsoleLogger consoleLogger )
144         throws TestSetFailedException
145     {
146         org.junit.runner.notification.RunListener jUnit4RunListener;
147         if ( isSingleThreaded() )
148         {
149             NonConcurrentRunListener rm = new NonConcurrentRunListener( reporterFactory.createReporter() );
150             ConsoleOutputCapture.startCapture( rm );
151             jUnit4RunListener = rm;
152         }
153         else
154         {
155             final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, TestSet>();
156 
157             RunListener listener =
158                 ConcurrentRunListener.createInstance( testSetMap, reporterFactory,
159                                                       jUnitCoreParameters.isParallelClasses(),
160                                                       jUnitCoreParameters.isParallelBoth(), consoleLogger );
161             ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) listener );
162 
163             jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
164         }
165         return jUnit4RunListener;
166     }
167 
168     private Filter createJUnit48Filter()
169     {
170         final FilterFactory filterFactory = new FilterFactory( testClassLoader );
171         Filter groupFilter = filterFactory.createGroupFilter( providerParameters.getProviderProperties() );
172         return isMethodFilterSpecified() ? filterFactory.and( groupFilter,
173                                                               filterFactory.createMethodFilter( requestedTestMethod ) )
174                         : groupFilter;
175     }
176 
177     private TestsToRun scanClassPath()
178     {
179         final TestsToRun scanned = scanResult.applyFilter( scannerFilter, testClassLoader );
180         return runOrderCalculator.orderTestClasses( scanned );
181     }
182 
183     private boolean isMethodFilterSpecified()
184     {
185         return !StringUtils.isBlank( requestedTestMethod );
186     }
187 }