1 package org.apache.maven.surefire.testng;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Iterator;
23 import java.util.Properties;
24 import org.apache.maven.surefire.providerapi.AbstractProvider;
25 import org.apache.maven.surefire.providerapi.ProviderParameters;
26 import org.apache.maven.surefire.report.ReporterConfiguration;
27 import org.apache.maven.surefire.report.ReporterException;
28 import org.apache.maven.surefire.report.ReporterFactory;
29 import org.apache.maven.surefire.suite.RunResult;
30 import org.apache.maven.surefire.testset.TestArtifactInfo;
31 import org.apache.maven.surefire.testset.TestRequest;
32 import org.apache.maven.surefire.testset.TestSetFailedException;
33 import org.apache.maven.surefire.util.NestedRuntimeException;
34 import org.apache.maven.surefire.util.RunOrderCalculator;
35 import org.apache.maven.surefire.util.ScanResult;
36 import org.apache.maven.surefire.util.TestsToRun;
37
38
39
40
41
42 public class TestNGProvider
43 extends AbstractProvider
44 {
45 private final Properties providerProperties;
46
47 private final TestArtifactInfo testArtifactInfo;
48
49 private final ReporterConfiguration reporterConfiguration;
50
51 private final ClassLoader testClassLoader;
52
53 private final ScanResult scanResult;
54
55 private final TestRequest testRequest;
56
57 private final ProviderParameters providerParameters;
58
59 private TestsToRun testsToRun;
60
61 private final RunOrderCalculator runOrderCalculator;
62
63 public TestNGProvider( ProviderParameters booterParameters )
64 {
65 this.providerParameters = booterParameters;
66 this.testClassLoader = booterParameters.getTestClassLoader();
67 this.runOrderCalculator = booterParameters.getRunOrderCalculator();
68 this.providerProperties = booterParameters.getProviderProperties();
69 this.testRequest = booterParameters.getTestRequest();
70 testArtifactInfo = booterParameters.getTestArtifactInfo();
71 reporterConfiguration = booterParameters.getReporterConfiguration();
72 this.scanResult = booterParameters.getScanResult();
73 }
74
75 public Boolean isRunnable()
76 {
77 return Boolean.TRUE;
78 }
79
80 public RunResult invoke( Object forkTestSet )
81 throws TestSetFailedException, ReporterException
82 {
83
84 final ReporterFactory reporterFactory = providerParameters.getReporterFactory();
85
86 if ( isTestNGXmlTestSuite( testRequest ) )
87 {
88 TestNGXmlTestSuite testNGXmlTestSuite = getXmlSuite();
89 testNGXmlTestSuite.locateTestSets( testClassLoader );
90 if ( forkTestSet != null && testRequest == null )
91 {
92 testNGXmlTestSuite.execute( (String) forkTestSet, reporterFactory );
93 }
94 else
95 {
96 testNGXmlTestSuite.execute( reporterFactory );
97 }
98 }
99 else
100 {
101 if ( testsToRun == null )
102 {
103 if ( forkTestSet instanceof TestsToRun )
104 {
105 testsToRun = (TestsToRun) forkTestSet;
106 }
107 else if ( forkTestSet instanceof Class )
108 {
109 testsToRun = TestsToRun.fromClass( (Class) forkTestSet );
110 }
111 else
112 {
113 testsToRun = scanClassPath();
114 }
115 }
116 TestNGDirectoryTestSuite suite = getDirectorySuite();
117 suite.execute( testsToRun, reporterFactory );
118 }
119
120 return reporterFactory.close();
121 }
122
123 boolean isTestNGXmlTestSuite( TestRequest testSuiteDefinition )
124 {
125 return testSuiteDefinition.getSuiteXmlFiles() != null && testSuiteDefinition.getSuiteXmlFiles().size() > 0 &&
126 testSuiteDefinition.getRequestedTest() == null;
127
128 }
129
130
131 private TestNGDirectoryTestSuite getDirectorySuite()
132 {
133 return new TestNGDirectoryTestSuite( testRequest.getTestSourceDirectory().toString(),
134 testArtifactInfo.getVersion(), providerProperties,
135 reporterConfiguration.getReportsDirectory(),
136 testRequest.getRequestedTestMethod(), runOrderCalculator, scanResult );
137 }
138
139 private TestNGXmlTestSuite getXmlSuite()
140 {
141 return new TestNGXmlTestSuite( testRequest.getSuiteXmlFiles(), testRequest.getTestSourceDirectory().toString(),
142 testArtifactInfo.getVersion(), providerProperties,
143 reporterConfiguration.getReportsDirectory() );
144 }
145
146
147 public Iterator getSuites()
148 {
149 if ( isTestNGXmlTestSuite( testRequest ) )
150 {
151 try
152 {
153 return getXmlSuite().locateTestSets( testClassLoader ).keySet().iterator();
154 }
155 catch ( TestSetFailedException e )
156 {
157 throw new NestedRuntimeException( e );
158 }
159 }
160 else
161 {
162 testsToRun = scanClassPath();
163 return testsToRun.iterator();
164 }
165 }
166
167 private TestsToRun scanClassPath()
168 {
169 final TestsToRun scanned = scanResult.applyFilter( null, testClassLoader );
170 return runOrderCalculator.orderTestClasses( scanned );
171 }
172
173
174 }