diff --git a/test/cache/repair/handles_failure_test.dart b/test/cache/repair/handles_failure_test.dart index 0b556394c..fc412ae73 100644 --- a/test/cache/repair/handles_failure_test.dart +++ b/test/cache/repair/handles_failure_test.dart @@ -19,7 +19,7 @@ main() { // Set up a cache with some packages. d.dir(cachePath, [ d.dir('hosted', [ - d.async(port.then((p) => d.dir('localhost%58$p', [ + d.async(globalServer.port.then((p) => d.dir('localhost%58$p', [ d.dir("foo-1.2.3", [ d.libPubspec("foo", "1.2.3"), d.file("broken.txt") diff --git a/test/cache/repair/reinstalls_hosted_packages_test.dart b/test/cache/repair/reinstalls_hosted_packages_test.dart index 871c5df84..07c866823 100644 --- a/test/cache/repair/reinstalls_hosted_packages_test.dart +++ b/test/cache/repair/reinstalls_hosted_packages_test.dart @@ -18,7 +18,7 @@ main() { // Set up a cache with some broken packages. d.dir(cachePath, [ d.dir('hosted', [ - d.async(port.then((p) => d.dir('localhost%58$p', [ + d.async(globalServer.port.then((p) => d.dir('localhost%58$p', [ d.dir("foo-1.2.3", [ d.libPubspec("foo", "1.2.3"), d.file("broken.txt") diff --git a/test/descriptor.dart b/test/descriptor.dart index be7cb71a6..b9a28b36c 100644 --- a/test/descriptor.dart +++ b/test/descriptor.dart @@ -153,7 +153,7 @@ Descriptor cacheDir(Map packages, {bool includePubspecs: false}) { Descriptor hostedCache(Iterable contents) { return dir(cachePath, [ dir('hosted', [ - async(port.then((p) => dir('localhost%58$p', contents))) + async(globalServer.port.then((p) => dir('localhost%58$p', contents))) ]) ]); } diff --git a/test/descriptor_server.dart b/test/descriptor_server.dart new file mode 100644 index 000000000..4270dc6a8 --- /dev/null +++ b/test/descriptor_server.dart @@ -0,0 +1,124 @@ +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; +import 'dart:io'; + +import 'package:path/path.dart' as p; +import 'package:pub/src/utils.dart'; +import 'package:scheduled_test/scheduled_test.dart' hide fail; +import 'package:shelf/shelf.dart' as shelf; +import 'package:shelf/shelf_io.dart' as shelf_io; + +import 'descriptor.dart' as d; + +/// The global [DescriptorServer] that's used by default. +/// +/// `null` if there's no global server in use. This can be set to replace the +/// existing global server. +DescriptorServer get globalServer => _globalServer; +set globalServer(DescriptorServer value) { + if (_globalServer == null) { + currentSchedule.onComplete.schedule(() { + _globalServer = null; + }, 'clearing the global server'); + } else { + _globalServer.close(); + } + + _globalServer = value; +} +DescriptorServer _globalServer; + +/// Creates a global [DescriptorServer] to serve [contents] as static files. +/// +/// This server will exist only for the duration of the pub run. It's accessible +/// via [server]. Subsequent calls to [serve] replace the previous server. +void serve([List contents]) { + globalServer = new DescriptorServer(contents); +} + +/// Like [serve], but reports an error if a request ever comes in to the server. +void serveErrors() { + globalServer = new DescriptorServer.errors(); +} + +class DescriptorServer { + /// The server, or `null` before it's available. + HttpServer _server; + + /// A future that will complete to the port used for the server. + Future get port => _portCompleter.future; + final _portCompleter = new Completer(); + + /// Gets the list of paths that have been requested from the server. + Future> get requestedPaths => + schedule(() => _requestedPaths.toList(), + "get previous network requests"); + + /// The list of paths that have been requested from this server. + final _requestedPaths = []; + + /// Creates an HTTP server to serve [contents] as static files. + /// + /// This server exists only for the duration of the pub run. Subsequent calls + /// to [serve] replace the previous server. + DescriptorServer([List contents]) { + var baseDir = d.dir("serve-dir", contents); + + schedule(() async { + _server = await shelf_io.serve((request) async { + var path = p.posix.fromUri(request.url.path); + _requestedPaths.add(path); + + try { + var stream = await validateStream(baseDir.load(path)); + return new shelf.Response.ok(stream); + } catch (_) { + return new shelf.Response.notFound('File "$path" not found.'); + } + }, 'localhost', 0); + + _portCompleter.complete(_server.port); + _closeOnComplete(); + }, 'starting a server serving:\n${baseDir.describe()}'); + } + + /// Creates a server that reports an error if a request is ever received. + DescriptorServer.errors() { + schedule(() async { + _server = await shelf_io.serve((request) { + fail("The HTTP server received an unexpected request:\n" + "${request.method} ${request.requestedUri}"); + return new shelf.Response.forbidden(null); + }, 'localhost', 0); + + _portCompleter.complete(_server.port); + _closeOnComplete(); + }); + } + + /// Schedules [requestedPaths] to be emptied. + void clearRequestedPaths() { + schedule(() { + _requestedPaths.clear(); + }, "clearing requested paths"); + } + + /// Schedules the closing of this server. + void close() { + schedule(() async { + if (_server == null) return; + await _server.close(); + }, "closing DescriptorServer"); + } + + /// Schedules this server to close once the schedule is done. + void _closeOnComplete() { + currentSchedule.onComplete.schedule(() async { + if (_server == null) return; + await _server.close(); + }, "closing DescriptorServer"); + } +} diff --git a/test/downgrade/unlock_dependers_test.dart b/test/downgrade/unlock_dependers_test.dart index 70a628215..6a644c64a 100644 --- a/test/downgrade/unlock_dependers_test.dart +++ b/test/downgrade/unlock_dependers_test.dart @@ -22,7 +22,7 @@ main() { "bar": "2.0.0" }).validate(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("foo", "1.0.0", deps: {"bar": "any"}); builder.serve("bar", "1.0.0"); }); diff --git a/test/downgrade/unlock_if_necessary_test.dart b/test/downgrade/unlock_if_necessary_test.dart index c7eff44e7..a8f4e5f1e 100644 --- a/test/downgrade/unlock_if_necessary_test.dart +++ b/test/downgrade/unlock_if_necessary_test.dart @@ -22,7 +22,7 @@ main() { "foo_dep": "2.0.0" }).validate(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("foo", "1.0.0", deps: {"foo_dep": "<2.0.0"}); builder.serve("foo_dep", "1.0.0"); }); diff --git a/test/get/cache_transformed_dependency_test.dart b/test/get/cache_transformed_dependency_test.dart index b0d64e1ae..a1ab8c440 100644 --- a/test/get/cache_transformed_dependency_test.dart +++ b/test/get/cache_transformed_dependency_test.dart @@ -203,7 +203,7 @@ main() { d.appDir({"foo": "1.2.3"}).create(); pubGet(output: contains("Precompiled foo.")); - servePackages((builder) => builder.serve("bar", "6.0.0")); + globalPackageServer.add((builder) => builder.serve("bar", "6.0.0")); pubUpgrade(output: contains("Precompiled foo.")); }); @@ -227,7 +227,7 @@ main() { d.appDir({"foo": "1.2.3"}).create(); pubGet(output: contains("Precompiled foo.")); - servePackages((builder) => builder.serve("bar", "6.0.0")); + globalPackageServer.add((builder) => builder.serve("bar", "6.0.0")); pubUpgrade(output: isNot(contains("Precompiled foo."))); }); diff --git a/test/get/hosted/avoid_network_requests_test.dart b/test/get/hosted/avoid_network_requests_test.dart index 69afd64e9..54647e9cc 100644 --- a/test/get/hosted/avoid_network_requests_test.dart +++ b/test/get/hosted/avoid_network_requests_test.dart @@ -27,7 +27,7 @@ main() { // Clear the cache. We don't care about anything that was served during // the initial get. - getRequestedPaths(); + globalServer.clearRequestedPaths(); // Add "bar" to the dependencies. d.appDir({ @@ -45,7 +45,7 @@ main() { // The get should not have done any network requests since the lock file is // up to date. - getRequestedPaths().then((paths) { + globalServer.requestedPaths.then((paths) { expect(paths, unorderedEquals([ // Bar should be requested because it's new, but not foo. "api/packages/bar", diff --git a/test/get/hosted/cached_pubspec_test.dart b/test/get/hosted/cached_pubspec_test.dart index 8899d1fba..7d3cf086f 100644 --- a/test/get/hosted/cached_pubspec_test.dart +++ b/test/get/hosted/cached_pubspec_test.dart @@ -18,7 +18,7 @@ main() { // Clear the cache. We don't care about anything that was served during // the initial get. - getRequestedPaths(); + globalServer.clearRequestedPaths(); d.cacheDir({"foo": "1.2.3"}).validate(); d.packagesDir({"foo": "1.2.3"}).validate(); @@ -27,7 +27,7 @@ main() { pubGet(); // The get should not have requested the pubspec since it's local already. - getRequestedPaths().then((paths) { + globalServer.requestedPaths.then((paths) { expect(paths, isNot(contains("packages/foo/versions/1.2.3.yaml"))); }); }); diff --git a/test/get/hosted/does_no_network_requests_when_possible_test.dart b/test/get/hosted/does_no_network_requests_when_possible_test.dart index d08d39905..9330121ef 100644 --- a/test/get/hosted/does_no_network_requests_when_possible_test.dart +++ b/test/get/hosted/does_no_network_requests_when_possible_test.dart @@ -24,7 +24,7 @@ main() { // Clear the cache. We don't care about anything that was served during // the initial get. - getRequestedPaths(); + globalServer.clearRequestedPaths(); // Run the solver again now that it's cached. pubGet(); @@ -34,7 +34,7 @@ main() { // The get should not have done any network requests since the lock file is // up to date. - getRequestedPaths().then((paths) { + globalServer.requestedPaths.then((paths) { expect(paths, isEmpty); }); }); diff --git a/test/get/hosted/stay_locked_if_compatible_test.dart b/test/get/hosted/stay_locked_if_compatible_test.dart index e2f149fda..75f07b044 100644 --- a/test/get/hosted/stay_locked_if_compatible_test.dart +++ b/test/get/hosted/stay_locked_if_compatible_test.dart @@ -16,7 +16,7 @@ main() { d.packagesDir({"foo": "1.0.0"}).validate(); - servePackages((builder) => builder.serve("foo", "1.0.1")); + globalPackageServer.add((builder) => builder.serve("foo", "1.0.1")); d.appDir({"foo": ">=1.0.0"}).create(); diff --git a/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart b/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart index 5f0da0dcd..7873c354e 100644 --- a/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart +++ b/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart @@ -24,7 +24,7 @@ main() { "baz": "1.0.0" }).validate(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("foo", "2.0.0", deps: {"bar": "<3.0.0"}); builder.serve("bar", "2.0.0", deps: {"baz": "<3.0.0"}); builder.serve("baz", "2.0.0"); diff --git a/test/get/hosted/stay_locked_test.dart b/test/get/hosted/stay_locked_test.dart index e9d2976e3..a1f47ba09 100644 --- a/test/get/hosted/stay_locked_test.dart +++ b/test/get/hosted/stay_locked_test.dart @@ -25,7 +25,7 @@ main() { schedule(() => deleteEntry(path.join(sandboxDir, packagesPath))); // Start serving a newer package as well. - servePackages((builder) => builder.serve("foo", "1.0.1")); + globalPackageServer.add((builder) => builder.serve("foo", "1.0.1")); // This shouldn't upgrade the foo dependency due to the lockfile. pubGet(); diff --git a/test/get/hosted/unlock_if_incompatible_test.dart b/test/get/hosted/unlock_if_incompatible_test.dart index fb6c7f7a3..08d011c4e 100644 --- a/test/get/hosted/unlock_if_incompatible_test.dart +++ b/test/get/hosted/unlock_if_incompatible_test.dart @@ -15,7 +15,7 @@ main() { pubGet(); d.packagesDir({"foo": "1.0.0"}).validate(); - servePackages((builder) => builder.serve("foo", "1.0.1")); + globalPackageServer.add((builder) => builder.serve("foo", "1.0.1")); d.appDir({"foo": ">1.0.0"}).create(); pubGet(); diff --git a/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart b/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart index b824a2e8b..fd65adc52 100644 --- a/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart +++ b/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart @@ -26,7 +26,7 @@ main() { "qux": "1.0.0" }).validate(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("foo", "2.0.0", deps: {"bar": "<3.0.0"}); builder.serve("bar", "2.0.0", deps: {"baz": "<3.0.0"}); builder.serve("baz", "2.0.0", deps: {"qux": "<3.0.0"}); diff --git a/test/get/hosted/unlock_if_version_doesnt_exist_test.dart b/test/get/hosted/unlock_if_version_doesnt_exist_test.dart index 371a780d0..c48f071fe 100644 --- a/test/get/hosted/unlock_if_version_doesnt_exist_test.dart +++ b/test/get/hosted/unlock_if_version_doesnt_exist_test.dart @@ -20,7 +20,7 @@ main() { schedule(() => deleteEntry(p.join(sandboxDir, cachePath))); - servePackages((builder) => builder.serve("foo", "1.0.1"), replace: true); + globalPackageServer.replace((builder) => builder.serve("foo", "1.0.1")); pubGet(); d.packagesDir({"foo": "1.0.1"}).validate(); }); diff --git a/test/list_package_dirs/lists_dependency_directories_test.dart b/test/list_package_dirs/lists_dependency_directories_test.dart index 2fbcb9740..8001ca788 100644 --- a/test/list_package_dirs/lists_dependency_directories_test.dart +++ b/test/list_package_dirs/lists_dependency_directories_test.dart @@ -34,8 +34,9 @@ main() { outputJson: { "packages": { "foo": path.join(sandboxDir, "foo", "lib"), - "bar": port.then((p) => path.join(sandboxDir, cachePath, "hosted", - "localhost%58$p", "bar-1.0.0", "lib")), + "bar": globalServer.port.then( + (p) => path.join(sandboxDir, cachePath, "hosted", + "localhost%58$p", "bar-1.0.0", "lib")), "myapp": canonicalize(path.join(sandboxDir, appPath, "lib")) }, "input_files": [ diff --git a/test/serve_packages.dart b/test/package_server.dart similarity index 68% rename from test/serve_packages.dart rename to test/package_server.dart index 0c42da182..22aa83c1a 100644 --- a/test/serve_packages.dart +++ b/test/package_server.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. @@ -15,61 +15,84 @@ import 'package:yaml/yaml.dart'; import 'descriptor.dart' as d; import 'test_pub.dart'; -/// The [d.DirectoryDescriptor] describing the server layout of `/api/packages` -/// on the test server. -/// -/// This contains metadata for packages that are being served via -/// [servePackages]. It's `null` if [servePackages] has not yet been called for -/// this test. -d.DirectoryDescriptor _servedApiPackageDir; - -/// The [d.DirectoryDescriptor] describing the server layout of `/packages` on -/// the test server. -/// -/// This contains the tarballs for packages that are being served via -/// [servePackages]. It's `null` if [servePackages] has not yet been called for -/// this test. -d.DirectoryDescriptor _servedPackageDir; +/// The current global [PackageServer]. +PackageServer get globalPackageServer => _globalPackageServer; +PackageServer _globalPackageServer; -/// The current [PackageServerBuilder] that a user uses to specify which package -/// to serve. -/// -/// This is preserved over multiple calls to [servePackages] within the same -/// test so that additional packages can be added. -PackageServerBuilder _builder; - -/// Creates an HTTP server that replicates the structure of pub.dartlang.org. +/// Creates an HTTP server that replicates the structure of pub.dartlang.org and +/// makes it the current [globalServer]. /// /// Calls [callback] with a [PackageServerBuilder] that's used to specify /// which packages to serve. +void servePackages(void callback(PackageServerBuilder builder)) { + _globalPackageServer = new PackageServer(callback); + globalServer = _globalPackageServer._inner; + + currentSchedule.onComplete.schedule(() { + _globalPackageServer = null; + }, 'clearing the global package server'); +} + +/// Like [servePackages], but instead creates an empty server with no packages +/// registered. /// -/// 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(void callback(PackageServerBuilder builder), - {bool replace: false}) { - if (_servedPackageDir == null) { - _builder = new PackageServerBuilder(); - _servedApiPackageDir = d.dir('packages', []); - _servedPackageDir = d.dir('packages', []); - serve([ +/// This will always replace a previous server. +void serveNoPackages() => servePackages((_) {}, replace: true); + +/// A shortcut for [servePackages] that serves the version of barback used by +/// pub. +void serveBarback() { + servePackages((builder) { + builder.serveRealPackage('barback'); + }); +} + +class PackageServer { + /// The inner [DescriptorServer] that this uses to serve its descriptors. + DescriptorServer _inner; + + /// The [d.DirectoryDescriptor] describing the server layout of + /// `/api/packages` on the test server. + /// + /// This contains metadata for packages that are being served via + /// [servePackages]. + final _servedApiPackageDir = d.dir('packages', []); + + /// The [d.DirectoryDescriptor] describing the server layout of `/packages` on + /// the test server. + /// + /// This contains the tarballs for packages that are being served via + /// [servePackages]. + final _servedPackageDir = d.dir('packages', []); + + /// The current [PackageServerBuilder] that a user uses to specify which + /// package to serve. + /// + /// This is preserved so that additional packages can be added. + var _builder = new PackageServerBuilder._(); + + /// Creates an HTTP server that replicates the structure of pub.dartlang.org. + /// + /// Calls [callback] with a [PackageServerBuilder] that's used to specify + /// which packages to serve. + PackageServer(void callback(PackageServerBuilder builder)) { + _inner = new DescriptorServer([ d.dir('api', [_servedApiPackageDir]), _servedPackageDir ]); - currentSchedule.onComplete.schedule(() { - _builder = null; - _servedApiPackageDir = null; - _servedPackageDir = null; - }, 'cleaning up served packages'); + add(callback); } - schedule(() { - if (replace) _builder = new PackageServerBuilder(); - callback(_builder); - return _builder._await().then((resolvedPubspecs) { + /// Add to the current set of packages that are being served. + void add(void callback(PackageServerBuilder builder)) { + schedule(() async { + callback(_builder); + + await _builder._await(); _servedApiPackageDir.contents.clear(); _servedPackageDir.contents.clear(); + _builder._packages.forEach((name, versions) { _servedApiPackageDir.contents.addAll([ d.file('$name', JSON.encode({ @@ -91,22 +114,14 @@ void servePackages(void callback(PackageServerBuilder builder), d.tar('${version.version}.tar.gz', version.contents))) ])); }); - }); - }, 'initializing the package server'); -} - -/// Like [servePackages], but instead creates an empty server with no packages -/// registered. -/// -/// This will always replace a previous server. -void serveNoPackages() => servePackages((_) {}, replace: true); + }, 'adding packages to the package server'); + } -/// A shortcut for [servePackages] that serves the version of barback used by -/// pub. -void serveBarback() { - servePackages((builder) { - builder.serveRealPackage('barback'); - }); + /// Replace the current set of packages that are being served. + void replace(void callback(PackageServerBuilder builder)) { + schedule(() => _builder._clear(), "clearing builder"); + add(callback); + } } /// A builder for specifying which packages should be served by [servePackages]. @@ -119,6 +134,8 @@ class PackageServerBuilder { /// This should be accessed by calling [_awair]. var _futures = new FutureGroup(); + PackageServerBuilder._(); + /// Specifies that a package named [name] with [version] should be served. /// /// If [deps] is passed, it's used as the "dependencies" field of the pubspec. @@ -188,6 +205,11 @@ class PackageServerBuilder { _futures = new FutureGroup(); }); } + + /// Clears all existing packages from this builder. + void _clear() { + _packages.clear(); + } } /// A package that's intended to be served. diff --git a/test/snapshot/upgrades_snapshot_for_dependency_test.dart b/test/snapshot/upgrades_snapshot_for_dependency_test.dart index 5ec2d4439..aec4b51b4 100644 --- a/test/snapshot/upgrades_snapshot_for_dependency_test.dart +++ b/test/snapshot/upgrades_snapshot_for_dependency_test.dart @@ -35,7 +35,7 @@ void main() => print(message); d.matcherFile('hello.dart.snapshot', contains('hello!')) ]).validate(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("bar", "1.2.4", contents: [ d.dir("lib", [d.file("bar.dart", "final message = 'hello 2!';")]), ]); diff --git a/test/snapshot/upgrades_snapshot_test.dart b/test/snapshot/upgrades_snapshot_test.dart index 47ae92390..13baf3e5f 100644 --- a/test/snapshot/upgrades_snapshot_test.dart +++ b/test/snapshot/upgrades_snapshot_test.dart @@ -26,7 +26,7 @@ main() { d.matcherFile('hello.dart.snapshot', contains('hello!')) ]).validate(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("foo", "1.2.4", contents: [ d.dir("bin", [ d.file("hello.dart", "void main() => print('hello 2!');") diff --git a/test/test_pub.dart b/test/test_pub.dart index 1ef30206f..22da90d9b 100644 --- a/test/test_pub.dart +++ b/test/test_pub.dart @@ -35,22 +35,12 @@ import 'package:scheduled_test/scheduled_process.dart'; import 'package:scheduled_test/scheduled_server.dart'; import 'package:scheduled_test/scheduled_stream.dart'; import 'package:scheduled_test/scheduled_test.dart' hide fail; -import 'package:shelf/shelf.dart' as shelf; -import 'package:shelf/shelf_io.dart' as shelf_io; import 'descriptor.dart' as d; +import 'descriptor_server.dart'; -export 'serve_packages.dart'; - -/// The current [HttpServer] created using [serve]. -var _server; - -/// The list of paths that have been requested from the server since the last -/// call to [getRequestedPaths]. -final _requestedPaths = []; - -/// The cached value for [_portCompleter]. -Completer _portCompleterCache; +export 'descriptor_server.dart'; +export 'package_server.dart'; /// A [Matcher] that matches JavaScript generated by dart2js with minification /// enabled. @@ -66,91 +56,6 @@ Matcher isUnminifiedDart2JSOutput = final _entrypoint = new Entrypoint( pubRoot, new SystemCache.withSources(isOffline: true)); -/// The completer for [port]. -Completer get _portCompleter { - if (_portCompleterCache != null) return _portCompleterCache; - _portCompleterCache = new Completer(); - currentSchedule.onComplete.schedule(() { - _portCompleterCache = null; - }, 'clearing the port completer'); - return _portCompleterCache; -} - -/// A future that will complete to the port used for the current server. -Future get port => _portCompleter.future; - -/// Gets the list of paths that have been requested from the server since the -/// last time this was called (or since the server was first spun up). -Future> getRequestedPaths() { - return schedule(() { - var paths = _requestedPaths.toList(); - _requestedPaths.clear(); - return paths; - }, "get previous network requests"); -} - -/// Creates an HTTP server to serve [contents] as static files. -/// -/// This server will exist only for the duration of the pub run. Subsequent -/// calls to [serve] replace the previous server. -void serve([List contents]) { - var baseDir = d.dir("serve-dir", contents); - - _hasServer = true; - - schedule(() { - return _closeServer().then((_) { - return shelf_io.serve((request) { - var path = p.posix.fromUri(request.url.path); - _requestedPaths.add(path); - - return validateStream(baseDir.load(path)) - .then((stream) => new shelf.Response.ok(stream)) - .catchError((error) { - return new shelf.Response.notFound('File "$path" not found.'); - }); - }, 'localhost', 0).then((server) { - _server = server; - _portCompleter.complete(_server.port); - currentSchedule.onComplete.schedule(_closeServer); - }); - }); - }, 'starting a server serving:\n${baseDir.describe()}'); -} - -/// Like [serve], but reports an error if a request ever comes in to the server. -void serveErrors() { - _hasServer = true; - - schedule(() async { - await _closeServer(); - - _server = await shelf_io.serve((request) { - fail("The HTTP server received an unexpected request:\n" - "${request.method} ${request.requestedUri}"); - return new shelf.Response.forbidden(null); - }, 'localhost', 0); - - _portCompleter.complete(_server.port); - currentSchedule.onComplete.schedule(_closeServer); - }); -} - -/// Closes [_server]. -/// -/// Returns a [Future] that completes after the [_server] is closed. -Future _closeServer() { - if (_server == null) return new Future.value(); - var future = _server.close(); - _server = null; - _hasServer = false; - _portCompleterCache = null; - return future; -} - -/// `true` if the current test spins up an HTTP server. -bool _hasServer = false; - /// Converts [value] into a YAML string. String yaml(value) => JSON.encode(value); @@ -405,8 +310,9 @@ Future getPubTestEnvironment([String tokenEndpoint]) async { environment['_PUB_TEST_TOKEN_ENDPOINT'] = tokenEndpoint.toString(); } - if (_hasServer) { - environment['PUB_HOSTED_URL'] = "http://localhost:${await port}"; + if (globalServer != null) { + environment['PUB_HOSTED_URL'] = + "http://localhost:${await globalServer.port}"; } return environment; diff --git a/test/transformer/cache_test.dart b/test/transformer/cache_test.dart index 85c02421c..b653db116 100644 --- a/test/transformer/cache_test.dart +++ b/test/transformer/cache_test.dart @@ -171,7 +171,7 @@ main() { ]) ]).validate(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("foo", "2.0.0", deps: {'barback': 'any'}, contents: [ @@ -242,7 +242,7 @@ main() { process.stdout.expect("Goodbye!"); process.shouldExit(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("bar", "2.0.0", contents: [ d.dir("lib", [ d.file("bar.dart", "final replacement = 'See ya';") diff --git a/test/upgrade/hosted/unlock_dependers_test.dart b/test/upgrade/hosted/unlock_dependers_test.dart index 7a4a1ea8f..11dcc3cd8 100644 --- a/test/upgrade/hosted/unlock_dependers_test.dart +++ b/test/upgrade/hosted/unlock_dependers_test.dart @@ -22,7 +22,7 @@ main() { "bar": "1.0.0" }).validate(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("foo", "2.0.0", deps: {"bar": "<3.0.0"}); builder.serve("bar", "2.0.0"); }); diff --git a/test/upgrade/hosted/unlock_if_necessary_test.dart b/test/upgrade/hosted/unlock_if_necessary_test.dart index ed38adf12..1b0150706 100644 --- a/test/upgrade/hosted/unlock_if_necessary_test.dart +++ b/test/upgrade/hosted/unlock_if_necessary_test.dart @@ -22,7 +22,7 @@ main() { "foo_dep": "1.0.0" }).validate(); - servePackages((builder) { + globalPackageServer.add((builder) { builder.serve("foo", "2.0.0", deps: {"foo_dep": ">1.0.0"}); builder.serve("foo_dep", "2.0.0"); });