| 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 |
| 11 import 'dart:async'; | 11 import 'dart:async'; |
| 12 import 'dart:collection' show Queue; | 12 import 'dart:collection' show Queue; |
| 13 import 'dart:io'; | 13 import 'dart:io'; |
| 14 import 'dart:json' as json; | 14 import 'dart:json' as json; |
| 15 import 'dart:math'; | 15 import 'dart:math'; |
| 16 import 'dart:uri'; | 16 import 'dart:uri'; |
| 17 | 17 |
| 18 import '../../../pkg/oauth2/lib/oauth2.dart' as oauth2; | 18 import '../../../pkg/oauth2/lib/oauth2.dart' as oauth2; |
| 19 import '../../../pkg/path/lib/path.dart' as path; | 19 import '../../../pkg/path/lib/path.dart' as path; |
| 20 import '../../../pkg/unittest/lib/unittest.dart'; | 20 import '../../../pkg/unittest/lib/unittest.dart'; |
| 21 import '../../../pkg/http/lib/testing.dart'; | 21 import '../../../pkg/http/lib/testing.dart'; |
| 22 import '../../lib/file_system.dart' as fs; | 22 import '../../lib/file_system.dart' as fs; |
| 23 import '../../pub/entrypoint.dart'; | 23 import '../../pub/entrypoint.dart'; |
| 24 // TODO(rnystrom): Using "gitlib" as the prefix here is ugly, but "git" collides |
| 25 // with the git descriptor method. Maybe we should try to clean up the top level |
| 26 // scope a bit? |
| 27 import '../../pub/git.dart' as gitlib; |
| 24 import '../../pub/git_source.dart'; | 28 import '../../pub/git_source.dart'; |
| 25 import '../../pub/hosted_source.dart'; | 29 import '../../pub/hosted_source.dart'; |
| 26 import '../../pub/http.dart'; | 30 import '../../pub/http.dart'; |
| 27 import '../../pub/io.dart'; | 31 import '../../pub/io.dart'; |
| 28 import '../../pub/sdk_source.dart'; | 32 import '../../pub/sdk_source.dart'; |
| 29 import '../../pub/system_cache.dart'; | 33 import '../../pub/system_cache.dart'; |
| 30 import '../../pub/utils.dart'; | 34 import '../../pub/utils.dart'; |
| 31 import '../../pub/validator.dart'; | 35 import '../../pub/validator.dart'; |
| 32 import '../../pub/yaml/yaml.dart'; | 36 import '../../pub/yaml/yaml.dart'; |
| 33 import 'command_line_config.dart'; | 37 import 'command_line_config.dart'; |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 void _run() { | 472 void _run() { |
| 469 var createdSandboxDir; | 473 var createdSandboxDir; |
| 470 var asyncDone = expectAsync0(() {}); | 474 var asyncDone = expectAsync0(() {}); |
| 471 | 475 |
| 472 Future cleanup() { | 476 Future cleanup() { |
| 473 return _runScheduled(createdSandboxDir, _scheduledCleanup).then((_) { | 477 return _runScheduled(createdSandboxDir, _scheduledCleanup).then((_) { |
| 474 _scheduled = null; | 478 _scheduled = null; |
| 475 _scheduledCleanup = null; | 479 _scheduledCleanup = null; |
| 476 _scheduledOnException = null; | 480 _scheduledOnException = null; |
| 477 if (createdSandboxDir != null) return deleteDir(createdSandboxDir); | 481 if (createdSandboxDir != null) return deleteDir(createdSandboxDir); |
| 478 return new Future.immediate(null); | |
| 479 }); | 482 }); |
| 480 } | 483 } |
| 481 | 484 |
| 482 timeout(_setUpSandbox().then((sandboxDir) { | 485 timeout(_setUpSandbox().then((sandboxDir) { |
| 483 createdSandboxDir = sandboxDir; | 486 createdSandboxDir = sandboxDir; |
| 484 return _runScheduled(sandboxDir, _scheduled); | 487 return _runScheduled(sandboxDir, _scheduled); |
| 485 }).catchError((e) { | 488 }).catchError((e) { |
| 486 // If an error occurs during testing, delete the sandbox, throw the error so | 489 // If an error occurs during testing, delete the sandbox, throw the error so |
| 487 // that the test framework sees it, then finally call asyncDone so that the | 490 // that the test framework sees it, then finally call asyncDone so that the |
| 488 // test framework knows we're done doing asynchronous stuff. | 491 // test framework knows we're done doing asynchronous stuff. |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 } | 634 } |
| 632 | 635 |
| 633 /// Skips the current test if Git is not installed. This validates that the | 636 /// Skips the current test if Git is not installed. This validates that the |
| 634 /// current test is running on a buildbot in which case we expect git to be | 637 /// current test is running on a buildbot in which case we expect git to be |
| 635 /// installed. If we are not running on the buildbot, we will instead see if | 638 /// installed. If we are not running on the buildbot, we will instead see if |
| 636 /// git is installed and skip the test if not. This way, users don't need to | 639 /// git is installed and skip the test if not. This way, users don't need to |
| 637 /// have git installed to run the tests locally (unless they actually care | 640 /// have git installed to run the tests locally (unless they actually care |
| 638 /// about the pub git tests). | 641 /// about the pub git tests). |
| 639 void ensureGit() { | 642 void ensureGit() { |
| 640 _schedule((_) { | 643 _schedule((_) { |
| 641 return isGitInstalled.then((installed) { | 644 return gitlib.isInstalled.then((installed) { |
| 642 if (!installed && | 645 if (!installed && |
| 643 !Platform.environment.containsKey('BUILDBOT_BUILDERNAME')) { | 646 !Platform.environment.containsKey('BUILDBOT_BUILDERNAME')) { |
| 644 _abortScheduled = true; | 647 _abortScheduled = true; |
| 645 } | 648 } |
| 646 return null; | 649 return null; |
| 647 }); | 650 }); |
| 648 }); | 651 }); |
| 649 } | 652 } |
| 650 | 653 |
| 651 /// Use [client] as the mock HTTP client for this test. | 654 /// Use [client] as the mock HTTP client for this test. |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 Future<String> _runGit(List<String> args, Directory workingDir) { | 1061 Future<String> _runGit(List<String> args, Directory workingDir) { |
| 1059 // Explicitly specify the committer information. Git needs this to commit | 1062 // Explicitly specify the committer information. Git needs this to commit |
| 1060 // and we don't want to rely on the buildbots having this already set up. | 1063 // and we don't want to rely on the buildbots having this already set up. |
| 1061 var environment = { | 1064 var environment = { |
| 1062 'GIT_AUTHOR_NAME': 'Pub Test', | 1065 'GIT_AUTHOR_NAME': 'Pub Test', |
| 1063 'GIT_AUTHOR_EMAIL': 'pub@dartlang.org', | 1066 'GIT_AUTHOR_EMAIL': 'pub@dartlang.org', |
| 1064 'GIT_COMMITTER_NAME': 'Pub Test', | 1067 'GIT_COMMITTER_NAME': 'Pub Test', |
| 1065 'GIT_COMMITTER_EMAIL': 'pub@dartlang.org' | 1068 'GIT_COMMITTER_EMAIL': 'pub@dartlang.org' |
| 1066 }; | 1069 }; |
| 1067 | 1070 |
| 1068 return runGit(args, workingDir: workingDir.path, | 1071 return gitlib.run(args, workingDir: workingDir.path, |
| 1069 environment: environment).then((result) { | 1072 environment: environment); |
| 1070 if (!result.success) { | |
| 1071 throw "Error running: git ${Strings.join(args, ' ')}\n" | |
| 1072 "${Strings.join(result.stderr, '\n')}"; | |
| 1073 } | |
| 1074 | |
| 1075 return result.stdout; | |
| 1076 }); | |
| 1077 } | 1073 } |
| 1078 } | 1074 } |
| 1079 | 1075 |
| 1080 /// Describes a gzipped tar file and its contents. | 1076 /// Describes a gzipped tar file and its contents. |
| 1081 class TarFileDescriptor extends Descriptor { | 1077 class TarFileDescriptor extends Descriptor { |
| 1082 final List<Descriptor> contents; | 1078 final List<Descriptor> contents; |
| 1083 | 1079 |
| 1084 TarFileDescriptor(Pattern name, this.contents) | 1080 TarFileDescriptor(Pattern name, this.contents) |
| 1085 : super(name); | 1081 : super(name); |
| 1086 | 1082 |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1557 /// calling [completion] is unnecessary. | 1553 /// calling [completion] is unnecessary. |
| 1558 void expectLater(Future actual, matcher, {String reason, | 1554 void expectLater(Future actual, matcher, {String reason, |
| 1559 FailureHandler failureHandler, bool verbose: false}) { | 1555 FailureHandler failureHandler, bool verbose: false}) { |
| 1560 _schedule((_) { | 1556 _schedule((_) { |
| 1561 return actual.then((value) { | 1557 return actual.then((value) { |
| 1562 expect(value, matcher, reason: reason, failureHandler: failureHandler, | 1558 expect(value, matcher, reason: reason, failureHandler: failureHandler, |
| 1563 verbose: false); | 1559 verbose: false); |
| 1564 }); | 1560 }); |
| 1565 }); | 1561 }); |
| 1566 } | 1562 } |
| OLD | NEW |