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

Unified Diff: test/package_server.dart

Issue 1664563002: Refactor test servers to make them less global. (Closed) Base URL: git@github.com:dart-lang/pub.git@master
Patch Set: Code review changes Created 4 years, 11 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 | « test/list_package_dirs/lists_dependency_directories_test.dart ('k') | test/serve_packages.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « test/list_package_dirs/lists_dependency_directories_test.dart ('k') | test/serve_packages.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698