| Index: utils/tests/pub/test_pub.dart
|
| diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart
|
| index 3da8fce979477f6bba225cb4a4f00126c9d2e3d1..a6042fb87375e95ba61f5e085d59c99ecf013df4 100644
|
| --- a/utils/tests/pub/test_pub.dart
|
| +++ b/utils/tests/pub/test_pub.dart
|
| @@ -8,9 +8,9 @@
|
| /// tests like that.
|
| library test_pub;
|
|
|
| +import 'dart:async';
|
| import 'dart:io';
|
| -import 'dart:isolate';
|
| -import 'dart:json';
|
| +import 'dart:json' as json;
|
| import 'dart:math';
|
| import 'dart:uri';
|
|
|
| @@ -80,7 +80,7 @@ void serve([List<Descriptor> contents]) {
|
| var baseDir = dir("serve-dir", contents);
|
|
|
| _schedule((_) {
|
| - return _closeServer().transform((_) {
|
| + return _closeServer().then((_) {
|
| _server = new HttpServer();
|
| _server.defaultRequestHandler = (request, response) {
|
| var path = request.uri.replaceFirst("/", "").split("/");
|
| @@ -101,9 +101,7 @@ void serve([List<Descriptor> contents]) {
|
| response.contentLength = data.length;
|
| response.outputStream.write(data);
|
| response.outputStream.close();
|
| - });
|
| -
|
| - future.handleException((e) {
|
| + }).catchError((e) {
|
| print("Exception while handling ${request.uri}: $e");
|
| response.statusCode = 500;
|
| response.reasonPhrase = e.message;
|
| @@ -161,7 +159,7 @@ void servePackages(List<Map> pubspecs) {
|
| }
|
|
|
| _schedule((_) {
|
| - return _awaitObject(pubspecs).transform((resolvedPubspecs) {
|
| + return _awaitObject(pubspecs).then((resolvedPubspecs) {
|
| for (var spec in resolvedPubspecs) {
|
| var name = spec['name'];
|
| var version = spec['version'];
|
| @@ -172,12 +170,12 @@ void servePackages(List<Map> pubspecs) {
|
|
|
| _servedPackageDir.contents.clear();
|
| for (var name in _servedPackages.keys) {
|
| - var versions = _servedPackages[name].keys;
|
| + var versions = _servedPackages[name].keys.toList());
|
| _servedPackageDir.contents.addAll([
|
| file('$name.json',
|
| - JSON.stringify({'versions': versions})),
|
| + json.stringify({'versions': versions})),
|
| dir(name, [
|
| - dir('versions', flatten(versions.map((version) {
|
| + dir('versions', flatten(versions.mappedBy((version) {
|
| return [
|
| file('$version.yaml', _servedPackages[name][version]),
|
| tar('$version.tar.gz', [
|
| @@ -194,7 +192,7 @@ void servePackages(List<Map> pubspecs) {
|
| }
|
|
|
| /// Converts [value] into a YAML string.
|
| -String yaml(value) => JSON.stringify(value);
|
| +String yaml(value) => json.stringify(value);
|
|
|
| /// Describes a package that passes all validation.
|
| Descriptor get normalPackage => dir(appPath, [
|
| @@ -211,7 +209,7 @@ Descriptor get normalPackage => dir(appPath, [
|
| /// [contents] may contain [Future]s that resolve to serializable objects,
|
| /// which may in turn contain [Future]s recursively.
|
| Descriptor pubspec(Map contents) {
|
| - return async(_awaitObject(contents).transform((resolvedContents) =>
|
| + return async(_awaitObject(contents).then((resolvedContents) =>
|
| file("pubspec.yaml", yaml(resolvedContents))));
|
| }
|
|
|
| @@ -261,7 +259,7 @@ Map package(String name, String version, [List dependencies]) {
|
| /// Describes a map representing a dependency on a package in the package
|
| /// repository.
|
| Map dependency(String name, [String versionConstraint]) {
|
| - var url = port.transform((p) => "http://localhost:$p");
|
| + var url = port.then((p) => "http://localhost:$p");
|
| var dependency = {"hosted": {"name": name, "url": url}};
|
| if (versionConstraint != null) dependency["version"] = versionConstraint;
|
| return dependency;
|
| @@ -331,7 +329,7 @@ DirectoryDescriptor cacheDir(Map packages) {
|
| });
|
| return dir(cachePath, [
|
| dir('hosted', [
|
| - async(port.transform((p) => dir('localhost%58$p', contents)))
|
| + async(port.then((p) => dir('localhost%58$p', contents)))
|
| ])
|
| ]);
|
| }
|
| @@ -344,7 +342,7 @@ Descriptor credentialsFile(
|
| String accessToken,
|
| {String refreshToken,
|
| Date expiration}) {
|
| - return async(server.url.transform((url) {
|
| + return async(server.url.then((url) {
|
| return dir(cachePath, [
|
| file('credentials.json', new oauth2.Credentials(
|
| accessToken,
|
| @@ -364,10 +362,10 @@ DirectoryDescriptor appDir(List dependencies) =>
|
| /// Converts a list of dependencies as passed to [package] into a hash as used
|
| /// in a pubspec.
|
| Future<Map> _dependencyListToMap(List<Map> dependencies) {
|
| - return _awaitObject(dependencies).transform((resolvedDependencies) {
|
| + return _awaitObject(dependencies).then((resolvedDependencies) {
|
| var result = <String, Map>{};
|
| for (var dependency in resolvedDependencies) {
|
| - var keys = dependency.keys.filter((key) => key != "version");
|
| + var keys = dependency.keys.where((key) => key != "version");
|
| var sourceName = only(keys);
|
| var source;
|
| switch (sourceName) {
|
| @@ -453,7 +451,7 @@ void run() {
|
| var asyncDone = expectAsync0(() {});
|
|
|
| Future cleanup() {
|
| - return _runScheduled(createdSandboxDir, _scheduledCleanup).chain((_) {
|
| + return _runScheduled(createdSandboxDir, _scheduledCleanup).then((_) {
|
| _scheduled = null;
|
| _scheduledCleanup = null;
|
| _scheduledOnException = null;
|
| @@ -462,29 +460,25 @@ void run() {
|
| });
|
| }
|
|
|
| - final future = _setUpSandbox().chain((sandboxDir) {
|
| + final future = _setUpSandbox().then((sandboxDir) {
|
| createdSandboxDir = sandboxDir;
|
| return _runScheduled(sandboxDir, _scheduled);
|
| });
|
|
|
| - future.handleException((error) {
|
| + future.catchError((error) {
|
| // If an error occurs during testing, delete the sandbox, throw the error so
|
| // that the test framework sees it, then finally call asyncDone so that the
|
| // test framework knows we're done doing asynchronous stuff.
|
| var subFuture = _runScheduled(createdSandboxDir, _scheduledOnException)
|
| - .chain((_) => cleanup());
|
| - subFuture.handleException((e) {
|
| - print("Exception while cleaning up: $e");
|
| - print(subFuture.stackTrace);
|
| - registerException(error, subFuture.stackTrace);
|
| + .then((_) => cleanup());
|
| + subFuture.catchError((e) {
|
| + print("Exception while cleaning up: ${e.error}");
|
| + print(e.stackTrace);
|
| + registerException(e.error, e.stackTrace);
|
| return true;
|
| });
|
| - subFuture.then((_) => registerException(error, future.stackTrace));
|
| - return true;
|
| - });
|
| -
|
| timeout(future, _TIMEOUT, 'waiting for a test to complete')
|
| - .chain((_) => cleanup())
|
| + .then((_) => cleanup())
|
| .then((_) => asyncDone());
|
| }
|
|
|
| @@ -503,7 +497,7 @@ void schedulePub({List args, Pattern output, Pattern error,
|
| Future<Uri> tokenEndpoint, int exitCode: 0}) {
|
| _schedule((sandboxDir) {
|
| return _doPub(runProcess, sandboxDir, args, tokenEndpoint)
|
| - .transform((result) {
|
| + .then((result) {
|
| var failures = [];
|
|
|
| _validateOutput(failures, 'stdout', output, result.stdout);
|
| @@ -518,7 +512,7 @@ void schedulePub({List args, Pattern output, Pattern error,
|
| if (error == null) {
|
| // If we aren't validating the error, still show it on failure.
|
| failures.add('Pub stderr:');
|
| - failures.addAll(result.stderr.map((line) => '| $line'));
|
| + failures.addAll(result.stderr.mappedBy((line) => '| $line'));
|
| }
|
|
|
| throw new ExpectException(Strings.join(failures, '\n'));
|
| @@ -629,7 +623,7 @@ Future _doPub(Function fn, sandboxDir, List args, Future<Uri> tokenEndpoint) {
|
| /// about the pub git tests).
|
| void ensureGit() {
|
| _schedule((_) {
|
| - return isGitInstalled.transform((installed) {
|
| + return isGitInstalled.then((installed) {
|
| if (!installed &&
|
| !Platform.environment.containsKey('BUILDBOT_BUILDERNAME')) {
|
| _abortScheduled = true;
|
| @@ -655,18 +649,18 @@ Future<Directory> _setUpSandbox() => createTempDir();
|
|
|
| Future _runScheduled(Directory parentDir, List<_ScheduledEvent> scheduled) {
|
| if (scheduled == null) return new Future.immediate(null);
|
| - var iterator = scheduled.iterator();
|
| + var iterator = scheduled.iterator;
|
|
|
| Future runNextEvent(_) {
|
| - if (_abortScheduled || !iterator.hasNext) {
|
| + if (_abortScheduled || !iterator.moveNext()) {
|
| _abortScheduled = false;
|
| scheduled.clear();
|
| return new Future.immediate(null);
|
| }
|
|
|
| - var future = iterator.next()(parentDir);
|
| + var future = iterator.current(parentDir);
|
| if (future != null) {
|
| - return future.chain(runNextEvent);
|
| + return future.then(runNextEvent);
|
| } else {
|
| return runNextEvent(null);
|
| }
|
| @@ -699,7 +693,7 @@ void _validateOutputRegex(List<String> failures, String pipe,
|
| failures.add('Expected $pipe to match "${expected.pattern}" but got none.');
|
| } else {
|
| failures.add('Expected $pipe to match "${expected.pattern}" but got:');
|
| - failures.addAll(actual.map((line) => '| $line'));
|
| + failures.addAll(actual.mappedBy((line) => '| $line'));
|
| }
|
| }
|
|
|
| @@ -744,7 +738,7 @@ void _validateOutputString(List<String> failures, String pipe,
|
| // If any lines mismatched, show the expected and actual.
|
| if (failed) {
|
| failures.add('Expected $pipe:');
|
| - failures.addAll(expected.map((line) => '| $line'));
|
| + failures.addAll(expected.mappedBy((line) => '| $line'));
|
| failures.add('Got:');
|
| failures.addAll(results);
|
| }
|
| @@ -802,7 +796,7 @@ abstract class Descriptor {
|
| // Special-case strings to support multi-level names like "myapp/packages".
|
| if (name is String) {
|
| var path = join(dir, name);
|
| - return exists(path).chain((exists) {
|
| + return exists(path).then((exists) {
|
| if (!exists) Expect.fail('File $name in $dir not found.');
|
| return validate(path);
|
| });
|
| @@ -816,9 +810,9 @@ abstract class Descriptor {
|
| stackTrace = localStackTrace;
|
| }
|
|
|
| - return listDir(dir).chain((files) {
|
| - var matches = files.filter((file) => endsWithPattern(file, name));
|
| - if (matches.length == 0) {
|
| + return listDir(dir).then((files) {
|
| + var matches = files.where((file) => endsWithPattern(file, name)).toList();
|
| + if (matches.isEmpty) {
|
| Expect.fail('No files in $dir match pattern $name.');
|
| }
|
| if (matches.length == 1) return validate(matches[0]);
|
| @@ -845,16 +839,15 @@ abstract class Descriptor {
|
| for (var match in matches) {
|
| var future = validate(match);
|
|
|
| - future.handleException((e) {
|
| + future.catchError((e) {
|
| failures.add(e);
|
| checkComplete();
|
| - return true;
|
| });
|
|
|
| future.then((_) {
|
| successes++;
|
| checkComplete();
|
| - });
|
| + }).catchError(() {});
|
| }
|
| return completer.future;
|
| });
|
| @@ -885,7 +878,7 @@ class FileDescriptor extends Descriptor {
|
| /// Validates that this file correctly matches the actual file at [path].
|
| Future validate(String path) {
|
| return _validateOneMatch(path, (file) {
|
| - return readTextFile(file).transform((text) {
|
| + return readTextFile(file).then((text) {
|
| if (text == contents) return null;
|
|
|
| Expect.fail('File $file should contain:\n\n$contents\n\n'
|
| @@ -923,13 +916,14 @@ class DirectoryDescriptor extends Descriptor {
|
| /// the creation is done.
|
| Future<Directory> create(parentDir) {
|
| // Create the directory.
|
| - return ensureDir(join(parentDir, _stringName)).chain((dir) {
|
| + return ensureDir(join(parentDir, _stringName)).then((dir) {
|
| if (contents == null) return new Future<Directory>.immediate(dir);
|
|
|
| // Recursively create all of its children.
|
| - final childFutures = contents.map((child) => child.create(dir));
|
| + final childFutures =
|
| + contents.mappedBy((child) => child.create(dir)).toList();
|
| // Only complete once all of the children have been created too.
|
| - return Futures.wait(childFutures).transform((_) => dir);
|
| + return Futures.wait(childFutures).then((_) => dir);
|
| });
|
| }
|
|
|
| @@ -946,10 +940,11 @@ class DirectoryDescriptor extends Descriptor {
|
| Future validate(String path) {
|
| return _validateOneMatch(path, (dir) {
|
| // Validate each of the items in this directory.
|
| - final entryFutures = contents.map((entry) => entry.validate(dir));
|
| + final entryFutures =
|
| + contents.mappedBy((entry) => entry.validate(dir)).toList();
|
|
|
| // If they are all valid, the directory is valid.
|
| - return Futures.wait(entryFutures).transform((entries) => null);
|
| + return Futures.wait(entryFutures).then((entries) => null);
|
| });
|
| }
|
|
|
| @@ -978,11 +973,11 @@ class FutureDescriptor extends Descriptor {
|
|
|
| FutureDescriptor(this._future) : super('<unknown>');
|
|
|
| - Future create(dir) => _future.chain((desc) => desc.create(dir));
|
| + Future create(dir) => _future.then((desc) => desc.create(dir));
|
|
|
| - Future validate(dir) => _future.chain((desc) => desc.validate(dir));
|
| + Future validate(dir) => _future.then((desc) => desc.validate(dir));
|
|
|
| - Future delete(dir) => _future.chain((desc) => desc.delete(dir));
|
| + Future delete(dir) => _future.then((desc) => desc.delete(dir));
|
|
|
| InputStream load(List<String> path) {
|
| var resultStream = new ListInputStream();
|
| @@ -1020,9 +1015,9 @@ class GitRepoDescriptor extends DirectoryDescriptor {
|
| /// referred to by [ref] at the current point in the scheduled test run.
|
| Future<String> revParse(String ref) {
|
| return _scheduleValue((parentDir) {
|
| - return super.create(parentDir).chain((rootDir) {
|
| + return super.create(parentDir).then((rootDir) {
|
| return _runGit(['rev-parse', ref], rootDir);
|
| - }).transform((output) => output[0]);
|
| + }).then((output) => output[0]);
|
| });
|
| }
|
|
|
| @@ -1040,10 +1035,10 @@ class GitRepoDescriptor extends DirectoryDescriptor {
|
| Future runGitStep(_) {
|
| if (commands.isEmpty) return new Future.immediate(workingDir);
|
| var command = commands.removeAt(0);
|
| - return _runGit(command, workingDir).chain(runGitStep);
|
| + return _runGit(command, workingDir).then(runGitStep);
|
| }
|
|
|
| - return super.create(parentDir).chain((rootDir) {
|
| + return super.create(parentDir).then((rootDir) {
|
| workingDir = rootDir;
|
| return runGitStep(null);
|
| });
|
| @@ -1060,7 +1055,7 @@ class GitRepoDescriptor extends DirectoryDescriptor {
|
| };
|
|
|
| return runGit(args, workingDir: workingDir.path,
|
| - environment: environment).transform((result) {
|
| + environment: environment).then((result) {
|
| if (!result.success) {
|
| throw "Error running: git ${Strings.join(args, ' ')}\n"
|
| "${Strings.join(result.stderr, '\n')}";
|
| @@ -1083,15 +1078,15 @@ class TarFileDescriptor extends Descriptor {
|
| Future<File> create(parentDir) {
|
| // TODO(rnystrom): Use withTempDir().
|
| var tempDir;
|
| - return createTempDir().chain((_tempDir) {
|
| + return createTempDir().then((_tempDir) {
|
| tempDir = _tempDir;
|
| - return Futures.wait(contents.map((child) => child.create(tempDir)));
|
| - }).chain((createdContents) {
|
| + return Futures.wait(contents.mappedBy((child) => child.create(tempDir)));
|
| + }).then((createdContents) {
|
| return consumeInputStream(createTarGz(createdContents, baseDir: tempDir));
|
| - }).chain((bytes) {
|
| + }).then((bytes) {
|
| return new File(join(parentDir, _stringName)).writeAsBytes(bytes);
|
| - }).chain((file) {
|
| - return deleteDir(tempDir).transform((_) => file);
|
| + }).then((file) {
|
| + return deleteDir(tempDir).then((_) => file);
|
| });
|
| }
|
|
|
| @@ -1116,7 +1111,7 @@ class TarFileDescriptor extends Descriptor {
|
| var tempDir;
|
| // TODO(rnystrom): Use withTempDir() here.
|
| // TODO(nweiz): propagate any errors to the return value. See issue 3657.
|
| - createTempDir().chain((_tempDir) {
|
| + createTempDir().then((_tempDir) {
|
| tempDir = _tempDir;
|
| return create(tempDir);
|
| }).then((tar) {
|
| @@ -1137,7 +1132,7 @@ class NothingDescriptor extends Descriptor {
|
| Future delete(dir) => new Future.immediate(null);
|
|
|
| Future validate(String dir) {
|
| - return exists(join(dir, name)).transform((exists) {
|
| + return exists(join(dir, name)).then((exists) {
|
| if (exists) Expect.fail('File $name in $dir should not exist.');
|
| });
|
| }
|
| @@ -1167,7 +1162,7 @@ Future<Pair<List<String>, List<String>>> schedulePackageValidation(
|
| return Entrypoint.load(join(sandboxDir, appPath), cache)
|
| .chain((entrypoint) {
|
| var validator = fn(entrypoint);
|
| - return validator.validate().transform((_) {
|
| + return validator.validate().then((_) {
|
| return new Pair(validator.errors, validator.warnings);
|
| });
|
| });
|
| @@ -1240,8 +1235,8 @@ class ScheduledProcess {
|
| /// Wraps a [Process] [Future] in a scheduled process.
|
| ScheduledProcess(this.name, Future<Process> process)
|
| : _process = process,
|
| - _stdout = process.transform((p) => new StringInputStream(p.stdout)),
|
| - _stderr = process.transform((p) => new StringInputStream(p.stderr)) {
|
| + _stdout = process.then((p) => new StringInputStream(p.stdout)),
|
| + _stderr = process.then((p) => new StringInputStream(p.stderr)) {
|
|
|
| _schedule((_) {
|
| if (!_endScheduled) {
|
| @@ -1249,7 +1244,7 @@ class ScheduledProcess {
|
| "or kill() called before the test is run.");
|
| }
|
|
|
| - return _process.transform((p) {
|
| + return _process.then((p) {
|
| p.onExit = (c) {
|
| if (_endExpected) {
|
| _exitCodeCompleter.complete(c);
|
| @@ -1343,7 +1338,7 @@ class ScheduledProcess {
|
|
|
| /// Writes [line] to the process as stdin.
|
| void writeLine(String line) {
|
| - _schedule((_) => _process.transform((p) => p.stdin.writeString('$line\n')));
|
| + _schedule((_) => _process.then((p) => p.stdin.writeString('$line\n')));
|
| }
|
|
|
| /// Kills the process, and waits until it's dead.
|
| @@ -1366,7 +1361,7 @@ class ScheduledProcess {
|
| _schedule((_) {
|
| _endExpected = true;
|
| return timeout(_exitCode, _SCHEDULE_TIMEOUT,
|
| - "waiting for process $name to exit").transform((exitCode) {
|
| + "waiting for process $name to exit").then((exitCode) {
|
| if (expectedExitCode != null) {
|
| expect(exitCode, equals(expectedExitCode));
|
| }
|
| @@ -1378,7 +1373,7 @@ class ScheduledProcess {
|
| /// Prints nothing if the straems are empty.
|
| Future _printStreams() {
|
| Future printStream(String streamName, StringInputStream stream) {
|
| - return consumeStringInputStream(stream).transform((output) {
|
| + return consumeStringInputStream(stream).then((output) {
|
| if (output.isEmpty) return;
|
|
|
| print('\nProcess $name $streamName:');
|
| @@ -1424,11 +1419,11 @@ class ScheduledServer {
|
| }
|
|
|
| /// The port on which the server is listening.
|
| - Future<int> get port => _server.transform((s) => s.port);
|
| + Future<int> get port => _server.then((s) => s.port);
|
|
|
| /// The base URL of the server, including its port.
|
| Future<Uri> get url =>
|
| - port.transform((p) => new Uri.fromString("http://localhost:$p"));
|
| + port.then((p) => new Uri.fromString("http://localhost:$p"));
|
|
|
| /// Assert that the next request has the given [method] and [path], and pass
|
| /// it to [handler] to handle. If [handler] returns a [Future], wait until
|
| @@ -1466,7 +1461,7 @@ class ScheduledServer {
|
| fail('Unexpected ${request.method} request to ${request.path}.');
|
| }
|
| return _handlers.removeFirst();
|
| - }).transform((handler) {
|
| + }).then((handler) {
|
| handler(request, response);
|
| }), _SCHEDULE_TIMEOUT, "waiting for a handler for ${request.method} "
|
| "${request.path}");
|
| @@ -1479,16 +1474,18 @@ class ScheduledServer {
|
| /// Completes with the fully resolved structure.
|
| Future _awaitObject(object) {
|
| // Unroll nested futures.
|
| - if (object is Future) return object.chain(_awaitObject);
|
| - if (object is Collection) return Futures.wait(object.map(_awaitObject));
|
| + if (object is Future) return object.then(_awaitObject);
|
| + if (object is Collection) {
|
| + return Futures.wait(object.mappedBy(_awaitObject).toList());
|
| + }
|
| if (object is! Map) return new Future.immediate(object);
|
|
|
| var pairs = <Future<Pair>>[];
|
| object.forEach((key, value) {
|
| pairs.add(_awaitObject(value)
|
| - .transform((resolved) => new Pair(key, resolved)));
|
| + .then((resolved) => new Pair(key, resolved)));
|
| });
|
| - return Futures.wait(pairs).transform((resolvedPairs) {
|
| + return Futures.wait(pairs).then((resolvedPairs) {
|
| var map = {};
|
| for (var pair in resolvedPairs) {
|
| map[pair.first] = pair.last;
|
| @@ -1537,7 +1534,7 @@ void _scheduleOnException(_ScheduledEvent event) {
|
| void expectLater(Future actual, matcher, {String reason,
|
| FailureHandler failureHandler, bool verbose: false}) {
|
| _schedule((_) {
|
| - return actual.transform((value) {
|
| + return actual.then((value) {
|
| expect(value, matcher, reason: reason, failureHandler: failureHandler,
|
| verbose: false);
|
| });
|
|
|