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.providerapi.AbstractProvider;
29  import org.apache.maven.surefire.providerapi.ProviderParameters;
30  import org.apache.maven.surefire.report.ConsoleLogger;
31  import org.apache.maven.surefire.report.ConsoleOutputCapture;
32  import org.apache.maven.surefire.report.ConsoleOutputReceiver;
33  import org.apache.maven.surefire.report.ReporterException;
34  import org.apache.maven.surefire.report.ReporterFactory;
35  import org.apache.maven.surefire.report.RunListener;
36  import org.apache.maven.surefire.suite.RunResult;
37  import org.apache.maven.surefire.testset.TestSetFailedException;
38  import org.apache.maven.surefire.util.DirectoryScanner;
39  import org.apache.maven.surefire.util.ScannerFilter;
40  import org.apache.maven.surefire.util.TestsToRun;
41  
42  /**
43   * @author Kristian Rosenvold
44   */
45  @SuppressWarnings( { "UnusedDeclaration" } )
46  public class JUnitCoreProvider
47      extends AbstractProvider
48  {
49      private final ClassLoader testClassLoader;
50  
51      private final DirectoryScanner directoryScanner;
52  
53      private final JUnitCoreParameters jUnitCoreParameters;
54  
55      private final ScannerFilter scannerFilter;
56  
57      private final List<org.junit.runner.notification.RunListener> customRunListeners;
58  
59      private final ProviderParameters providerParameters;
60  
61      private TestsToRun testsToRun;
62  
63  
64      public JUnitCoreProvider( ProviderParameters providerParameters )
65      {
66          this.providerParameters = providerParameters;
67          this.testClassLoader = providerParameters.getTestClassLoader();
68          this.directoryScanner = providerParameters.getDirectoryScanner();
69          this.jUnitCoreParameters = new JUnitCoreParameters( providerParameters.getProviderProperties() );
70          this.scannerFilter = new JUnit4TestChecker( testClassLoader );
71          customRunListeners = JUnit4RunListenerFactory.
72              createCustomListeners( providerParameters.getProviderProperties().getProperty( "listener" ) );
73  
74      }
75  
76      public Boolean isRunnable()
77      {
78          return Boolean.TRUE;
79      }
80  
81      public Iterator getSuites()
82      {
83          testsToRun = scanClassPath();
84          return testsToRun.iterator();
85      }
86  
87      public RunResult invoke( Object forkTestSet )
88          throws TestSetFailedException, ReporterException
89      {
90          final String message = "Concurrency config is " + jUnitCoreParameters.toString() + "\n";
91          final ReporterFactory reporterFactory = providerParameters.getReporterFactory();
92  
93          final ConsoleLogger consoleLogger = providerParameters.getConsoleLogger();
94          consoleLogger.info( message );
95  
96          if ( testsToRun == null )
97          {
98              testsToRun = forkTestSet == null ? scanClassPath() : TestsToRun.fromClass( (Class) forkTestSet );
99          }
100         final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, TestSet>();
101 
102         RunListener listener = ConcurrentReporterManager.createInstance( testSetMap, reporterFactory,
103                                                                          jUnitCoreParameters.isParallelClasses(),
104                                                                          jUnitCoreParameters.isParallelBoth(),
105                                                                          consoleLogger );
106 
107         ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) listener );
108 
109         org.junit.runner.notification.RunListener jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
110         customRunListeners.add( 0, jUnit4RunListener );
111 
112         JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners );
113         return reporterFactory.close();
114     }
115 
116     private TestsToRun scanClassPath()
117     {
118         return directoryScanner.locateTestClasses( testClassLoader, scannerFilter );
119     }
120 }