Chromium Code Reviews| Index: sdk/lib/_internal/pub/test/test_pub.dart |
| diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart |
| index 1f7d94ca492a4e34aa67915e3aef4a6cbaf2dc96..aaba6dc681bebdc5e7cf7e07ddb443293bb4ae77 100644 |
| --- a/sdk/lib/_internal/pub/test/test_pub.dart |
| +++ b/sdk/lib/_internal/pub/test/test_pub.dart |
| @@ -225,7 +225,11 @@ Map<String, List<Map>> _servedPackages; |
| /// If [replace] is false, subsequent calls to [servePackages] will add to the |
| /// set of packages that are being served. Previous packages will continue to be |
| /// served. Otherwise, the previous packages will no longer be served. |
| -void servePackages(List<Map> pubspecs, {bool replace: false}) { |
| +/// |
| +/// If [contents] is given, its contents are added to every served |
| +/// package. |
| +void servePackages(List<Map> pubspecs, {bool replace: false, |
| + Iterable<d.Descriptor> contents}) { |
| if (_servedPackages == null || _servedPackageDir == null) { |
| _servedPackages = <String, List<Map>>{}; |
| _servedApiPackageDir = d.dir('packages', []); |
| @@ -246,11 +250,11 @@ void servePackages(List<Map> pubspecs, {bool replace: false}) { |
| return awaitObject(pubspecs).then((resolvedPubspecs) { |
| if (replace) _servedPackages.clear(); |
| - for (var spec in resolvedPubspecs) { |
| - var name = spec['name']; |
| - var version = spec['version']; |
| + for (var pubspec in resolvedPubspecs) { |
| + var name = pubspec['name']; |
| + var version = pubspec['version']; |
| var versions = _servedPackages.putIfAbsent(name, () => []); |
| - versions.add(spec); |
| + versions.add(pubspec); |
| } |
| _servedApiPackageDir.contents.clear(); |
| @@ -273,10 +277,17 @@ void servePackages(List<Map> pubspecs, {bool replace: false}) { |
| _servedPackageDir.contents.add(d.dir(name, [ |
| d.dir('versions', _servedPackages[name].map((pubspec) { |
| var version = pubspec['version']; |
| - return d.tar('$version.tar.gz', [ |
| - d.file('pubspec.yaml', JSON.encode(pubspec)), |
| - d.libDir(name, '$name $version') |
| - ]); |
| + |
| + var archiveContents = [ |
| + d.file('pubspec.yaml', JSON.encode(pubspec)), |
| + d.libDir(name, '$name $version') |
| + ]; |
| + |
| + if (contents != null) { |
| + archiveContents.addAll(contents); |
| + } |
| + |
| + return d.tar('$version.tar.gz', archiveContents); |
| })) |
| ])); |
| } |
| @@ -377,6 +388,35 @@ void pubUpgrade({Iterable<String> args, output, error, warning, int exitCode}) { |
| warning: warning, exitCode: exitCode); |
| } |
| +/// Schedules starting the "pub [global] run" process and validates the |
| +/// expected startup output. |
| +/// |
| +/// If [global] is `true`, this invokes "pub global run", otherwise it does |
| +/// "pub run". |
| +/// |
| +/// if [transformers] is given, it should contain a list of transformer IDs |
| +/// (like "myapp/src/transformer") and this will validate that the output for |
| +/// loading those is shown. |
| +/// |
| +/// Returns the `pub run` process. |
| +ScheduledProcess pubRun({bool global: false, Iterable<String> args, |
| + Iterable<String> transformers}) { |
| + var pubArgs = global ? ["global", "run"] : ["run"]; |
| + pubArgs.addAll(args); |
| + var pub = startPub(args: pubArgs); |
| + |
| + // This isn't normally printed, but the pub test infrastructure runs pub in |
| + // verbose mode, which enables this. |
| + pub.stdout.expect(startsWith("Loading source assets")); |
| + |
| + if (transformers != null) { |
| + for (var transformer in transformers) { |
| + pub.stdout.expect(startsWith("Loading $transformer transformers")); |
|
nweiz
2014/07/02 00:12:03
Rather than requiring tests to pass in a list of t
Bob Nystrom
2014/07/02 18:00:53
Done.
|
| + } |
| + } |
| + return pub; |
| +} |
| + |
| /// Defines an integration test. |
| /// |
| /// The [body] should schedule a series of operations which will be run |
| @@ -670,6 +710,42 @@ void ensureGit() { |
| } |
| } |
| +/// Schedules activating a global package [package] without running |
| +/// "pub global activate". |
| +/// |
| +/// This is useful because global packages must be hosted, but the test hosted |
| +/// server doesn't serve barback. The other parameters here follow |
| +/// [createLockFile]. |
| +void makeGlobalPackage(String package, String version, |
| + Iterable<d.Descriptor> contents, {Iterable<String> pkg, |
| + Map<String, String> hosted}) { |
| + // Start the server so we know what port to use in the cache directory name. |
| + servePackages([]); |
| + |
| + // Create the package in the hosted cache. |
| + d.hostedCache([ |
| + d.dir("$package-$version", contents) |
| + ]).create(); |
| + |
| + var lockFile = _createLockFile(pkg: pkg, hosted: hosted); |
| + |
| + // Add the root package to the lockfile. |
| + var id = new PackageId(package, "hosted", new Version.parse(version), |
| + package); |
| + lockFile.packages[package] = id; |
| + |
| + // Write the lockfile to the global cache. |
| + var sources = new SourceRegistry(); |
| + sources.register(new HostedSource()); |
| + sources.register(new PathSource()); |
| + |
| + d.dir(cachePath, [ |
| + d.dir("global_packages", [ |
| + d.file("$package.lock", lockFile.serialize(null, sources)) |
| + ]) |
| + ]).create(); |
| +} |
| + |
| /// Creates a lock file for [package] without running `pub get`. |
| /// |
| /// [sandbox] is a list of path dependencies to be found in the sandbox |
| @@ -681,6 +757,27 @@ void ensureGit() { |
| /// hosted packages. |
| void createLockFile(String package, {Iterable<String> sandbox, |
| Iterable<String> pkg, Map<String, String> hosted}) { |
| + var lockFile = _createLockFile(sandbox: sandbox, pkg: pkg, hosted: hosted); |
| + |
| + var sources = new SourceRegistry(); |
| + sources.register(new HostedSource()); |
| + sources.register(new PathSource()); |
| + |
| + d.file(path.join(package, 'pubspec.lock'), |
| + lockFile.serialize(null, sources)).create(); |
| +} |
| + |
| +/// Creates a lock file for [package] without running `pub get`. |
| +/// |
| +/// [sandbox] is a list of path dependencies to be found in the sandbox |
| +/// directory. [pkg] is a list of packages in the Dart repo's "pkg" directory; |
| +/// each package listed here and all its dependencies will be linked to the |
| +/// version in the Dart repo. |
| +/// |
| +/// [hosted] is a list of package names to version strings for dependencies on |
| +/// hosted packages. |
| +LockFile _createLockFile({Iterable<String> sandbox, |
| +Iterable<String> pkg, Map<String, String> hosted}) { |
| var dependencies = {}; |
| if (sandbox != null) { |
| @@ -697,8 +794,8 @@ void createLockFile(String package, {Iterable<String> sandbox, |
| if (package == 'barback') { |
| if (_barbackDir == null) { |
| throw new StateError("createLockFile() can only create a lock file " |
| - "with a barback dependency within a withBarbackVersions() " |
| - "block."); |
| + "with a barback dependency within a withBarbackVersions() " |
| + "block."); |
|
nweiz
2014/07/02 00:12:03
Fix this indentation.
Bob Nystrom
2014/07/02 18:00:53
Done.
|
| } |
| packagePath = _barbackDir; |
| } else { |
| @@ -707,7 +804,7 @@ void createLockFile(String package, {Iterable<String> sandbox, |
| dependencies[package] = packagePath; |
| var pubspec = loadYaml( |
| - readTextFile(path.join(packagePath, 'pubspec.yaml'))); |
| + readTextFile(path.join(packagePath, 'pubspec.yaml'))); |
|
nweiz
2014/07/02 00:12:02
Also this indentation.
Bob Nystrom
2014/07/02 18:00:53
Done.
|
| var packageDeps = pubspec['dependencies']; |
| if (packageDeps == null) return; |
| packageDeps.keys.forEach(_addPackage); |
| @@ -732,12 +829,7 @@ void createLockFile(String package, {Iterable<String> sandbox, |
| }); |
| } |
| - var sources = new SourceRegistry(); |
| - sources.register(new HostedSource()); |
| - sources.register(new PathSource()); |
| - |
| - d.file(path.join(package, 'pubspec.lock'), |
| - lockFile.serialize(null, sources)).create(); |
| + return lockFile; |
| } |
| /// Uses [client] as the mock HTTP client for this test. |