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  
27  import org.apache.maven.surefire.common.junit4.JUnit4RunListenerFactory;
28  import org.apache.maven.surefire.common.junit48.FilterFactory;
29  import org.apache.maven.surefire.common.junit48.JUnit48Reflector;
30  import org.apache.maven.surefire.common.junit48.JUnit48TestChecker;
31  import org.apache.maven.surefire.providerapi.AbstractProvider;
32  import org.apache.maven.surefire.providerapi.ProviderParameters;
33  import org.apache.maven.surefire.report.ConsoleLogger;
34  import org.apache.maven.surefire.report.ConsoleOutputCapture;
35  import org.apache.maven.surefire.report.ConsoleOutputReceiver;
36  import org.apache.maven.surefire.report.ReporterException;
37  import org.apache.maven.surefire.report.ReporterFactory;
38  import org.apache.maven.surefire.report.RunListener;
39  import org.apache.maven.surefire.suite.RunResult;
40  import org.apache.maven.surefire.testset.TestSetFailedException;
41  import org.apache.maven.surefire.util.RunOrderCalculator;
42  import org.apache.maven.surefire.util.ScanResult;
43  import org.apache.maven.surefire.util.ScannerFilter;
44  import org.apache.maven.surefire.util.TestsToRun;
45  import org.apache.maven.surefire.util.internal.StringUtils;
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 JUnit48TestChecker( 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 ReporterFactory reporterFactory = providerParameters.getReporterFactory();
111 
112         final ConsoleLogger consoleLogger = providerParameters.getConsoleLogger();
113 
114         Filter filter = jUnit48Reflector.isJUnit48Available() ? createJUnit48Filter() : null;
115 
116         if ( testsToRun == null )
117         {
118             if ( forkTestSet instanceof TestsToRun )
119             {
120                 testsToRun = (TestsToRun) forkTestSet;
121             }
122             else if ( forkTestSet instanceof Class )
123             {
124                 Class theClass = (Class) forkTestSet;
125                 testsToRun = TestsToRun.fromClass( theClass );
126             }
127             else
128             {
129                 testsToRun = scanClassPath();
130             }
131         }
132 
133         org.junit.runner.notification.RunListener jUnit4RunListener = getRunListener( reporterFactory, consoleLogger );
134         customRunListeners.add( 0, jUnit4RunListener );
135         JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners, filter );
136         return reporterFactory.close();
137     }
138 
139     private org.junit.runner.notification.RunListener getRunListener( ReporterFactory reporterFactory,
140                                                                       ConsoleLogger consoleLogger )
141         throws TestSetFailedException
142     {
143         org.junit.runner.notification.RunListener jUnit4RunListener;
144         if ( isSingleThreaded() )
145         {
146             NonConcurrentRunListener rm = new NonConcurrentRunListener( reporterFactory.createReporter() );
147             ConsoleOutputCapture.startCapture( rm );
148             jUnit4RunListener = rm;
149         }
150         else
151         {
152             final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, TestSet>();
153 
154             RunListener listener =
155                 ConcurrentRunListener.createInstance( testSetMap, reporterFactory,
156                                                       jUnitCoreParameters.isParallelClasses(),
157                                                       jUnitCoreParameters.isParallelBoth(), consoleLogger );
158             ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) listener );
159 
160             jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
161         }
162         return jUnit4RunListener;
163     }
164 
165     private Filter createJUnit48Filter()
166     {
167         final FilterFactory filterFactory = new FilterFactory( testClassLoader );
168         Filter groupFilter = filterFactory.createGroupFilter( providerParameters.getProviderProperties() );
169         return isMethodFilterSpecified() ? filterFactory.and( groupFilter,
170                                                               filterFactory.createMethodFilter( requestedTestMethod ) )
171                         : groupFilter;
172     }
173 
174     private TestsToRun scanClassPath()
175     {
176         final TestsToRun scanned = scanResult.applyFilter( scannerFilter, testClassLoader );
177         return runOrderCalculator.orderTestClasses( scanned );
178     }
179 
180     private boolean isMethodFilterSpecified()
181     {
182         return !StringUtils.isBlank( requestedTestMethod );
183     }
184 }