OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /// Test infrastructure for testing pub. Unlike typical unit tests, most pub | 5 /// Test infrastructure for testing pub. Unlike typical unit tests, most pub |
6 /// tests are integration tests that stage some stuff on the file system, run | 6 /// tests are integration tests that stage some stuff on the file system, run |
7 /// pub, and then validate the results. This library provides an API to build | 7 /// pub, and then validate the results. This library provides an API to build |
8 /// tests like that. | 8 /// tests like that. |
9 library test_pub; | 9 library test_pub; |
10 | 10 |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 return result; | 420 return result; |
421 }); | 421 }); |
422 } | 422 } |
423 | 423 |
424 /// Return the name for the package described by [description] and from | 424 /// Return the name for the package described by [description] and from |
425 /// [sourceName]. | 425 /// [sourceName]. |
426 String _packageName(String sourceName, description) { | 426 String _packageName(String sourceName, description) { |
427 switch (sourceName) { | 427 switch (sourceName) { |
428 case "git": | 428 case "git": |
429 var url = description is String ? description : description['url']; | 429 var url = description is String ? description : description['url']; |
430 return basename(url.replaceFirst(new RegExp(r"(\.git)?/?$"), "")); | 430 // TODO(rnystrom): Using path.basename on a URL is hacky. If we add URL |
| 431 // support to pkg/path, should use an explicit builder for that. |
| 432 return path.basename(url.replaceFirst(new RegExp(r"(\.git)?/?$"), "")); |
431 case "hosted": | 433 case "hosted": |
432 if (description is String) return description; | 434 if (description is String) return description; |
433 return description['name']; | 435 return description['name']; |
434 case "path": | 436 case "path": |
435 return basename(description); | 437 return path.basename(description); |
436 case "sdk": | 438 case "sdk": |
437 return description; | 439 return description; |
438 default: | 440 default: |
439 return description; | 441 return description; |
440 } | 442 } |
441 } | 443 } |
442 | 444 |
443 /// The full path to the created sandbox directory for an integration test. | 445 /// The full path to the created sandbox directory for an integration test. |
444 String get sandboxDir => _sandboxDir.path; | 446 String get sandboxDir => _sandboxDir; |
445 Directory _sandboxDir; | 447 String _sandboxDir; |
446 | 448 |
447 /// The path of the package cache directory used for tests. Relative to the | 449 /// The path of the package cache directory used for tests. Relative to the |
448 /// sandbox directory. | 450 /// sandbox directory. |
449 final String cachePath = "cache"; | 451 final String cachePath = "cache"; |
450 | 452 |
451 /// The path of the mock SDK directory used for tests. Relative to the sandbox | 453 /// The path of the mock SDK directory used for tests. Relative to the sandbox |
452 /// directory. | 454 /// directory. |
453 final String sdkPath = "sdk"; | 455 final String sdkPath = "sdk"; |
454 | 456 |
455 /// The path of the mock app directory used for tests. Relative to the sandbox | 457 /// The path of the mock app directory used for tests. Relative to the sandbox |
456 /// directory. | 458 /// directory. |
457 final String appPath = "myapp"; | 459 final String appPath = "myapp"; |
458 | 460 |
459 /// The path of the packages directory in the mock app used for tests. Relative | 461 /// The path of the packages directory in the mock app used for tests. Relative |
460 /// to the sandbox directory. | 462 /// to the sandbox directory. |
461 final String packagesPath = "$appPath/packages"; | 463 final String packagesPath = "$appPath/packages"; |
462 | 464 |
463 /// The type for callbacks that will be fired during [schedulePub]. Takes the | 465 /// The type for callbacks that will be fired during [schedulePub]. Takes the |
464 /// sandbox directory as a parameter. | 466 /// sandbox directory as a parameter. |
465 typedef Future _ScheduledEvent(Directory parentDir); | 467 typedef Future _ScheduledEvent(String parentDir); |
466 | 468 |
467 /// The list of events that are scheduled to run as part of the test case. | 469 /// The list of events that are scheduled to run as part of the test case. |
468 List<_ScheduledEvent> _scheduled; | 470 List<_ScheduledEvent> _scheduled; |
469 | 471 |
470 /// The list of events that are scheduled to run after the test case, even if | 472 /// The list of events that are scheduled to run after the test case, even if |
471 /// it failed. | 473 /// it failed. |
472 List<_ScheduledEvent> _scheduledCleanup; | 474 List<_ScheduledEvent> _scheduledCleanup; |
473 | 475 |
474 /// The list of events that are scheduled to run after the test case only if it | 476 /// The list of events that are scheduled to run after the test case only if it |
475 /// failed. | 477 /// failed. |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 // advance to the next test and run it. | 537 // advance to the next test and run it. |
536 registerException(e.error, e.stackTrace); | 538 registerException(e.error, e.stackTrace); |
537 }); | 539 }); |
538 }); | 540 }); |
539 } | 541 } |
540 | 542 |
541 /// Get the path to the root "util/test/pub" directory containing the pub | 543 /// Get the path to the root "util/test/pub" directory containing the pub |
542 /// tests. | 544 /// tests. |
543 String get testDirectory { | 545 String get testDirectory { |
544 var dir = new Options().script; | 546 var dir = new Options().script; |
545 while (basename(dir) != 'pub') dir = dirname(dir); | 547 while (path.basename(dir) != 'pub') dir = path.dirname(dir); |
546 | 548 |
547 return getFullPath(dir); | 549 return path.absolute(dir); |
548 } | 550 } |
549 | 551 |
550 /// Schedules renaming (moving) the directory at [from] to [to], both of which | 552 /// Schedules renaming (moving) the directory at [from] to [to], both of which |
551 /// are assumed to be relative to [sandboxDir]. | 553 /// are assumed to be relative to [sandboxDir]. |
552 void scheduleRename(String from, String to) { | 554 void scheduleRename(String from, String to) { |
553 _schedule((sandboxDir) { | 555 _schedule((sandboxDir) { |
554 return renameDir(join(sandboxDir, from), join(sandboxDir, to)); | 556 return renameDir(join(sandboxDir, from), join(sandboxDir, to)); |
555 }); | 557 }); |
556 } | 558 } |
557 | 559 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 expectLater(pub.nextLine(), equals("'-- pubspec.yaml")); | 624 expectLater(pub.nextLine(), equals("'-- pubspec.yaml")); |
623 expectLater(pub.nextLine(), equals("")); | 625 expectLater(pub.nextLine(), equals("")); |
624 | 626 |
625 pub.writeLine("y"); | 627 pub.writeLine("y"); |
626 } | 628 } |
627 | 629 |
628 /// Calls [fn] with appropriately modified arguments to run a pub process. [fn] | 630 /// Calls [fn] with appropriately modified arguments to run a pub process. [fn] |
629 /// should have the same signature as [startProcess], except that the returned | 631 /// should have the same signature as [startProcess], except that the returned |
630 /// [Future] may have a type other than [Process]. | 632 /// [Future] may have a type other than [Process]. |
631 Future _doPub(Function fn, sandboxDir, List args, Future<Uri> tokenEndpoint) { | 633 Future _doPub(Function fn, sandboxDir, List args, Future<Uri> tokenEndpoint) { |
632 String pathInSandbox(path) => join(getFullPath(sandboxDir), path); | 634 String pathInSandbox(String relPath) { |
| 635 return join(path.absolute(sandboxDir), relPath); |
| 636 } |
| 637 |
633 return defer(() { | 638 return defer(() { |
634 ensureDir(pathInSandbox(appPath)); | 639 ensureDir(pathInSandbox(appPath)); |
635 return Future.wait([ | 640 return Future.wait([ |
636 _awaitObject(args), | 641 _awaitObject(args), |
637 tokenEndpoint == null ? new Future.immediate(null) : tokenEndpoint | 642 tokenEndpoint == null ? new Future.immediate(null) : tokenEndpoint |
638 ]); | 643 ]); |
639 }).then((results) { | 644 }).then((results) { |
640 var args = results[0]; | 645 var args = results[0]; |
641 var tokenEndpoint = results[1]; | 646 var tokenEndpoint = results[1]; |
642 // Find a Dart executable we can use to spawn. Use the same one that was | 647 // Find a Dart executable we can use to spawn. Use the same one that was |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 /// directory. | 835 /// directory. |
831 // TODO(nweiz): Use implicit closurization once issue 2984 is fixed. | 836 // TODO(nweiz): Use implicit closurization once issue 2984 is fixed. |
832 void scheduleCreate() => _schedule((dir) => this.create(dir)); | 837 void scheduleCreate() => _schedule((dir) => this.create(dir)); |
833 | 838 |
834 /// Schedules the file or directory to be deleted recursively. | 839 /// Schedules the file or directory to be deleted recursively. |
835 void scheduleDelete() => _schedule((dir) => this.delete(dir)); | 840 void scheduleDelete() => _schedule((dir) => this.delete(dir)); |
836 | 841 |
837 /// Schedules the directory to be validated after Pub is run with | 842 /// Schedules the directory to be validated after Pub is run with |
838 /// [schedulePub]. The directory will be validated relative to the sandbox | 843 /// [schedulePub]. The directory will be validated relative to the sandbox |
839 /// directory. | 844 /// directory. |
840 void scheduleValidate() => _schedule((parentDir) => validate(parentDir.path)); | 845 void scheduleValidate() => _schedule((parentDir) => validate(parentDir)); |
841 | 846 |
842 /// Asserts that the name of the descriptor is a [String] and returns it. | 847 /// Asserts that the name of the descriptor is a [String] and returns it. |
843 String get _stringName { | 848 String get _stringName { |
844 if (name is String) return name; | 849 if (name is String) return name; |
845 throw 'Pattern $name must be a string.'; | 850 throw 'Pattern $name must be a string.'; |
846 } | 851 } |
847 | 852 |
848 /// Validates that at least one file in [dir] matching [name] is valid | 853 /// Validates that at least one file in [dir] matching [name] is valid |
849 /// according to [validate]. [validate] should throw or complete to an | 854 /// according to [validate]. [validate] should throw or complete to an |
850 /// exception if the input path is invalid. | 855 /// exception if the input path is invalid. |
(...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1623 /// calling [completion] is unnecessary. | 1628 /// calling [completion] is unnecessary. |
1624 void expectLater(Future actual, matcher, {String reason, | 1629 void expectLater(Future actual, matcher, {String reason, |
1625 FailureHandler failureHandler, bool verbose: false}) { | 1630 FailureHandler failureHandler, bool verbose: false}) { |
1626 _schedule((_) { | 1631 _schedule((_) { |
1627 return actual.then((value) { | 1632 return actual.then((value) { |
1628 expect(value, matcher, reason: reason, failureHandler: failureHandler, | 1633 expect(value, matcher, reason: reason, failureHandler: failureHandler, |
1629 verbose: false); | 1634 verbose: false); |
1630 }); | 1635 }); |
1631 }); | 1636 }); |
1632 } | 1637 } |
OLD | NEW |