Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(631)

Unified Diff: utils/tests/pub/test_pub.dart

Issue 10790021: Allow the Git source to depend on a specific revision. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « utils/tests/pub/pub_test.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: utils/tests/pub/test_pub.dart
diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart
index 9990308ce4236b257def787d848619f9024a5fc4..e0ea168d7168948a65ca696be1ddb05f0b41a5b7 100644
--- a/utils/tests/pub/test_pub.dart
+++ b/utils/tests/pub/test_pub.dart
@@ -34,9 +34,15 @@ DirectoryDescriptor dir(Pattern name, [List<Descriptor> contents]) =>
new DirectoryDescriptor(name, contents);
/**
+ * Creates a new [FutureDescriptor] wrapping [future].
+ */
+FutureDescriptor async(Future<Descriptor> future) =>
+ new FutureDescriptor(future);
+
+/**
* Creates a new [GitRepoDescriptor] with [name] and [contents].
*/
-DirectoryDescriptor git(Pattern name, [List<Descriptor> contents]) =>
+GitRepoDescriptor git(Pattern name, [List<Descriptor> contents]) =>
new GitRepoDescriptor(name, contents);
/**
@@ -169,6 +175,11 @@ List<_ScheduledEvent> _scheduled;
List<_ScheduledEvent> _scheduledCleanup;
/**
+ * Set to true when the current batch of scheduled events should be aborted.
+ */
+bool _abortScheduled = false;
+
+/**
* Runs all the scheduled events for a test case. This should only be called
* once per test case.
*/
@@ -258,18 +269,23 @@ void runPub([List<String> args, Pattern output, Pattern error,
}
/**
- * Wraps a test that needs git in order to run. This validates that the test is
- * running on a builbot in which case we expect git to be installed. If we are
- * not running on the buildbot, we will instead see if git is installed and
- * skip the test if not. This way, users don't need to have git installed to
- * run the tests locally (unless they actually care about the pub git tests).
+ * Skips the current test if Git is not installed. This validates that the
+ * current test is running on a buildbot in which case we expect git to be
+ * installed. If we are not running on the buildbot, we will instead see if git
+ * is installed and skip the test if not. This way, users don't need to have git
+ * installed to run the tests locally (unless they actually care about the pub
+ * git tests).
*/
-void withGit(void callback()) {
- isGitInstalled.then(expectAsync1((installed) {
- if (installed || Platform.environment.containsKey('BUILDBOT_BUILDERNAME')) {
- callback();
- }
- }));
+void ensureGit() {
+ _schedule((_) {
+ return isGitInstalled.transform((installed) {
+ if (!installed &&
+ !Platform.environment.containsKey('BUILDBOT_BUILDERNAME')) {
+ _abortScheduled = true;
+ }
+ return null;
+ });
+ });
}
Future<Directory> _setUpSandbox() {
@@ -281,7 +297,8 @@ Future _runScheduled(Directory parentDir, List<_ScheduledEvent> scheduled) {
var iterator = scheduled.iterator();
Future runNextEvent([_]) {
- if (!iterator.hasNext()) {
+ if (_abortScheduled || !iterator.hasNext()) {
+ _abortScheduled = false;
scheduled.clear();
return new Future.immediate(null);
}
@@ -602,6 +619,30 @@ class DirectoryDescriptor extends Descriptor {
}
/**
+ * Wraps a [Future] that will complete to a [Descriptor] and makes it behave
+ * like a concrete [Descriptor]. This is necessary when the contents of the
+ * descriptor depends on information that's not available until part of the test
+ * run is completed.
+ */
+class FutureDescriptor extends Descriptor {
+ Future<Descriptor> _future;
+
+ FutureDescriptor(this._future) : super('<unknown>');
+
+ Future create(dir) => _future.chain((desc) => desc.create(dir));
+
+ Future validate(dir) => _future.chain((desc) => desc.validate(dir));
+
+ Future delete(dir) => _future.chain((desc) => desc.delete(dir));
+
+ InputStream load(List<String> path) {
+ var resultStream = new ListInputStream();
+ _future.then((desc) => pipeInputToInput(desc.load(path), resultStream));
+ return resultStream;
+ }
+}
+
+/**
* Describes a Git repository and its contents.
*/
class GitRepoDescriptor extends DirectoryDescriptor {
@@ -641,11 +682,30 @@ class GitRepoDescriptor extends DirectoryDescriptor {
*/
void scheduleCommit() => _schedule((dir) => this.commit(dir));
- Future _runGit(List<String> args, Directory workingDir) {
+ /**
+ * Return a Future that completes to the commit in the git repository referred
+ * to by [ref] at the current point in the scheduled test run.
+ */
+ Future<String> revParse(String ref) {
+ var completer = new Completer<String>();
+ // TODO(nweiz): inline this once issue 3197 is fixed
+ var superCreate = super.create;
+ _schedule((parentDir) {
+ return superCreate(parentDir).chain((rootDir) {
+ return _runGit(['rev-parse', ref], rootDir);
+ }).transform((output) {
+ completer.complete(output[0]);
+ return null;
+ });
+ });
+ return completer.future;
+ }
+
+ Future<String> _runGit(List<String> args, Directory workingDir) {
return runProcess('git', args, workingDir: workingDir.path).
transform((result) {
if (!result.success) throw "Error running git: ${result.stderr}";
- return null;
+ return result.stdout;
});
}
}
« no previous file with comments | « utils/tests/pub/pub_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698