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 /** | 5 /** |
6 * Test infrastructure for testing pub. Unlike typical unit tests, most pub | 6 * Test infrastructure for testing pub. Unlike typical unit tests, most pub |
7 * tests are integration tests that stage some stuff on the file system, run | 7 * tests are integration tests that stage some stuff on the file system, run |
8 * pub, and then validate the results. This library provides an API to build | 8 * pub, and then validate the results. This library provides an API to build |
9 * tests like that. | 9 * tests like that. |
10 */ | 10 */ |
11 library test_pub; | 11 library test_pub; |
12 | 12 |
13 import 'dart:io'; | 13 import 'dart:io'; |
14 import 'dart:isolate'; | 14 import 'dart:isolate'; |
15 import 'dart:json'; | 15 import 'dart:json'; |
16 import 'dart:math'; | 16 import 'dart:math'; |
17 import 'dart:uri'; | 17 import 'dart:uri'; |
18 | 18 |
19 import '../../../pkg/oauth2/lib/oauth2.dart' as oauth2; | 19 import '../../../pkg/oauth2/lib/oauth2.dart' as oauth2; |
20 import '../../../pkg/unittest/lib/unittest.dart'; | 20 import '../../../pkg/unittest/lib/unittest.dart'; |
21 import '../../lib/file_system.dart' as fs; | 21 import '../../lib/file_system.dart' as fs; |
22 import '../../pub/entrypoint.dart'; | 22 import '../../pub/entrypoint.dart'; |
23 import '../../pub/git_source.dart'; | 23 import '../../pub/git_source.dart'; |
24 import '../../pub/hosted_source.dart'; | 24 import '../../pub/hosted_source.dart'; |
25 import '../../pub/io.dart'; | 25 import '../../pub/io.dart'; |
| 26 import '../../pub/path.dart' as path; |
26 import '../../pub/sdk_source.dart'; | 27 import '../../pub/sdk_source.dart'; |
27 import '../../pub/system_cache.dart'; | 28 import '../../pub/system_cache.dart'; |
28 import '../../pub/utils.dart'; | 29 import '../../pub/utils.dart'; |
29 import '../../pub/validator.dart'; | 30 import '../../pub/validator.dart'; |
30 import '../../pub/yaml/yaml.dart'; | 31 import '../../pub/yaml/yaml.dart'; |
31 | 32 |
32 /** | 33 /** |
33 * Creates a new [FileDescriptor] with [name] and [contents]. | 34 * Creates a new [FileDescriptor] with [name] and [contents]. |
34 */ | 35 */ |
35 FileDescriptor file(Pattern name, String contents) => | 36 FileDescriptor file(Pattern name, String contents) => |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 | 521 |
521 final future = _setUpSandbox().chain((sandboxDir) { | 522 final future = _setUpSandbox().chain((sandboxDir) { |
522 createdSandboxDir = sandboxDir; | 523 createdSandboxDir = sandboxDir; |
523 return _runScheduled(sandboxDir, _scheduled); | 524 return _runScheduled(sandboxDir, _scheduled); |
524 }); | 525 }); |
525 | 526 |
526 future.handleException((error) { | 527 future.handleException((error) { |
527 // If an error occurs during testing, delete the sandbox, throw the error so | 528 // If an error occurs during testing, delete the sandbox, throw the error so |
528 // that the test framework sees it, then finally call asyncDone so that the | 529 // that the test framework sees it, then finally call asyncDone so that the |
529 // test framework knows we're done doing asynchronous stuff. | 530 // test framework knows we're done doing asynchronous stuff. |
530 var future = _runScheduled(createdSandboxDir, _scheduledOnException) | 531 var subFuture = _runScheduled(createdSandboxDir, _scheduledOnException) |
531 .chain((_) => cleanup()); | 532 .chain((_) => cleanup()); |
532 future.handleException((e) { | 533 subFuture.handleException((e) { |
533 print("Exception while cleaning up: $e"); | 534 print("Exception while cleaning up: $e"); |
534 print(future.stackTrace); | 535 print(subFuture.stackTrace); |
535 registerException(error, future.stackTrace); | 536 registerException(error, subFuture.stackTrace); |
536 return true; | 537 return true; |
537 }); | 538 }); |
538 future.then((_) => registerException(error, future.stackTrace)); | 539 subFuture.then((_) => registerException(error, future.stackTrace)); |
539 return true; | 540 return true; |
540 }); | 541 }); |
541 | 542 |
542 future.chain((_) => cleanup()).then((_) { | 543 future.chain((_) => cleanup()).then((_) { |
543 asyncDone(); | 544 asyncDone(); |
544 }); | 545 }); |
545 } | 546 } |
546 | 547 |
547 /// Get the path to the root "util/test/pub" directory containing the pub tests. | 548 /// Get the path to the root "util/test/pub" directory containing the pub tests. |
548 String get testDirectory { | 549 String get testDirectory { |
549 var dir = new Path.fromNative(new Options().script); | 550 var dir = new Options().script; |
550 while (dir.filename != 'pub') dir = dir.directoryPath; | 551 while (basename(dir) != 'pub') dir = dirname(dir); |
551 | 552 |
552 return new File(dir.toNativePath()).fullPathSync(); | 553 return getFullPath(dir); |
553 } | 554 } |
554 | 555 |
555 /** | 556 /** |
556 * Schedules a call to the Pub command-line utility. Runs Pub with [args] and | 557 * Schedules a call to the Pub command-line utility. Runs Pub with [args] and |
557 * validates that its results match [output], [error], and [exitCode]. | 558 * validates that its results match [output], [error], and [exitCode]. |
558 */ | 559 */ |
559 void schedulePub({List<String> args, Pattern output, Pattern error, | 560 void schedulePub({List<String> args, Pattern output, Pattern error, |
560 Future<Uri> tokenEndpoint, int exitCode: 0}) { | 561 Future<Uri> tokenEndpoint, int exitCode: 0}) { |
561 _schedule((sandboxDir) { | 562 _schedule((sandboxDir) { |
562 return _doPub(runProcess, sandboxDir, args, tokenEndpoint) | 563 return _doPub(runProcess, sandboxDir, args, tokenEndpoint) |
(...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1631 /// calling [completion] is unnecessary. | 1632 /// calling [completion] is unnecessary. |
1632 void expectLater(Future actual, matcher, {String reason, | 1633 void expectLater(Future actual, matcher, {String reason, |
1633 FailureHandler failureHandler, bool verbose: false}) { | 1634 FailureHandler failureHandler, bool verbose: false}) { |
1634 _schedule((_) { | 1635 _schedule((_) { |
1635 return actual.transform((value) { | 1636 return actual.transform((value) { |
1636 expect(value, matcher, reason: reason, failureHandler: failureHandler, | 1637 expect(value, matcher, reason: reason, failureHandler: failureHandler, |
1637 verbose: false); | 1638 verbose: false); |
1638 }); | 1639 }); |
1639 }); | 1640 }); |
1640 } | 1641 } |
OLD | NEW |