OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:io'; | 5 import 'dart:io'; |
6 | 6 |
7 import 'package:boolean_selector/boolean_selector.dart'; | 7 import 'package:boolean_selector/boolean_selector.dart'; |
8 import 'package:collection/collection.dart'; | 8 import 'package:collection/collection.dart'; |
9 import 'package:glob/glob.dart'; | 9 import 'package:glob/glob.dart'; |
10 import 'package:path/path.dart' as p; | 10 import 'package:path/path.dart' as p; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 | 85 |
86 /// Whether to use command-line color escapes. | 86 /// Whether to use command-line color escapes. |
87 bool get color => _color ?? canUseSpecialChars; | 87 bool get color => _color ?? canUseSpecialChars; |
88 final bool _color; | 88 final bool _color; |
89 | 89 |
90 /// How many tests to run concurrently. | 90 /// How many tests to run concurrently. |
91 int get concurrency => | 91 int get concurrency => |
92 pauseAfterLoad ? 1 : (_concurrency ?? defaultConcurrency); | 92 pauseAfterLoad ? 1 : (_concurrency ?? defaultConcurrency); |
93 final int _concurrency; | 93 final int _concurrency; |
94 | 94 |
| 95 /// The index of the current shard, if sharding is in use, or `null` if it's |
| 96 /// not. |
| 97 /// |
| 98 /// Sharding is a technique that allows the Google internal test framework to |
| 99 /// easily split a test run across multiple workers without requiring the |
| 100 /// tests to be modified by the user. When sharding is in use, the runner gets |
| 101 /// a shard index (this field) and a total number of shards, and is expected |
| 102 /// to provide the following guarantees: |
| 103 /// |
| 104 /// * Running the same invocation of the runner, with the same shard index and |
| 105 /// total shards, will run the same set of tests. |
| 106 /// * Across all shards, each test must be run exactly once. |
| 107 /// |
| 108 /// In addition, tests should be balanced across shards as much as possible. |
| 109 final int shardIndex; |
| 110 |
| 111 /// The total number of shards, if sharding is in use, or `null` if it's not. |
| 112 /// |
| 113 /// See [shardIndex] for details. |
| 114 final int totalShards; |
| 115 |
95 /// The paths from which to load tests. | 116 /// The paths from which to load tests. |
96 List<String> get paths => _paths ?? ["test"]; | 117 List<String> get paths => _paths ?? ["test"]; |
97 final List<String> _paths; | 118 final List<String> _paths; |
98 | 119 |
99 /// Whether the load paths were passed explicitly or the default was used. | 120 /// Whether the load paths were passed explicitly or the default was used. |
100 bool get explicitPaths => _paths != null; | 121 bool get explicitPaths => _paths != null; |
101 | 122 |
102 /// The glob matching the basename of tests to run. | 123 /// The glob matching the basename of tests to run. |
103 /// | 124 /// |
104 /// This is used to find tests within a directory. | 125 /// This is used to find tests within a directory. |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 bool jsTrace, | 263 bool jsTrace, |
243 bool skip, | 264 bool skip, |
244 String skipReason, | 265 String skipReason, |
245 PlatformSelector testOn, | 266 PlatformSelector testOn, |
246 bool pauseAfterLoad, | 267 bool pauseAfterLoad, |
247 bool color, | 268 bool color, |
248 String packageRoot, | 269 String packageRoot, |
249 String reporter, | 270 String reporter, |
250 int pubServePort, | 271 int pubServePort, |
251 int concurrency, | 272 int concurrency, |
| 273 int shardIndex, |
| 274 int totalShards, |
252 Timeout timeout, | 275 Timeout timeout, |
253 Iterable<Pattern> patterns, | 276 Iterable<Pattern> patterns, |
254 Iterable<TestPlatform> platforms, | 277 Iterable<TestPlatform> platforms, |
255 Iterable<String> paths, | 278 Iterable<String> paths, |
256 Glob filename, | 279 Glob filename, |
257 Iterable<String> chosenPresets, | 280 Iterable<String> chosenPresets, |
258 BooleanSelector includeTags, | 281 BooleanSelector includeTags, |
259 BooleanSelector excludeTags, | 282 BooleanSelector excludeTags, |
260 Iterable addTags, | 283 Iterable addTags, |
261 Map<BooleanSelector, Configuration> tags, | 284 Map<BooleanSelector, Configuration> tags, |
262 Map<PlatformSelector, Configuration> onPlatform, | 285 Map<PlatformSelector, Configuration> onPlatform, |
263 Map<String, Configuration> presets}) { | 286 Map<String, Configuration> presets}) { |
264 _unresolved() => new Configuration._( | 287 _unresolved() => new Configuration._( |
265 help: help, | 288 help: help, |
266 version: version, | 289 version: version, |
267 verboseTrace: verboseTrace, | 290 verboseTrace: verboseTrace, |
268 jsTrace: jsTrace, | 291 jsTrace: jsTrace, |
269 skip: skip, | 292 skip: skip, |
270 skipReason: skipReason, | 293 skipReason: skipReason, |
271 testOn: testOn, | 294 testOn: testOn, |
272 pauseAfterLoad: pauseAfterLoad, | 295 pauseAfterLoad: pauseAfterLoad, |
273 color: color, | 296 color: color, |
274 packageRoot: packageRoot, | 297 packageRoot: packageRoot, |
275 reporter: reporter, | 298 reporter: reporter, |
276 pubServePort: pubServePort, | 299 pubServePort: pubServePort, |
277 concurrency: concurrency, | 300 concurrency: concurrency, |
| 301 shardIndex: shardIndex, |
| 302 totalShards: totalShards, |
278 timeout: timeout, | 303 timeout: timeout, |
279 patterns: patterns, | 304 patterns: patterns, |
280 platforms: platforms, | 305 platforms: platforms, |
281 paths: paths, | 306 paths: paths, |
282 filename: filename, | 307 filename: filename, |
283 chosenPresets: chosenPresets, | 308 chosenPresets: chosenPresets, |
284 includeTags: includeTags, | 309 includeTags: includeTags, |
285 excludeTags: excludeTags, | 310 excludeTags: excludeTags, |
286 addTags: addTags, | 311 addTags: addTags, |
287 | 312 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 bool jsTrace, | 357 bool jsTrace, |
333 bool skip, | 358 bool skip, |
334 this.skipReason, | 359 this.skipReason, |
335 PlatformSelector testOn, | 360 PlatformSelector testOn, |
336 bool pauseAfterLoad, | 361 bool pauseAfterLoad, |
337 bool color, | 362 bool color, |
338 String packageRoot, | 363 String packageRoot, |
339 String reporter, | 364 String reporter, |
340 int pubServePort, | 365 int pubServePort, |
341 int concurrency, | 366 int concurrency, |
| 367 this.shardIndex, |
| 368 this.totalShards, |
342 Timeout timeout, | 369 Timeout timeout, |
343 Iterable<Pattern> patterns, | 370 Iterable<Pattern> patterns, |
344 Iterable<TestPlatform> platforms, | 371 Iterable<TestPlatform> platforms, |
345 Iterable<String> paths, | 372 Iterable<String> paths, |
346 Glob filename, | 373 Glob filename, |
347 Iterable<String> chosenPresets, | 374 Iterable<String> chosenPresets, |
348 BooleanSelector includeTags, | 375 BooleanSelector includeTags, |
349 BooleanSelector excludeTags, | 376 BooleanSelector excludeTags, |
350 Iterable addTags, | 377 Iterable addTags, |
351 Map<BooleanSelector, Configuration> tags, | 378 Map<BooleanSelector, Configuration> tags, |
(...skipping 26 matching lines...) Expand all Loading... |
378 excludeTags = excludeTags ?? BooleanSelector.none, | 405 excludeTags = excludeTags ?? BooleanSelector.none, |
379 addTags = new UnmodifiableSetView(addTags?.toSet() ?? new Set()), | 406 addTags = new UnmodifiableSetView(addTags?.toSet() ?? new Set()), |
380 tags = _map(tags), | 407 tags = _map(tags), |
381 onPlatform = _map(onPlatform), | 408 onPlatform = _map(onPlatform), |
382 presets = _map(presets) { | 409 presets = _map(presets) { |
383 if (_filename != null && _filename.context.style != p.style) { | 410 if (_filename != null && _filename.context.style != p.style) { |
384 throw new ArgumentError( | 411 throw new ArgumentError( |
385 "filename's context must match the current operating system, was " | 412 "filename's context must match the current operating system, was " |
386 "${_filename.context.style}."); | 413 "${_filename.context.style}."); |
387 } | 414 } |
| 415 |
| 416 if ((shardIndex == null) != (totalShards == null)) { |
| 417 throw new ArgumentError( |
| 418 "shardIndex and totalShards may only be passed together."); |
| 419 } else if (shardIndex != null) { |
| 420 RangeError.checkValueInInterval( |
| 421 shardIndex, 0, totalShards - 1, "shardIndex"); |
| 422 } |
388 } | 423 } |
389 | 424 |
390 /// Returns a [input] as an unmodifiable list or `null`. | 425 /// Returns a [input] as an unmodifiable list or `null`. |
391 /// | 426 /// |
392 /// If [input] is `null` or empty, this returns `null`. Otherwise, it returns | 427 /// If [input] is `null` or empty, this returns `null`. Otherwise, it returns |
393 /// `input.toList()`. | 428 /// `input.toList()`. |
394 static List _list(Iterable input) { | 429 static List _list(Iterable input) { |
395 if (input == null) return null; | 430 if (input == null) return null; |
396 input = new List.unmodifiable(input); | 431 input = new List.unmodifiable(input); |
397 if (input.isEmpty) return null; | 432 if (input.isEmpty) return null; |
(...skipping 22 matching lines...) Expand all Loading... |
420 jsTrace: other._jsTrace ?? _jsTrace, | 455 jsTrace: other._jsTrace ?? _jsTrace, |
421 skip: other._skip ?? _skip, | 456 skip: other._skip ?? _skip, |
422 skipReason: other.skipReason ?? skipReason, | 457 skipReason: other.skipReason ?? skipReason, |
423 testOn: testOn.intersection(other.testOn), | 458 testOn: testOn.intersection(other.testOn), |
424 pauseAfterLoad: other._pauseAfterLoad ?? _pauseAfterLoad, | 459 pauseAfterLoad: other._pauseAfterLoad ?? _pauseAfterLoad, |
425 color: other._color ?? _color, | 460 color: other._color ?? _color, |
426 packageRoot: other._packageRoot ?? _packageRoot, | 461 packageRoot: other._packageRoot ?? _packageRoot, |
427 reporter: other._reporter ?? _reporter, | 462 reporter: other._reporter ?? _reporter, |
428 pubServePort: (other.pubServeUrl ?? pubServeUrl)?.port, | 463 pubServePort: (other.pubServeUrl ?? pubServeUrl)?.port, |
429 concurrency: other._concurrency ?? _concurrency, | 464 concurrency: other._concurrency ?? _concurrency, |
| 465 shardIndex: other.shardIndex ?? shardIndex, |
| 466 totalShards: other.totalShards ?? totalShards, |
430 timeout: timeout.merge(other.timeout), | 467 timeout: timeout.merge(other.timeout), |
431 patterns: patterns.union(other.patterns), | 468 patterns: patterns.union(other.patterns), |
432 platforms: other._platforms ?? _platforms, | 469 platforms: other._platforms ?? _platforms, |
433 paths: other._paths ?? _paths, | 470 paths: other._paths ?? _paths, |
434 filename: other._filename ?? _filename, | 471 filename: other._filename ?? _filename, |
435 chosenPresets: chosenPresets.union(other.chosenPresets), | 472 chosenPresets: chosenPresets.union(other.chosenPresets), |
436 includeTags: includeTags.intersection(other.includeTags), | 473 includeTags: includeTags.intersection(other.includeTags), |
437 excludeTags: excludeTags.union(other.excludeTags), | 474 excludeTags: excludeTags.union(other.excludeTags), |
438 addTags: other.addTags.union(addTags), | 475 addTags: other.addTags.union(addTags), |
439 tags: _mergeConfigMaps(tags, other.tags), | 476 tags: _mergeConfigMaps(tags, other.tags), |
(...skipping 17 matching lines...) Expand all Loading... |
457 bool jsTrace, | 494 bool jsTrace, |
458 bool skip, | 495 bool skip, |
459 String skipReason, | 496 String skipReason, |
460 PlatformSelector testOn, | 497 PlatformSelector testOn, |
461 bool pauseAfterLoad, | 498 bool pauseAfterLoad, |
462 bool color, | 499 bool color, |
463 String packageRoot, | 500 String packageRoot, |
464 String reporter, | 501 String reporter, |
465 int pubServePort, | 502 int pubServePort, |
466 int concurrency, | 503 int concurrency, |
| 504 int shardIndex, |
| 505 int totalShards, |
467 Timeout timeout, | 506 Timeout timeout, |
468 Iterable<Pattern> patterns, | 507 Iterable<Pattern> patterns, |
469 Iterable<TestPlatform> platforms, | 508 Iterable<TestPlatform> platforms, |
470 Iterable<String> paths, | 509 Iterable<String> paths, |
471 Glob filename, | 510 Glob filename, |
472 Iterable<String> chosenPresets, | 511 Iterable<String> chosenPresets, |
473 BooleanSelector includeTags, | 512 BooleanSelector includeTags, |
474 BooleanSelector excludeTags, | 513 BooleanSelector excludeTags, |
475 Iterable addTags, | 514 Iterable addTags, |
476 Map<BooleanSelector, Configuration> tags, | 515 Map<BooleanSelector, Configuration> tags, |
477 Map<PlatformSelector, Configuration> onPlatform, | 516 Map<PlatformSelector, Configuration> onPlatform, |
478 Map<String, Configuration> presets}) { | 517 Map<String, Configuration> presets}) { |
479 return new Configuration( | 518 return new Configuration( |
480 help: help ?? _help, | 519 help: help ?? _help, |
481 version: version ?? _version, | 520 version: version ?? _version, |
482 verboseTrace: verboseTrace ?? _verboseTrace, | 521 verboseTrace: verboseTrace ?? _verboseTrace, |
483 jsTrace: jsTrace ?? _jsTrace, | 522 jsTrace: jsTrace ?? _jsTrace, |
484 skip: skip ?? _skip, | 523 skip: skip ?? _skip, |
485 skipReason: skipReason ?? this.skipReason, | 524 skipReason: skipReason ?? this.skipReason, |
486 testOn: testOn ?? this.testOn, | 525 testOn: testOn ?? this.testOn, |
487 pauseAfterLoad: pauseAfterLoad ?? _pauseAfterLoad, | 526 pauseAfterLoad: pauseAfterLoad ?? _pauseAfterLoad, |
488 color: color ?? _color, | 527 color: color ?? _color, |
489 packageRoot: packageRoot ?? _packageRoot, | 528 packageRoot: packageRoot ?? _packageRoot, |
490 reporter: reporter ?? _reporter, | 529 reporter: reporter ?? _reporter, |
491 pubServePort: pubServePort ?? pubServeUrl?.port, | 530 pubServePort: pubServePort ?? pubServeUrl?.port, |
492 concurrency: concurrency ?? _concurrency, | 531 concurrency: concurrency ?? _concurrency, |
| 532 shardIndex: shardIndex ?? this.shardIndex, |
| 533 totalShards: totalShards ?? this.totalShards, |
493 timeout: timeout ?? this.timeout, | 534 timeout: timeout ?? this.timeout, |
494 patterns: patterns ?? this.patterns, | 535 patterns: patterns ?? this.patterns, |
495 platforms: platforms ?? _platforms, | 536 platforms: platforms ?? _platforms, |
496 paths: paths ?? _paths, | 537 paths: paths ?? _paths, |
497 filename: filename ?? _filename, | 538 filename: filename ?? _filename, |
498 chosenPresets: chosenPresets ?? this.chosenPresets, | 539 chosenPresets: chosenPresets ?? this.chosenPresets, |
499 includeTags: includeTags ?? this.includeTags, | 540 includeTags: includeTags ?? this.includeTags, |
500 excludeTags: excludeTags ?? this.excludeTags, | 541 excludeTags: excludeTags ?? this.excludeTags, |
501 addTags: addTags ?? this.addTags, | 542 addTags: addTags ?? this.addTags, |
502 tags: tags ?? this.tags, | 543 tags: tags ?? this.tags, |
503 onPlatform: onPlatform ?? this.onPlatform, | 544 onPlatform: onPlatform ?? this.onPlatform, |
504 presets: presets ?? this.presets); | 545 presets: presets ?? this.presets); |
505 } | 546 } |
506 | 547 |
507 /// Merges two maps whose values are [Configuration]s. | 548 /// Merges two maps whose values are [Configuration]s. |
508 /// | 549 /// |
509 /// Any overlapping keys in the maps have their configurations merged in the | 550 /// Any overlapping keys in the maps have their configurations merged in the |
510 /// returned map. | 551 /// returned map. |
511 Map<Object, Configuration> _mergeConfigMaps(Map<Object, Configuration> map1, | 552 Map<Object, Configuration> _mergeConfigMaps(Map<Object, Configuration> map1, |
512 Map<Object, Configuration> map2) => | 553 Map<Object, Configuration> map2) => |
513 mergeMaps(map1, map2, | 554 mergeMaps(map1, map2, |
514 value: (config1, config2) => config1.merge(config2)); | 555 value: (config1, config2) => config1.merge(config2)); |
515 } | 556 } |
OLD | NEW |