OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
4 | 4 |
5 library testing.run; | 5 library testing.run; |
6 | 6 |
7 import 'dart:async' show | 7 import 'dart:async' show |
8 Future, | 8 Future, |
9 Stream; | 9 Stream; |
10 | 10 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 /// The optional argument [configurationPath] should be used when | 112 /// The optional argument [configurationPath] should be used when |
113 /// `testing.json` isn't located in the current working directory and is a path | 113 /// `testing.json` isn't located in the current working directory and is a path |
114 /// relative to `Uri.base`. | 114 /// relative to `Uri.base`. |
115 Future<Null> run( | 115 Future<Null> run( |
116 List<String> arguments, List<String> suiteNames, | 116 List<String> arguments, List<String> suiteNames, |
117 [String configurationPath]) { | 117 [String configurationPath]) { |
118 return withErrorHandling(() async { | 118 return withErrorHandling(() async { |
119 TestRoot root = await computeTestRoot(configurationPath, Uri.base); | 119 TestRoot root = await computeTestRoot(configurationPath, Uri.base); |
120 List<Suite> suites = root.suites.where( | 120 List<Suite> suites = root.suites.where( |
121 (Suite suite) => suiteNames.contains(suite.name)).toList(); | 121 (Suite suite) => suiteNames.contains(suite.name)).toList(); |
122 SuiteRunner runner = new SuiteRunner(suites, <String, String>{}, null); | 122 SuiteRunner runner = new SuiteRunner(suites, <String, String>{}, null, |
| 123 new Set<String>(), new Set<String>()); |
123 String program = await runner.generateDartProgram(); | 124 String program = await runner.generateDartProgram(); |
124 await runner.analyze(root.packages); | 125 await runner.analyze(root.packages); |
125 if (program != null) { | 126 if (program != null) { |
126 await runProgram(program, root.packages); | 127 await runProgram(program, root.packages); |
127 } | 128 } |
128 }); | 129 }); |
129 } | 130 } |
130 | 131 |
131 Future<Null> runProgram(String program, Uri packages) async { | 132 Future<Null> runProgram(String program, Uri packages) async { |
132 logMessage("Running:"); | 133 logMessage("Running:"); |
(...skipping 18 matching lines...) Expand all Loading... |
151 : new Future<Null>.error(error[0], new StackTrace.fromString(error[1])); | 152 : new Future<Null>.error(error[0], new StackTrace.fromString(error[1])); |
152 } | 153 } |
153 | 154 |
154 class SuiteRunner { | 155 class SuiteRunner { |
155 final List<Suite> suites; | 156 final List<Suite> suites; |
156 | 157 |
157 final Map<String, String> environment; | 158 final Map<String, String> environment; |
158 | 159 |
159 final List<String> selectors; | 160 final List<String> selectors; |
160 | 161 |
161 List<Uri> testUris; | 162 final Set<String> selectedSuites; |
162 | 163 |
163 SuiteRunner(this.suites, this.environment, Iterable<String> selectors) | 164 final Set<String> skippedSuites; |
| 165 |
| 166 final List<Uri> testUris = <Uri>[]; |
| 167 |
| 168 SuiteRunner(this.suites, this.environment, Iterable<String> selectors, |
| 169 this.selectedSuites, this.skippedSuites) |
164 : selectors = selectors.toList(growable: false); | 170 : selectors = selectors.toList(growable: false); |
165 | 171 |
| 172 bool shouldRunSuite(Suite suite) { |
| 173 return !skippedSuites.contains(suite.name) && |
| 174 (selectedSuites.isEmpty || selectedSuites.contains(suite.name)); |
| 175 } |
| 176 |
166 Future<String> generateDartProgram() async { | 177 Future<String> generateDartProgram() async { |
167 List<TestDescription> descriptions = await list().toList(); | 178 testUris.clear(); |
168 testUris = <Uri>[]; | |
169 StringBuffer imports = new StringBuffer(); | 179 StringBuffer imports = new StringBuffer(); |
170 StringBuffer dart = new StringBuffer(); | 180 StringBuffer dart = new StringBuffer(); |
171 StringBuffer chain = new StringBuffer(); | 181 StringBuffer chain = new StringBuffer(); |
| 182 bool hasRunnableTests = false; |
172 | 183 |
173 for (TestDescription description in descriptions) { | 184 await for (TestDescription description in listDescriptions()) { |
174 testUris.add(await Isolate.resolvePackageUri(description.uri)); | 185 hasRunnableTests = true; |
175 description.writeImportOn(imports); | 186 description.writeImportOn(imports); |
176 description.writeClosureOn(dart); | 187 description.writeClosureOn(dart); |
177 } | 188 } |
178 | 189 |
179 for (Chain suite in suites.where((Suite suite) => suite is Chain)) { | 190 await for (Chain suite in listChainSuites()) { |
180 testUris.add(await Isolate.resolvePackageUri(suite.source)); | 191 hasRunnableTests = true; |
181 suite.writeImportOn(imports); | 192 suite.writeImportOn(imports); |
182 suite.writeClosureOn(chain); | 193 suite.writeClosureOn(chain); |
183 } | 194 } |
184 | 195 |
185 bool hasTestDartSuite = false; | 196 bool isFirstTestDartSuite = true; |
186 for (TestDart suite in suites.where((Suite suite) => suite is TestDart)) { | 197 for (TestDart suite in listTestDartSuites()) { |
187 if (!hasTestDartSuite) { | 198 hasRunnableTests = true; |
| 199 if (!isFirstTestDartSuite) { |
188 suite.writeFirstImportOn(imports); | 200 suite.writeFirstImportOn(imports); |
189 } | 201 } |
190 hasTestDartSuite = true; | 202 isFirstTestDartSuite = true; |
191 suite.writeRunCommandOn(chain); | 203 suite.writeRunCommandOn(chain); |
192 } | 204 } |
193 | 205 |
194 if (testUris.isEmpty && !hasTestDartSuite) return null; | 206 if (hasRunnableTests) return null; |
195 | 207 |
196 return """ | 208 return """ |
197 library testing.generated; | 209 library testing.generated; |
198 | 210 |
199 import 'dart:async' show Future; | 211 import 'dart:async' show Future; |
200 | 212 |
201 import 'dart:convert' show JSON; | 213 import 'dart:convert' show JSON; |
202 | 214 |
203 import 'package:testing/src/run_tests.dart' show runTests; | 215 import 'package:testing/src/run_tests.dart' show runTests; |
204 | 216 |
205 import 'package:testing/src/chain.dart' show runChain; | 217 import 'package:testing/src/chain.dart' show runChain; |
206 | 218 |
207 import 'package:testing/src/log.dart' show enableVerboseOutput, isVerbose; | 219 import 'package:testing/src/log.dart' show enableVerboseOutput, isVerbose; |
208 | 220 |
209 ${imports.toString().trim()} | 221 ${imports.toString().trim()} |
210 | 222 |
211 Future<Null> main() async { | 223 Future<Null> main() async { |
212 if ($isVerbose) enableVerboseOutput(); | 224 if ($isVerbose) enableVerboseOutput(); |
213 Map<String, String> environment = JSON.decode('${JSON.encode(environment)}'); | 225 Map<String, String> environment = JSON.decode('${JSON.encode(environment)}'); |
214 Set<String> selectors = JSON.decode('${JSON.encode(selectors)}').toSet(); | 226 Set<String> selectors = JSON.decode('${JSON.encode(selectors)}').toSet(); |
215 await runTests(<String, Function> { | 227 await runTests(<String, Function> { |
216 ${splitLines(dart.toString().trim()).join(' ')} | 228 ${splitLines(dart.toString().trim()).join(' ')} |
217 }); | 229 }); |
218 ${splitLines(chain.toString().trim()).join(' ')} | 230 ${splitLines(chain.toString().trim()).join(' ')} |
219 } | 231 } |
220 """; | 232 """; |
221 } | 233 } |
222 | 234 |
223 Future<Null> analyze(Uri packages) async { | 235 Future<bool> analyze(Uri packages) async { |
224 for (Analyze suite in suites.where((Suite suite) => suite is Analyze)) { | 236 bool hasAnalyzerSuites = false; |
| 237 for (Analyze suite in listAnalyzerSuites()) { |
| 238 hasAnalyzerSuites = true; |
225 await suite.run(packages, testUris); | 239 await suite.run(packages, testUris); |
226 } | 240 } |
| 241 return hasAnalyzerSuites; |
227 } | 242 } |
228 | 243 |
229 Stream<TestDescription> list() async* { | 244 Stream<TestDescription> listDescriptions() async* { |
230 for (Dart suite in suites.where((Suite suite) => suite is Dart)) { | 245 for (Dart suite in suites.where((Suite suite) => suite is Dart)) { |
231 await for (TestDescription description in | 246 await for (TestDescription description in |
232 listTests(<Uri>[suite.uri], pattern: "")) { | 247 listTests(<Uri>[suite.uri], pattern: "")) { |
233 String path = description.file.uri.path; | 248 testUris.add(await Isolate.resolvePackageUri(description.uri)); |
234 if (suite.exclude.any((RegExp r) => path.contains(r))) continue; | 249 if (shouldRunSuite(suite)) { |
235 if (suite.pattern.any((RegExp r) => path.contains(r))) { | 250 String path = description.file.uri.path; |
236 yield description; | 251 if (suite.exclude.any((RegExp r) => path.contains(r))) continue; |
| 252 if (suite.pattern.any((RegExp r) => path.contains(r))) { |
| 253 yield description; |
| 254 } |
237 } | 255 } |
238 } | 256 } |
239 } | 257 } |
240 } | 258 } |
| 259 |
| 260 Stream<Chain> listChainSuites() async* { |
| 261 for (Chain suite in suites.where((Suite suite) => suite is Chain)) { |
| 262 testUris.add(await Isolate.resolvePackageUri(suite.source)); |
| 263 if (shouldRunSuite(suite)) { |
| 264 yield suite; |
| 265 } |
| 266 } |
| 267 } |
| 268 |
| 269 Iterable<Suite> listTestDartSuites() { |
| 270 return suites.where((Suite suite) => suite is TestDart); |
| 271 } |
| 272 |
| 273 Iterable<Suite> listAnalyzerSuites() { |
| 274 return suites.where((Suite suite) => suite is Analyze); |
| 275 } |
241 } | 276 } |
OLD | NEW |