| Index: test/package_server.dart
|
| 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 0c42da1824c8d9d15eb39ac12be35b5111fc57d2..22aa83c1a927c3ff99c149459f11982e6aab5924 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.
|
|
|