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