Refactor the test package-server (#3230)

diff --git a/test/add/common/add_test.dart b/test/add/common/add_test.dart
index e124be8..69f33fe 100644
--- a/test/add/common/add_test.dart
+++ b/test/add/common/add_test.dart
@@ -13,7 +13,7 @@
 
 void main() {
   test('URL encodes the package name', () async {
-    await serveNoPackages();
+    await servePackages();
 
     await d.appDir({}).create();
 
@@ -38,9 +38,8 @@
 
   group('normally', () {
     test('fails if extra arguments are passed', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.2');
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.2.2');
 
       await d.dir(appPath, [
         d.pubspec({'name': 'myapp'})
@@ -62,7 +61,8 @@
     });
 
     test('adds a package from a pub server', () async {
-      await servePackages((builder) => builder.serve('foo', '1.2.3'));
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
 
       await d.appDir({}).create();
 
@@ -76,10 +76,9 @@
     test(
         'does not remove empty dev_dependencies while adding to normal dependencies',
         () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3');
-        builder.serve('foo', '1.2.2');
-      });
+      await servePackages()
+        ..serve('foo', '1.2.3')
+        ..serve('foo', '1.2.2');
 
       await d.dir(appPath, [
         d.file('pubspec.yaml', '''
@@ -109,7 +108,8 @@
 
     test('dry run does not actually add the package or modify the pubspec',
         () async {
-      await servePackages((builder) => builder.serve('foo', '1.2.3'));
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
 
       await d.appDir({}).create();
 
@@ -131,7 +131,8 @@
     test(
         'adds a package from a pub server even when dependencies key does not exist',
         () async {
-      await servePackages((builder) => builder.serve('foo', '1.2.3'));
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
 
       await d.dir(appPath, [
         d.pubspec({'name': 'myapp'})
@@ -146,10 +147,9 @@
 
     group('warns user to use pub upgrade if package exists', () {
       test('if package is added without a version constraint', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.appDir({'foo': '1.2.2'}).create();
 
@@ -164,10 +164,9 @@
       });
 
       test('if package is added with a specific version constraint', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.appDir({'foo': '1.2.2'}).create();
 
@@ -182,10 +181,9 @@
       });
 
       test('if package is added with a version constraint range', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.appDir({'foo': '1.2.2'}).create();
 
@@ -201,10 +199,9 @@
     });
 
     test('removes dev_dependency and add to normal dependency', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3');
-        builder.serve('foo', '1.2.2');
-      });
+      await servePackages()
+        ..serve('foo', '1.2.3')
+        ..serve('foo', '1.2.2');
 
       await d.dir(appPath, [
         d.file('pubspec.yaml', '''
@@ -237,10 +234,9 @@
 
     group('dependency override', () {
       test('passes if package does not specify a range', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.dir(appPath, [
           d.pubspec({
@@ -264,9 +260,8 @@
       });
 
       test('passes if constraint matches git dependency override', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-        });
+        final server = await servePackages();
+        server.serve('foo', '1.2.3');
 
         await d.git('foo.git',
             [d.libDir('foo'), d.libPubspec('foo', '1.2.3')]).create();
@@ -295,9 +290,8 @@
       });
 
       test('passes if constraint matches path dependency override', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.2');
-        });
+        final server = await servePackages();
+        server.serve('foo', '1.2.2');
         await d.dir(
             'foo', [d.libDir('foo'), d.libPubspec('foo', '1.2.2')]).create();
 
@@ -325,9 +319,8 @@
       });
 
       test('fails with bad version constraint', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-        });
+        final server = await servePackages();
+        server.serve('foo', '1.2.3');
 
         await d.dir(appPath, [
           d.pubspec({'name': 'myapp', 'dependencies': {}})
@@ -348,10 +341,9 @@
       });
 
       test('fails if constraint does not match override', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.dir(appPath, [
           d.pubspec({
@@ -381,9 +373,8 @@
       });
 
       test('fails if constraint matches git dependency override', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-        });
+        final server = await servePackages();
+        server.serve('foo', '1.2.3');
 
         await d.git('foo.git',
             [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
@@ -421,9 +412,8 @@
 
       test('fails if constraint does not match path dependency override',
           () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.2');
-        });
+        final server = await servePackages();
+        server.serve('foo', '1.2.2');
         await d.dir(
             'foo', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
 
@@ -462,7 +452,8 @@
 
   group('--dev', () {
     test('--dev adds packages to dev_dependencies instead', () async {
-      await servePackages((builder) => builder.serve('foo', '1.2.3'));
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
 
       await d.dir(appPath, [
         d.pubspec({'name': 'myapp', 'dev_dependencies': {}})
@@ -482,10 +473,9 @@
 
     group('warns user to use pub upgrade if package exists', () {
       test('if package is added without a version constraint', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.dir(appPath, [
           d.pubspec({
@@ -510,10 +500,9 @@
       });
 
       test('if package is added with a specific version constraint', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.dir(appPath, [
           d.pubspec({
@@ -538,10 +527,9 @@
       });
 
       test('if package is added with a version constraint range', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.dir(appPath, [
           d.pubspec({
@@ -568,10 +556,9 @@
 
     group('dependency override', () {
       test('passes if package does not specify a range', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.dir(appPath, [
           d.pubspec({
@@ -595,10 +582,8 @@
       });
 
       test('passes if constraint is git dependency', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-        });
-
+        final server = await servePackages();
+        server.serve('foo', '1.2.3');
         await d.git('foo.git',
             [d.libDir('foo'), d.libPubspec('foo', '1.2.3')]).create();
 
@@ -626,9 +611,8 @@
       });
 
       test('passes if constraint matches path dependency override', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.2');
-        });
+        final server = await servePackages();
+        server.serve('foo', '1.2.2');
         await d.dir(
             'foo', [d.libDir('foo'), d.libPubspec('foo', '1.2.2')]).create();
 
@@ -656,10 +640,9 @@
       });
 
       test('fails if constraint does not match override', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-          builder.serve('foo', '1.2.2');
-        });
+        await servePackages()
+          ..serve('foo', '1.2.3')
+          ..serve('foo', '1.2.2');
 
         await d.dir(appPath, [
           d.pubspec({
@@ -689,9 +672,8 @@
       });
 
       test('fails if constraint matches git dependency override', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3');
-        });
+        final server = await servePackages();
+        server.serve('foo', '1.2.3');
 
         await d.git('foo.git',
             [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
@@ -729,9 +711,9 @@
 
       test('fails if constraint does not match path dependency override',
           () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.2');
-        });
+        final server = await servePackages();
+        server.serve('foo', '1.2.2');
+
         await d.dir(
             'foo', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
 
@@ -770,10 +752,9 @@
     test(
         'prints information saying that package is already a dependency if it '
         'already exists and exits with a usage exception', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3');
-        builder.serve('foo', '1.2.2');
-      });
+      await servePackages()
+        ..serve('foo', '1.2.3')
+        ..serve('foo', '1.2.2');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -805,9 +786,8 @@
 
   /// Differs from the previous test because this tests YAML in flow format.
   test('adds to empty ', () async {
-    await servePackages((builder) {
-      builder.serve('bar', '1.0.0');
-    });
+    final server = await servePackages();
+    server.serve('bar', '1.0.0');
 
     await d.dir(appPath, [
       d.file('pubspec.yaml', '''
@@ -825,10 +805,9 @@
   });
 
   test('preserves comments', () async {
-    await servePackages((builder) {
-      builder.serve('bar', '1.0.0');
-      builder.serve('foo', '1.0.0');
-    });
+    await servePackages()
+      ..serve('bar', '1.0.0')
+      ..serve('foo', '1.0.0');
 
     await d.dir(appPath, [
       d.file('pubspec.yaml', '''
diff --git a/test/add/common/invalid_options.dart b/test/add/common/invalid_options.dart
index 4689db3..f5bf23d 100644
--- a/test/add/common/invalid_options.dart
+++ b/test/add/common/invalid_options.dart
@@ -39,12 +39,10 @@
   test('cannot use both --path and --host-<option> flags', () async {
     // Make the default server serve errors. Only the custom server should
     // be accessed.
-    await serveNoPackages();
-    globalPackageServer.serveErrors();
+    (await servePackages()).serveErrors();
 
-    final server = await PackageServer.start((builder) {
-      builder.serve('foo', '1.2.3');
-    });
+    final server = await startPackageServer();
+    server.serve('foo', '1.2.3');
 
     await d
         .dir('bar', [d.libDir('bar'), d.libPubspec('foo', '0.0.1')]).create();
@@ -76,12 +74,10 @@
   test('cannot use both --hosted-url and --git-<option> flags', () async {
     // Make the default server serve errors. Only the custom server should
     // be accessed.
-    await serveNoPackages();
-    globalPackageServer.serveErrors();
+    (await servePackages()).serveErrors();
 
-    final server = await PackageServer.start((builder) {
-      builder.serve('foo', '1.2.3');
-    });
+    final server = await startPackageServer();
+    server.serve('foo', '1.2.3');
 
     ensureGit();
 
diff --git a/test/add/common/version_constraint_test.dart b/test/add/common/version_constraint_test.dart
index d865727..546642f 100644
--- a/test/add/common/version_constraint_test.dart
+++ b/test/add/common/version_constraint_test.dart
@@ -10,13 +10,12 @@
 
 void main() {
   test('allows empty version constraint', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '0.2.3');
-      builder.serve('foo', '1.0.1');
-      builder.serve('foo', '1.2.3');
-      builder.serve('foo', '2.0.0-dev');
-      builder.serve('foo', '1.3.4-dev');
-    });
+    await servePackages()
+      ..serve('foo', '0.2.3')
+      ..serve('foo', '1.0.1')
+      ..serve('foo', '1.2.3')
+      ..serve('foo', '2.0.0-dev')
+      ..serve('foo', '1.3.4-dev');
 
     await d.appDir({}).create();
 
@@ -28,7 +27,8 @@
   });
 
   test('allows specific version constraint', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     await d.appDir({}).create();
 
@@ -40,7 +40,8 @@
   });
 
   test('allows specific pre-release version constraint', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3-dev'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3-dev');
 
     await d.appDir({}).create();
 
@@ -52,13 +53,12 @@
   });
 
   test('allows the "any" version constraint', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '0.2.3');
-      builder.serve('foo', '1.0.1');
-      builder.serve('foo', '1.2.3');
-      builder.serve('foo', '2.0.0-dev');
-      builder.serve('foo', '1.3.4-dev');
-    });
+    await servePackages()
+      ..serve('foo', '0.2.3')
+      ..serve('foo', '1.0.1')
+      ..serve('foo', '1.2.3')
+      ..serve('foo', '2.0.0-dev')
+      ..serve('foo', '1.3.4-dev');
 
     await d.appDir({}).create();
 
@@ -70,7 +70,8 @@
   });
 
   test('allows version constraint range', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     await d.appDir({}).create();
 
@@ -84,12 +85,11 @@
   test(
       'empty constraint allows it to choose the latest version not in conflict',
       () async {
-    await servePackages((builder) {
-      builder.serve('foo', '0.1.0');
-      builder.serve('foo', '1.2.3', deps: {'bar': '2.0.4'});
-      builder.serve('bar', '2.0.3');
-      builder.serve('bar', '2.0.4');
-    });
+    await servePackages()
+      ..serve('foo', '0.1.0')
+      ..serve('foo', '1.2.3', deps: {'bar': '2.0.4'})
+      ..serve('bar', '2.0.3')
+      ..serve('bar', '2.0.4');
 
     await d.appDir({'bar': '2.0.3'}).create();
 
@@ -103,7 +103,8 @@
 
   group('does not update pubspec if no available version found', () {
     test('simple', () async {
-      await servePackages((builder) => builder.serve('foo', '1.0.3'));
+      final server = await servePackages();
+      server.serve('foo', '1.0.3');
 
       await d.appDir({}).create();
 
@@ -124,11 +125,10 @@
     });
 
     test('transitive', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3', deps: {'bar': '2.0.4'});
-        builder.serve('bar', '2.0.3');
-        builder.serve('bar', '2.0.4');
-      });
+      await servePackages()
+        ..serve('foo', '1.2.3', deps: {'bar': '2.0.4'})
+        ..serve('bar', '2.0.3')
+        ..serve('bar', '2.0.4');
 
       await d.appDir({'bar': '2.0.3'}).create();
 
diff --git a/test/add/common/version_resolution_test.dart b/test/add/common/version_resolution_test.dart
index 9d7d2a6..64b393a 100644
--- a/test/add/common/version_resolution_test.dart
+++ b/test/add/common/version_resolution_test.dart
@@ -13,10 +13,10 @@
   test('unlocks transitive dependencies', () async {
     /// The server used to only have the foo v3.2.1 as the latest,
     /// so pub get will create a pubspec.lock to foo 3.2.1
-    await servePackages((builder) {
-      builder.serve('foo', '3.2.1');
-      builder.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
-    });
+    final server = await servePackages();
+
+    server.serve('foo', '3.2.1');
+    server.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
 
     await d.appDir({'bar': '1.0.0'}).create();
     await pubGet();
@@ -24,11 +24,9 @@
     /// foo's package creator releases a newer version of foo, and we
     /// want to test that this is what the user gets when they run
     /// pub add foo.
-    globalPackageServer.add((builder) {
-      builder.serve('foo', '3.5.0');
-      builder.serve('foo', '3.1.0');
-      builder.serve('foo', '2.5.0');
-    });
+    server.serve('foo', '3.5.0');
+    server.serve('foo', '3.1.0');
+    server.serve('foo', '2.5.0');
 
     await pubAdd(args: ['foo']);
 
@@ -41,18 +39,16 @@
       () async {
     /// The server used to only have the foo v3.2.1 as the latest,
     /// so pub get will create a pubspec.lock to foo 3.2.1
-    await servePackages((builder) {
-      builder.serve('foo', '3.2.1');
-      builder.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
-    });
+    final server = await servePackages();
+
+    server.serve('foo', '3.2.1');
+    server.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
 
     await d.appDir({'bar': '1.0.0'}).create();
     await pubGet();
 
-    globalPackageServer.add((builder) {
-      builder.serve('foo', '4.0.0');
-      builder.serve('foo', '2.0.0');
-    });
+    server.serve('foo', '4.0.0');
+    server.serve('foo', '2.0.0');
 
     await pubAdd(args: ['foo']);
 
@@ -65,20 +61,18 @@
       () async {
     /// The server used to only have the foo v3.2.1 as the latest,
     /// so pub get will create a pubspec.lock to foo 3.2.1
-    await servePackages((builder) {
-      builder.serve('foo', '3.2.1');
-      builder.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
-    });
+    final server = await servePackages();
+
+    server.serve('foo', '3.2.1');
+    server.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
 
     await d.appDir({'bar': '^1.0.0'}).create();
     await pubGet();
 
-    globalPackageServer.add((builder) {
-      builder.serve('foo', '5.0.0');
-      builder.serve('foo', '4.0.0');
-      builder.serve('foo', '2.0.0');
-      builder.serve('bar', '1.5.0', deps: {'foo': '^4.0.0'});
-    });
+    server.serve('foo', '5.0.0');
+    server.serve('foo', '4.0.0');
+    server.serve('foo', '2.0.0');
+    server.serve('bar', '1.5.0', deps: {'foo': '^4.0.0'});
 
     await pubAdd(args: ['foo']);
 
diff --git a/test/add/git/git_test.dart b/test/add/git/git_test.dart
index 2577af8..7bc51f0 100644
--- a/test/add/git/git_test.dart
+++ b/test/add/git/git_test.dart
@@ -156,9 +156,8 @@
   });
 
   test('can be overriden by dependency override', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.2');
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.2.2');
 
     await d.git(
         'foo.git', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
diff --git a/test/add/hosted/non_default_pub_server_test.dart b/test/add/hosted/non_default_pub_server_test.dart
index fbe966e..eea6c09 100644
--- a/test/add/hosted/non_default_pub_server_test.dart
+++ b/test/add/hosted/non_default_pub_server_test.dart
@@ -12,13 +12,12 @@
   test('adds a package from a non-default pub server', () async {
     // Make the default server serve errors. Only the custom server should
     // be accessed.
-    await serveErrors();
+    (await servePackages()).serveErrors();
 
-    var server = await PackageServer.start((builder) {
-      builder.serve('foo', '0.2.5');
-      builder.serve('foo', '1.1.0');
-      builder.serve('foo', '1.2.3');
-    });
+    final server = await servePackages();
+    server.serve('foo', '0.2.5');
+    server.serve('foo', '1.1.0');
+    server.serve('foo', '1.2.3');
 
     await d.appDir({}).create();
 
@@ -64,13 +63,12 @@
       () async {
     // Make the default server serve errors. Only the custom server should
     // be accessed.
-    await serveErrors();
+    (await servePackages()).serveErrors();
 
-    var server = await PackageServer.start((builder) {
-      builder.serve('foo', '0.2.5');
-      builder.serve('foo', '1.1.0');
-      builder.serve('foo', '1.2.3');
-    });
+    final server = await servePackages();
+    server.serve('foo', '0.2.5');
+    server.serve('foo', '1.1.0');
+    server.serve('foo', '1.2.3');
 
     await d.appDir({}).create();
 
@@ -92,13 +90,12 @@
       () async {
     // Make the default server serve errors. Only the custom server should
     // be accessed.
-    await serveErrors();
+    (await servePackages()).serveErrors();
 
-    var server = await PackageServer.start((builder) {
-      builder.serve('foo', '0.2.5');
-      builder.serve('foo', '1.1.0');
-      builder.serve('foo', '1.2.3');
-    });
+    final server = await servePackages();
+    server.serve('foo', '0.2.5');
+    server.serve('foo', '1.1.0');
+    server.serve('foo', '1.2.3');
 
     await d.appDir({}).create();
 
@@ -121,13 +118,11 @@
       'constraint', () async {
     // Make the default server serve errors. Only the custom server should
     // be accessed.
-    await serveErrors();
-
-    var server = await PackageServer.start((builder) {
-      builder.serve('foo', '0.2.5');
-      builder.serve('foo', '1.1.0');
-      builder.serve('foo', '1.2.3');
-    });
+    (await servePackages()).serveErrors();
+    final server = await servePackages();
+    server.serve('foo', '0.2.5');
+    server.serve('foo', '1.1.0');
+    server.serve('foo', '1.2.3');
 
     await d.appDir({}).create();
 
diff --git a/test/add/path/absolute_path_test.dart b/test/add/path/absolute_path_test.dart
index 0811bea..5b7e726 100644
--- a/test/add/path/absolute_path_test.dart
+++ b/test/add/path/absolute_path_test.dart
@@ -88,9 +88,8 @@
   });
 
   test('can be overriden by dependency override', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.2');
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.2.2');
     await d
         .dir('foo', [d.libDir('foo'), d.libPubspec('foo', '0.0.1')]).create();
 
diff --git a/test/add/path/relative_path_test.dart b/test/add/path/relative_path_test.dart
index 8fa1932..c02b644 100644
--- a/test/add/path/relative_path_test.dart
+++ b/test/add/path/relative_path_test.dart
@@ -102,9 +102,8 @@
   });
 
   test('can be overriden by dependency override', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.2');
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.2.2');
     await d
         .dir('foo', [d.libDir('foo'), d.libPubspec('foo', '0.0.1')]).create();
 
diff --git a/test/add/sdk/sdk_test.dart b/test/add/sdk/sdk_test.dart
index 25995e3..632725e 100644
--- a/test/add/sdk/sdk_test.dart
+++ b/test/add/sdk/sdk_test.dart
@@ -11,9 +11,8 @@
 
 void main() {
   setUp(() async {
-    await servePackages((builder) {
-      builder.serve('bar', '1.0.0');
-    });
+    final server = await servePackages();
+    server.serve('bar', '1.0.0');
 
     await d.dir('flutter', [
       d.dir('packages', [
diff --git a/test/cache/add/adds_latest_matching_version_test.dart b/test/cache/add/adds_latest_matching_version_test.dart
index 0e78b12..7bf9625 100644
--- a/test/cache/add/adds_latest_matching_version_test.dart
+++ b/test/cache/add/adds_latest_matching_version_test.dart
@@ -13,12 +13,11 @@
   test(
       'adds the latest version of the package matching the '
       'version constraint', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.2');
-      builder.serve('foo', '1.2.3');
-      builder.serve('foo', '2.0.0-dev');
-      builder.serve('foo', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.2')
+      ..serve('foo', '1.2.3')
+      ..serve('foo', '2.0.0-dev')
+      ..serve('foo', '2.0.0');
 
     await runPub(
         args: ['cache', 'add', 'foo', '-v', '>=1.0.0 <2.0.0'],
diff --git a/test/cache/add/adds_latest_version_test.dart b/test/cache/add/adds_latest_version_test.dart
index 6e196f6..cf34857 100644
--- a/test/cache/add/adds_latest_version_test.dart
+++ b/test/cache/add/adds_latest_version_test.dart
@@ -9,11 +9,10 @@
 
 void main() {
   test('adds the latest stable version of the package', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.2');
-      builder.serve('foo', '1.2.3');
-      builder.serve('foo', '1.2.4-dev');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.2')
+      ..serve('foo', '1.2.3')
+      ..serve('foo', '1.2.4-dev');
 
     await runPub(
         args: ['cache', 'add', 'foo'], output: 'Downloading foo 1.2.3...');
diff --git a/test/cache/add/all_adds_all_matching_versions_test.dart b/test/cache/add/all_adds_all_matching_versions_test.dart
index 9dfb3c7..a05e8dc 100644
--- a/test/cache/add/all_adds_all_matching_versions_test.dart
+++ b/test/cache/add/all_adds_all_matching_versions_test.dart
@@ -9,12 +9,11 @@
 
 void main() {
   test('"--all" adds all matching versions of the package', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.2');
-      builder.serve('foo', '1.2.3-dev');
-      builder.serve('foo', '1.2.3');
-      builder.serve('foo', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.2')
+      ..serve('foo', '1.2.3-dev')
+      ..serve('foo', '1.2.3')
+      ..serve('foo', '2.0.0');
 
     await runPub(
         args: ['cache', 'add', 'foo', '-v', '>=1.0.0 <2.0.0', '--all'],
diff --git a/test/cache/add/all_with_some_versions_present_test.dart b/test/cache/add/all_with_some_versions_present_test.dart
index 861ac4c..7b5b36d 100644
--- a/test/cache/add/all_with_some_versions_present_test.dart
+++ b/test/cache/add/all_with_some_versions_present_test.dart
@@ -9,12 +9,11 @@
 
 void main() {
   test('"--all" adds all non-installed versions of the package', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.1');
-      builder.serve('foo', '1.2.2');
-      builder.serve('foo', '1.2.3');
-      builder.serve('foo', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.1')
+      ..serve('foo', '1.2.2')
+      ..serve('foo', '1.2.3')
+      ..serve('foo', '2.0.0');
 
     // Install a couple of versions first.
     await runPub(
diff --git a/test/cache/add/already_cached_test.dart b/test/cache/add/already_cached_test.dart
index ac244dc..8c74da9 100644
--- a/test/cache/add/already_cached_test.dart
+++ b/test/cache/add/already_cached_test.dart
@@ -9,9 +9,8 @@
 
 void main() {
   test('does nothing if the package is already cached', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.3');
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     // Run once to put it in the cache.
     await runPub(
diff --git a/test/cache/add/no_matching_version_test.dart b/test/cache/add/no_matching_version_test.dart
index 4b4455c..a860294 100644
--- a/test/cache/add/no_matching_version_test.dart
+++ b/test/cache/add/no_matching_version_test.dart
@@ -8,10 +8,9 @@
 
 void main() {
   test('fails if no version matches the version constraint', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.2');
-      builder.serve('foo', '1.2.3');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.2')
+      ..serve('foo', '1.2.3');
 
     await runPub(
         args: ['cache', 'add', 'foo', '-v', '>2.0.0'],
diff --git a/test/cache/add/package_not_found_test.dart b/test/cache/add/package_not_found_test.dart
index 6b3f2bc..caf45f4 100644
--- a/test/cache/add/package_not_found_test.dart
+++ b/test/cache/add/package_not_found_test.dart
@@ -9,7 +9,7 @@
 
 void main() {
   test('fails if the package cound not be found on the source', () async {
-    await serveNoPackages();
+    await servePackages();
 
     await runPub(
         args: ['cache', 'add', 'foo'],
diff --git a/test/cache/clean_test.dart b/test/cache/clean_test.dart
index b03c0c8..7a79bc8 100644
--- a/test/cache/clean_test.dart
+++ b/test/cache/clean_test.dart
@@ -17,9 +17,9 @@
   });
 
   test('running pub cache clean --force deletes cache', () async {
-    await servePackages((b) => b
+    await servePackages()
       ..serve('foo', '1.1.2')
-      ..serve('bar', '1.2.3'));
+      ..serve('bar', '1.2.3');
     await d.appDir({'foo': 'any', 'bar': 'any'}).create();
     await pubGet();
     final cache = path.join(d.sandbox, cachePath);
@@ -32,9 +32,9 @@
 
   test('running pub cache clean deletes cache only with confirmation',
       () async {
-    await servePackages((b) => b
+    await servePackages()
       ..serve('foo', '1.1.2')
-      ..serve('bar', '1.2.3'));
+      ..serve('bar', '1.2.3');
     await d.appDir({'foo': 'any', 'bar': 'any'}).create();
     await pubGet();
     final cache = path.join(d.sandbox, cachePath);
diff --git a/test/cache/repair/handles_corrupted_binstub_test.dart b/test/cache/repair/handles_corrupted_binstub_test.dart
index 9991ec1..0ca169f 100644
--- a/test/cache/repair/handles_corrupted_binstub_test.dart
+++ b/test/cache/repair/handles_corrupted_binstub_test.dart
@@ -9,11 +9,10 @@
 
 void main() {
   test('handles a corrupted binstub script', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/cache/repair/handles_failure_test.dart b/test/cache/repair/handles_failure_test.dart
index 4a6bd64..d5637ca 100644
--- a/test/cache/repair/handles_failure_test.dart
+++ b/test/cache/repair/handles_failure_test.dart
@@ -11,15 +11,14 @@
 void main() {
   test('handles failure to reinstall some packages', () async {
     // Only serve two packages so repairing will have a failure.
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.3');
-      builder.serve('foo', '1.2.5');
-    });
+    final server = await servePackages()
+      ..serve('foo', '1.2.3')
+      ..serve('foo', '1.2.5');
 
     // Set up a cache with some packages.
     await d.dir(cachePath, [
       d.dir('hosted', [
-        d.dir('localhost%58${globalServer!.port}', [
+        d.dir('localhost%58${server.port}', [
           d.dir('foo-1.2.3',
               [d.libPubspec('foo', '1.2.3'), d.file('broken.txt')]),
           d.dir('foo-1.2.4',
diff --git a/test/cache/repair/hosted.dart b/test/cache/repair/hosted.dart
index 97c8167..ec3786b 100644
--- a/test/cache/repair/hosted.dart
+++ b/test/cache/repair/hosted.dart
@@ -11,21 +11,20 @@
 import '../../test_pub.dart';
 
 void main() {
-  setUp(() {
-    return servePackages((builder) {
-      builder.serve('foo', '1.2.3');
-      builder.serve('foo', '1.2.4');
-      builder.serve('foo', '1.2.5');
-      builder.serve('bar', '1.2.3');
-      builder.serve('bar', '1.2.4');
-    });
+  setUp(() async {
+    await servePackages()
+      ..serve('foo', '1.2.3')
+      ..serve('foo', '1.2.4')
+      ..serve('foo', '1.2.5')
+      ..serve('bar', '1.2.3')
+      ..serve('bar', '1.2.4');
   });
 
   test('reinstalls previously cached hosted packages', () async {
     // Set up a cache with some broken packages.
     await d.dir(cachePath, [
       d.dir('hosted', [
-        d.dir('localhost%58${globalServer!.port}', [
+        d.dir('localhost%58${globalServer.port}', [
           d.dir('foo-1.2.3',
               [d.libPubspec('foo', '1.2.3'), d.file('broken.txt')]),
           d.dir('foo-1.2.5',
@@ -64,7 +63,7 @@
     // Set up a cache with some broken packages.
     await d.dir(cachePath, [
       d.dir('hosted', [
-        d.dir('localhost%58${globalServer!.port}', [
+        d.dir('localhost%58${globalServer.port}', [
           d.dir('bar-1.2.4', [d.file('broken.txt')]),
           d.dir('foo-1.2.3', [d.file('broken.txt')]),
           d.dir('foo-1.2.5', [d.file('broken.txt')]),
@@ -100,7 +99,7 @@
     // Set up a cache with some broken packages.
     await d.dir(cachePath, [
       d.dir('hosted', [
-        d.dir('localhost%58${globalServer!.port}', [
+        d.dir('localhost%58${globalServer.port}', [
           d.dir('bar-1.2.4', [d.file('pubspec.yaml', '{')]),
           d.dir('foo-1.2.3', [d.file('pubspec.yaml', '{')]),
           d.dir('foo-1.2.5', [d.file('pubspec.yaml', '{')]),
diff --git a/test/cache/repair/recompiles_snapshots_test.dart b/test/cache/repair/recompiles_snapshots_test.dart
index 89b3575..f3c3d6c 100644
--- a/test/cache/repair/recompiles_snapshots_test.dart
+++ b/test/cache/repair/recompiles_snapshots_test.dart
@@ -9,11 +9,10 @@
 
 void main() {
   test('recompiles activated executable snapshots', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/cache/repair/updates_binstubs_test.dart b/test/cache/repair/updates_binstubs_test.dart
index c311697..e8cbfb4 100644
--- a/test/cache/repair/updates_binstubs_test.dart
+++ b/test/cache/repair/updates_binstubs_test.dart
@@ -19,14 +19,12 @@
 
 void main() {
   test('updates an outdated binstub script', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {'foo-script': 'script'}
-      }, contents: [
-        d.dir(
-            'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {'foo-script': 'script'}
+    }, contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/dependency_override_test.dart b/test/dependency_override_test.dart
index 2ea5abc..dd8dc0d 100644
--- a/test/dependency_override_test.dart
+++ b/test/dependency_override_test.dart
@@ -12,11 +12,10 @@
 void main() {
   forBothPubGetAndUpgrade((command) {
     test('chooses best version matching override constraint', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('foo', '2.0.0');
-        builder.serve('foo', '3.0.0');
-      });
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('foo', '2.0.0')
+        ..serve('foo', '3.0.0');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -32,9 +31,8 @@
     });
 
     test('treats override as implicit dependency', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -49,14 +47,13 @@
     });
 
     test('ignores other constraints on overridden package', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('foo', '2.0.0');
-        builder.serve('foo', '3.0.0');
-        builder.serve('bar', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('foo', '2.0.0')
+        ..serve('foo', '3.0.0')
+        ..serve('bar', '1.0.0', pubspec: {
           'dependencies': {'foo': '5.0.0-nonexistent'}
         });
-      });
 
       await d.dir(appPath, [
         d.pubspec({
@@ -72,10 +69,9 @@
     });
 
     test('ignores SDK constraints', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
-          'environment': {'sdk': '5.6.7-fblthp'}
-        });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0', pubspec: {
+        'environment': {'sdk': '5.6.7-fblthp'}
       });
 
       await d.dir(appPath, [
@@ -91,10 +87,9 @@
     });
 
     test('warns about overridden dependencies', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('bar', '1.0.0');
-      });
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('bar', '1.0.0');
 
       await d
           .dir('baz', [d.libDir('baz'), d.libPubspec('baz', '0.0.1')]).create();
diff --git a/test/deps_test.dart b/test/deps_test.dart
index 207e8e7..7336f13 100644
--- a/test/deps_test.dart
+++ b/test/deps_test.dart
@@ -10,21 +10,19 @@
 
 void main() {
   setUp(() async {
-    await servePackages((builder) {
-      builder.serve('normal', '1.2.3',
-          deps: {'transitive': 'any', 'circular_a': 'any'});
-      builder.serve('transitive', '1.2.3', deps: {'shared': 'any'});
-      builder.serve('shared', '1.2.3', deps: {'other': 'any'});
-      builder.serve('dev_only', '1.2.3');
-      builder.serve('unittest', '1.2.3',
-          deps: {'shared': 'any', 'dev_only': 'any'});
-      builder.serve('other', '1.0.0', deps: {'myapp': 'any'});
-      builder.serve('overridden', '1.0.0');
-      builder.serve('overridden', '2.0.0');
-      builder.serve('override_only', '1.2.3');
-      builder.serve('circular_a', '1.2.3', deps: {'circular_b': 'any'});
-      builder.serve('circular_b', '1.2.3', deps: {'circular_a': 'any'});
-    });
+    await servePackages()
+      ..serve('normal', '1.2.3',
+          deps: {'transitive': 'any', 'circular_a': 'any'})
+      ..serve('transitive', '1.2.3', deps: {'shared': 'any'})
+      ..serve('shared', '1.2.3', deps: {'other': 'any'})
+      ..serve('dev_only', '1.2.3')
+      ..serve('unittest', '1.2.3', deps: {'shared': 'any', 'dev_only': 'any'})
+      ..serve('other', '1.0.0', deps: {'myapp': 'any'})
+      ..serve('overridden', '1.0.0')
+      ..serve('overridden', '2.0.0')
+      ..serve('override_only', '1.2.3')
+      ..serve('circular_a', '1.2.3', deps: {'circular_b': 'any'})
+      ..serve('circular_b', '1.2.3', deps: {'circular_a': 'any'});
 
     await d.dir('from_path',
         [d.libDir('from_path'), d.libPubspec('from_path', '1.2.3')]).create();
diff --git a/test/descriptor.dart b/test/descriptor.dart
index ee50a45..7b140e2 100644
--- a/test/descriptor.dart
+++ b/test/descriptor.dart
@@ -179,7 +179,7 @@
 /// that this cache represents. It defaults to [globalServer.port].
 Descriptor hostedCache(Iterable<Descriptor> contents, {int? port}) {
   return dir(cachePath, [
-    dir('hosted', [dir('localhost%58${port ?? globalServer?.port}', contents)])
+    dir('hosted', [dir('localhost%58${port ?? globalServer.port}', contents)])
   ]);
 }
 
@@ -295,7 +295,7 @@
   }
   Uri rootUri;
   if (version != null) {
-    rootUri = p.toUri(globalPackageServer.pathInCache(name, version));
+    rootUri = p.toUri(globalServer.pathInCache(name, version));
   } else {
     rootUri = p.toUri(p.join('..', path));
   }
diff --git a/test/descriptor_server.dart b/test/descriptor_server.dart
deleted file mode 100644
index 973a49c..0000000
--- a/test/descriptor_server.dart
+++ /dev/null
@@ -1,142 +0,0 @@
-// 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 'package:collection/collection.dart' show IterableExtension;
-import 'package:path/path.dart' as p;
-import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf/shelf_io.dart' as shelf_io;
-import 'package:test/test.dart' hide fail;
-
-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) {
-  var server = _globalServer;
-  if (server == null) {
-    addTearDown(() {
-      _globalServer = null;
-    });
-  } else {
-    expect(server.close(), completes);
-  }
-
-  _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.
-Future serve([List<d.Descriptor> contents = const []]) async {
-  globalServer = (await DescriptorServer.start())..contents.addAll(contents);
-}
-
-class DescriptorServer {
-  /// The underlying server.
-  final shelf.Server _server;
-
-  /// A future that will complete to the port used for the server.
-  int get port => _server.url.port;
-
-  /// The list of paths that have been requested from this server.
-  final requestedPaths = <String>[];
-
-  /// The base directory descriptor of the directories served by [this].
-  final d.DirectoryDescriptor _baseDir;
-
-  /// The descriptors served by this server.
-  ///
-  /// This can safely be modified between requests.
-  List<d.Descriptor> get contents => _baseDir.contents;
-
-  /// Handlers for requests not easily described as files.
-  final Map<Pattern, shelf.Handler> extraHandlers = {};
-
-  /// 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.
-  static Future<DescriptorServer> start() async =>
-      DescriptorServer._(await shelf_io.IOServer.bind('localhost', 0));
-
-  /// Creates a server that reports an error if a request is ever received.
-  static Future<DescriptorServer> errors() async =>
-      DescriptorServer._(await shelf_io.IOServer.bind('localhost', 0));
-
-  DescriptorServer._(this._server) : _baseDir = d.dir('serve-dir', []) {
-    _server.mount((request) async {
-      final pathWithInitialSlash = '/${request.url.path}';
-      final key = extraHandlers.keys.firstWhereOrNull((pattern) {
-        final match = pattern.matchAsPrefix(pathWithInitialSlash);
-        return match != null && match.end == pathWithInitialSlash.length;
-      });
-      if (key != null) return extraHandlers[key]!(request);
-
-      var path = p.posix.fromUri(request.url.path);
-      requestedPaths.add(path);
-
-      try {
-        var stream = await _validateStream(_baseDir.load(path));
-        return shelf.Response.ok(stream);
-      } catch (_) {
-        return shelf.Response.notFound('File "$path" not found.');
-      }
-    });
-    addTearDown(_server.close);
-  }
-
-  /// Closes this server.
-  Future close() => _server.close();
-}
-
-/// Ensures that [stream] can emit at least one value successfully (or close
-/// without any values).
-///
-/// For example, reading asynchronously from a non-existent file will return a
-/// stream that fails on the first chunk. In order to handle that more
-/// gracefully, you may want to check that the stream looks like it's working
-/// before you pipe the stream to something else.
-///
-/// This lets you do that. It returns a [Future] that completes to a [Stream]
-/// emitting the same values and errors as [stream], but only if at least one
-/// value can be read successfully. If an error occurs before any values are
-/// emitted, the returned Future completes to that error.
-Future<Stream<T>> _validateStream<T>(Stream<T> stream) {
-  var completer = Completer<Stream<T>>();
-  var controller = StreamController<T>(sync: true);
-
-  late StreamSubscription subscription;
-  subscription = stream.listen((value) {
-    // We got a value, so the stream is valid.
-    if (!completer.isCompleted) completer.complete(controller.stream);
-    controller.add(value);
-  }, onError: (error, [StackTrace? stackTrace]) {
-    // If the error came after values, it's OK.
-    if (completer.isCompleted) {
-      controller.addError(error, stackTrace);
-      return;
-    }
-
-    // Otherwise, the error came first and the stream is invalid.
-    completer.completeError(error, stackTrace);
-
-    // We won't be returning the stream at all in this case, so unsubscribe
-    // and swallow the error.
-    subscription.cancel();
-  }, onDone: () {
-    // It closed with no errors, so the stream is valid.
-    if (!completer.isCompleted) completer.complete(controller.stream);
-    controller.close();
-  });
-
-  return completer.future;
-}
diff --git a/test/directory_option_test.dart b/test/directory_option_test.dart
index 4458199..65193bf 100644
--- a/test/directory_option_test.dart
+++ b/test/directory_option_test.dart
@@ -14,20 +14,21 @@
 Future<void> main() async {
   testWithGolden('commands taking a --directory/-C parameter work',
       (ctx) async {
-    await servePackages((b) => b
+    await servePackages()
       ..serve('foo', '1.0.0')
       ..serve('foo', '0.1.2')
-      ..serve('bar', '1.2.3'));
-    await credentialsFile(globalPackageServer, 'access token').create();
-    globalPackageServer
-        .extraHandlers[RegExp('/api/packages/test_pkg/uploaders')] = (request) {
-      return shelf.Response.ok(
-        jsonEncode({
-          'success': {'message': 'Good job!'}
-        }),
-        headers: {'content-type': 'application/json'},
-      );
-    };
+      ..serve('bar', '1.2.3');
+    await credentialsFile(globalServer, 'access token').create();
+    globalServer.handle(
+      RegExp('/api/packages/test_pkg/uploaders'),
+      (request) {
+        return shelf.Response.ok(
+            jsonEncode({
+              'success': {'message': 'Good job!'}
+            }),
+            headers: {'content-type': 'application/json'});
+      },
+    );
 
     await validPackage.create();
     await dir(appPath, [
diff --git a/test/downgrade/does_not_show_other_versions_test.dart b/test/downgrade/does_not_show_other_versions_test.dart
index ca872c8..884bbaf 100644
--- a/test/downgrade/does_not_show_other_versions_test.dart
+++ b/test/downgrade/does_not_show_other_versions_test.dart
@@ -9,11 +9,10 @@
 
 void main() {
   test('does not show how many other versions are available', () async {
-    await servePackages((builder) {
-      builder.serve('downgraded', '1.0.0');
-      builder.serve('downgraded', '2.0.0');
-      builder.serve('downgraded', '3.0.0-dev');
-    });
+    await servePackages()
+      ..serve('downgraded', '1.0.0')
+      ..serve('downgraded', '2.0.0')
+      ..serve('downgraded', '3.0.0-dev');
 
     await d.appDir({'downgraded': '3.0.0-dev'}).create();
 
diff --git a/test/downgrade/dry_run_does_not_apply_changes_test.dart b/test/downgrade/dry_run_does_not_apply_changes_test.dart
index ebe2dbf..38fbebe 100644
--- a/test/downgrade/dry_run_does_not_apply_changes_test.dart
+++ b/test/downgrade/dry_run_does_not_apply_changes_test.dart
@@ -11,10 +11,9 @@
 
 void main() {
   test('--dry-run shows report but does not apply changes', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0');
 
     // Create the first lockfile.
     await d.appDir({'foo': '2.0.0'}).create();
diff --git a/test/downgrade/unlock_if_necessary_test.dart b/test/downgrade/unlock_if_necessary_test.dart
index 8024eee..0299e27 100644
--- a/test/downgrade/unlock_if_necessary_test.dart
+++ b/test/downgrade/unlock_if_necessary_test.dart
@@ -11,10 +11,9 @@
   test(
       "downgrades one locked hosted package's dependencies if it's "
       'necessary', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '2.0.0', deps: {'foo_dep': 'any'});
-      builder.serve('foo_dep', '2.0.0');
-    });
+    final server = await servePackages();
+    server.serve('foo', '2.0.0', deps: {'foo_dep': 'any'});
+    server.serve('foo_dep', '2.0.0');
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -22,10 +21,8 @@
 
     await d.appPackagesFile({'foo': '2.0.0', 'foo_dep': '2.0.0'}).validate();
 
-    globalPackageServer.add((builder) {
-      builder.serve('foo', '1.0.0', deps: {'foo_dep': '<2.0.0'});
-      builder.serve('foo_dep', '1.0.0');
-    });
+    server.serve('foo', '1.0.0', deps: {'foo_dep': '<2.0.0'});
+    server.serve('foo_dep', '1.0.0');
 
     await pubDowngrade(args: ['foo']);
 
diff --git a/test/downgrade/unlock_single_package_test.dart b/test/downgrade/unlock_single_package_test.dart
index e381f37..cfd315d 100644
--- a/test/downgrade/unlock_single_package_test.dart
+++ b/test/downgrade/unlock_single_package_test.dart
@@ -9,28 +9,23 @@
 
 void main() {
   test('can unlock a single package only in downgrade', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '2.1.0', deps: {'bar': '>1.0.0'});
-      builder.serve('bar', '2.1.0');
-    });
+    final server = await servePackages();
+    server.serve('foo', '2.1.0', deps: {'bar': '>1.0.0'});
+    server.serve('bar', '2.1.0');
 
     await d.appDir({'foo': 'any', 'bar': 'any'}).create();
 
     await pubGet();
     await d.appPackagesFile({'foo': '2.1.0', 'bar': '2.1.0'}).validate();
 
-    globalPackageServer.add((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
-      builder.serve('bar', '1.0.0');
-    });
+    server.serve('foo', '1.0.0', deps: {'bar': 'any'});
+    server.serve('bar', '1.0.0');
 
     await pubDowngrade(args: ['bar']);
     await d.appPackagesFile({'foo': '2.1.0', 'bar': '2.1.0'}).validate();
 
-    globalPackageServer.add((builder) {
-      builder.serve('foo', '2.0.0', deps: {'bar': 'any'});
-      builder.serve('bar', '2.0.0');
-    });
+    server.serve('foo', '2.0.0', deps: {'bar': 'any'});
+    server.serve('bar', '2.0.0');
 
     await pubDowngrade(args: ['bar']);
     await d.appPackagesFile({'foo': '2.1.0', 'bar': '2.0.0'}).validate();
@@ -40,11 +35,10 @@
   });
 
   test('will not downgrade below constraint #2629', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0');
-      builder.serve('foo', '2.1.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0')
+      ..serve('foo', '2.1.0');
 
     await d.appDir({'foo': '^2.0.0'}).create();
 
diff --git a/test/embedding/embedding_test.dart b/test/embedding/embedding_test.dart
index faef3b0..ccb16f6 100644
--- a/test/embedding/embedding_test.dart
+++ b/test/embedding/embedding_test.dart
@@ -111,9 +111,9 @@
   });
 
   test('analytics', () async {
-    await servePackages((b) => b
+    await servePackages()
       ..serve('foo', '1.0.0', deps: {'bar': 'any'})
-      ..serve('bar', '1.0.0'));
+      ..serve('bar', '1.0.0');
     await d.dir('dep', [
       d.pubspec({
         'name': 'dep',
diff --git a/test/embedding/get_executable_for_command_test.dart b/test/embedding/get_executable_for_command_test.dart
index a74da6a..0edfa72 100644
--- a/test/embedding/get_executable_for_command_test.dart
+++ b/test/embedding/get_executable_for_command_test.dart
@@ -129,7 +129,7 @@
       ])
     ]).create();
 
-    await serveNoPackages();
+    await servePackages();
     // The solver uses word-wrapping in its error message, so we use \s to
     // accomodate.
     await testGetExecutable(
@@ -166,7 +166,7 @@
       ])
     ]).create();
 
-    await serveNoPackages();
+    await servePackages();
     // The solver uses word-wrapping in its error message, so we use \s to
     // accomodate.
     await testGetExecutable(
@@ -178,15 +178,15 @@
   });
 
   test('Finds files', () async {
-    await servePackages((b) => b
-      ..serve('foo', '1.0.0', pubspec: {
-        'environment': {'sdk': '>=$_currentVersion <3.0.0'}
-      }, contents: [
-        d.dir('bin', [
-          d.file('foo.dart', 'main() {print(42);}'),
-          d.file('tool.dart', 'main() {print(42);}')
-        ])
-      ]));
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'environment': {'sdk': '>=$_currentVersion <3.0.0'}
+    }, contents: [
+      d.dir('bin', [
+        d.file('foo.dart', 'main() {print(42);}'),
+        d.file('tool.dart', 'main() {print(42);}')
+      ])
+    ]);
 
     await d.dir(appPath, [
       d.pubspec({
diff --git a/test/get/dry_run_does_not_apply_changes_test.dart b/test/get/dry_run_does_not_apply_changes_test.dart
index 27969ae..3e44bf9 100644
--- a/test/get/dry_run_does_not_apply_changes_test.dart
+++ b/test/get/dry_run_does_not_apply_changes_test.dart
@@ -9,9 +9,8 @@
 
 void main() {
   test('--dry-run shows but does not apply changes', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await d.appDir({'foo': '1.0.0'}).create();
 
diff --git a/test/get/hosted/avoid_network_requests_test.dart b/test/get/hosted/avoid_network_requests_test.dart
index 369a187..8778ae6 100644
--- a/test/get/hosted/avoid_network_requests_test.dart
+++ b/test/get/hosted/avoid_network_requests_test.dart
@@ -9,14 +9,13 @@
 
 void main() {
   test('only requests versions that are needed during solving', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '1.1.0');
-      builder.serve('foo', '1.2.0');
-      builder.serve('bar', '1.0.0');
-      builder.serve('bar', '1.1.0');
-      builder.serve('bar', '1.2.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '1.1.0')
+      ..serve('foo', '1.2.0')
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '1.1.0')
+      ..serve('bar', '1.2.0');
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -25,7 +24,7 @@
 
     // Clear the cache. We don't care about anything that was served during
     // the initial get.
-    globalServer!.requestedPaths.clear();
+    globalServer.requestedPaths.clear();
 
     // Add "bar" to the dependencies.
     await d.appDir({'foo': 'any', 'bar': 'any'}).create();
@@ -38,7 +37,7 @@
     // The get should not have done any network requests since the lock file is
     // up to date.
     expect(
-        globalServer!.requestedPaths,
+        globalServer.requestedPaths,
         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 88551ac..beb4e16 100644
--- a/test/get/hosted/cached_pubspec_test.dart
+++ b/test/get/hosted/cached_pubspec_test.dart
@@ -9,7 +9,8 @@
 
 void main() {
   test('does not request a pubspec for a cached package', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     await d.appDir({'foo': '1.2.3'}).create();
 
@@ -18,7 +19,7 @@
 
     // Clear the cache. We don't care about anything that was served during
     // the initial get.
-    globalServer!.requestedPaths.clear();
+    server.requestedPaths.clear();
 
     await d.cacheDir({'foo': '1.2.3'}).validate();
     await d.appPackagesFile({'foo': '1.2.3'}).validate();
@@ -27,7 +28,7 @@
     await pubGet();
 
     // The get should not have requested the pubspec since it's local already.
-    expect(globalServer!.requestedPaths,
+    expect(server.requestedPaths,
         isNot(contains('packages/foo/versions/1.2.3.yaml')));
   });
 }
diff --git a/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart b/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart
index 30e4a65..00b2444 100644
--- a/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart
+++ b/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart
@@ -11,12 +11,11 @@
   test(
       "doesn't upgrade dependencies whose constraints have been "
       'removed', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'shared_dep': 'any'});
-      builder.serve('bar', '1.0.0', deps: {'shared_dep': '<2.0.0'});
-      builder.serve('shared_dep', '1.0.0');
-      builder.serve('shared_dep', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'shared_dep': 'any'})
+      ..serve('bar', '1.0.0', deps: {'shared_dep': '<2.0.0'})
+      ..serve('shared_dep', '1.0.0')
+      ..serve('shared_dep', '2.0.0');
 
     await d.appDir({'foo': 'any', 'bar': 'any'}).create();
 
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 3038624..ea1f4a7 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
@@ -9,11 +9,10 @@
 
 void main() {
   test('does not request versions if the lockfile is up to date', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '1.1.0');
-      builder.serve('foo', '1.2.0');
-    });
+    final server = await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '1.1.0')
+      ..serve('foo', '1.2.0');
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -22,7 +21,7 @@
 
     // Clear the cache. We don't care about anything that was served during
     // the initial get.
-    globalServer!.requestedPaths.clear();
+    server.requestedPaths.clear();
 
     // Run the solver again now that it's cached.
     await pubGet();
@@ -32,6 +31,6 @@
 
     // The get should not have done any network requests since the lock file is
     // up to date.
-    expect(globalServer!.requestedPaths, isEmpty);
+    expect(server.requestedPaths, isEmpty);
   });
 }
diff --git a/test/get/hosted/explain_bad_hosted_url_test.dart b/test/get/hosted/explain_bad_hosted_url_test.dart
index 5b3ff2e..feebf67 100644
--- a/test/get/hosted/explain_bad_hosted_url_test.dart
+++ b/test/get/hosted/explain_bad_hosted_url_test.dart
@@ -32,11 +32,12 @@
   });
 
   test('Allows PUB_HOSTED_URL to end with a slash', () async {
-    await servePackages((b) => b.serve('foo', '1.0.0'));
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
     await d.appDir({'foo': 'any'}).create();
 
     await pubGet(
-      environment: {'PUB_HOSTED_URL': '${globalPackageServer.url}/'},
+      environment: {'PUB_HOSTED_URL': '${globalServer.url}/'},
     );
   });
 }
diff --git a/test/get/hosted/get_stress_test.dart b/test/get/hosted/get_stress_test.dart
index da45309..86a8da9 100644
--- a/test/get/hosted/get_stress_test.dart
+++ b/test/get/hosted/get_stress_test.dart
@@ -9,12 +9,11 @@
 
 void main() {
   test('gets more than 16 packages from a pub server', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.3');
-      for (var i = 0; i < 20; i++) {
-        builder.serve('pkg$i', '1.$i.0');
-      }
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
+    for (var i = 0; i < 20; i++) {
+      server.serve('pkg$i', '1.$i.0');
+    }
 
     await d.appDir({
       'foo': '1.2.3',
diff --git a/test/get/hosted/get_test.dart b/test/get/hosted/get_test.dart
index 31c1f2e..30dd4b8 100644
--- a/test/get/hosted/get_test.dart
+++ b/test/get/hosted/get_test.dart
@@ -13,7 +13,8 @@
 
 void main() {
   test('gets a package from a pub server', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     await d.appDir({'foo': '1.2.3'}).create();
 
@@ -24,7 +25,7 @@
   });
 
   test('URL encodes the package name', () async {
-    await serveNoPackages();
+    await servePackages();
 
     await d.appDir({'bad name!': '1.2.3'}).create();
 
@@ -41,11 +42,10 @@
   test('gets a package from a non-default pub server', () async {
     // Make the default server serve errors. Only the custom server should
     // be accessed.
-    await serveErrors();
+    (await servePackages()).serveErrors();
 
-    var server = await PackageServer.start((builder) {
-      builder.serve('foo', '1.2.3');
-    });
+    var server = await startPackageServer();
+    server.serve('foo', '1.2.3');
 
     await d.appDir({
       'foo': {
@@ -61,14 +61,15 @@
   });
 
   group('categorizes dependency types in the lockfile', () {
-    setUp(() => servePackages((builder) {
-          builder.serve('foo', '1.2.3', deps: {'bar': 'any'});
-          builder.serve('bar', '1.2.3');
-          builder.serve('baz', '1.2.3', deps: {'qux': 'any'});
-          builder.serve('qux', '1.2.3');
-          builder.serve('zip', '1.2.3', deps: {'zap': 'any'});
-          builder.serve('zap', '1.2.3');
-        }));
+    setUp(() async {
+      await servePackages()
+        ..serve('foo', '1.2.3', deps: {'bar': 'any'})
+        ..serve('bar', '1.2.3')
+        ..serve('baz', '1.2.3', deps: {'qux': 'any'})
+        ..serve('qux', '1.2.3')
+        ..serve('zip', '1.2.3', deps: {'zap': 'any'})
+        ..serve('zap', '1.2.3');
+    });
 
     test('for main, dev, and overridden dependencies', () async {
       await d.dir(appPath, [
diff --git a/test/get/hosted/get_transitive_test.dart b/test/get/hosted/get_transitive_test.dart
index f68006a..74635bc 100644
--- a/test/get/hosted/get_transitive_test.dart
+++ b/test/get/hosted/get_transitive_test.dart
@@ -9,12 +9,11 @@
 
 void main() {
   test('gets packages transitively from a pub server', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.3', deps: {'bar': '2.0.4'});
-      builder.serve('bar', '2.0.3');
-      builder.serve('bar', '2.0.4');
-      builder.serve('bar', '2.0.5');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.3', deps: {'bar': '2.0.4'})
+      ..serve('bar', '2.0.3')
+      ..serve('bar', '2.0.4')
+      ..serve('bar', '2.0.5');
 
     await d.appDir({'foo': '1.2.3'}).create();
 
diff --git a/test/get/hosted/gets_a_package_with_busted_dev_dependencies_test.dart b/test/get/hosted/gets_a_package_with_busted_dev_dependencies_test.dart
index c53079c..0d75f95 100644
--- a/test/get/hosted/gets_a_package_with_busted_dev_dependencies_test.dart
+++ b/test/get/hosted/gets_a_package_with_busted_dev_dependencies_test.dart
@@ -12,12 +12,11 @@
   test(
       'gets a dependency with broken dev dependencies from a pub '
       'server', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.3', pubspec: {
-        'dev_dependencies': {
-          'busted': {'not a real source': null}
-        }
-      });
+    final server = await servePackages();
+    server.serve('foo', '1.2.3', pubspec: {
+      'dev_dependencies': {
+        'busted': {'not a real source': null}
+      }
     });
 
     await d.appDir({'foo': '1.2.3'}).create();
diff --git a/test/get/hosted/resolve_constraints_test.dart b/test/get/hosted/resolve_constraints_test.dart
index c515c8e..c9c73d2 100644
--- a/test/get/hosted/resolve_constraints_test.dart
+++ b/test/get/hosted/resolve_constraints_test.dart
@@ -9,13 +9,12 @@
 
 void main() {
   test('resolves version constraints from a pub server', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.3', deps: {'baz': '>=2.0.0'});
-      builder.serve('bar', '2.3.4', deps: {'baz': '<3.0.0'});
-      builder.serve('baz', '2.0.3');
-      builder.serve('baz', '2.0.4');
-      builder.serve('baz', '3.0.1');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.3', deps: {'baz': '>=2.0.0'})
+      ..serve('bar', '2.3.4', deps: {'baz': '<3.0.0'})
+      ..serve('baz', '2.0.3')
+      ..serve('baz', '2.0.4')
+      ..serve('baz', '3.0.1');
 
     await d.appDir({'foo': 'any', 'bar': 'any'}).create();
 
diff --git a/test/get/hosted/resolve_with_retracted_package_versions_test.dart b/test/get/hosted/resolve_with_retracted_package_versions_test.dart
index 045fb15..efd3a0a 100644
--- a/test/get/hosted/resolve_with_retracted_package_versions_test.dart
+++ b/test/get/hosted/resolve_with_retracted_package_versions_test.dart
@@ -13,14 +13,13 @@
 
 void main() {
   test('Do not consider retracted packages', () async {
-    await servePackages((builder) => builder
+    final server = await servePackages()
       ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
       ..serve('bar', '1.0.0')
-      ..serve('bar', '1.1.0'));
+      ..serve('bar', '1.1.0');
     await d.appDir({'foo': '1.0.0'}).create();
 
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('bar', '1.1.0'));
+    server.retractPackageVersion('bar', '1.1.0');
     await pubGet();
 
     await d.cacheDir({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
@@ -28,13 +27,12 @@
   });
 
   test('Error when the only available package version is retracted', () async {
-    await servePackages((builder) => builder
+    final server = await servePackages()
       ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
-      ..serve('bar', '1.0.0'));
+      ..serve('bar', '1.0.0');
     await d.appDir({'foo': '1.0.0'}).create();
 
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('bar', '1.0.0'));
+    server.retractPackageVersion('bar', '1.0.0');
     await pubGet(
         error:
             '''Because every version of foo depends on bar ^1.0.0 which doesn't match any versions, foo is forbidden. 
@@ -47,28 +45,27 @@
   // In this case we expect a newer version to be published at some point which
   // will then cause pub upgrade to choose that one.
   test('Allow retracted version when it was already in pubspec.lock', () async {
-    await servePackages((builder) => builder
+    final server = await servePackages()
       ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
       ..serve('bar', '1.0.0')
-      ..serve('bar', '1.1.0'));
+      ..serve('bar', '1.1.0');
     await d.appDir({'foo': '1.0.0'}).create();
 
     await pubGet();
     await d.cacheDir({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
     await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
 
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('bar', '1.1.0'));
+    server.retractPackageVersion('bar', '1.1.0');
     await pubUpgrade();
     await d.cacheDir({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
     await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
 
-    globalPackageServer.add((builder) => builder..serve('bar', '2.0.0'));
+    server.serve('bar', '2.0.0');
     await pubUpgrade();
     await d.cacheDir({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
     await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
 
-    globalPackageServer.add((builder) => builder..serve('bar', '1.2.0'));
+    server.serve('bar', '1.2.0');
     await pubUpgrade();
     await d.cacheDir({'foo': '1.0.0', 'bar': '1.2.0'}).validate();
     await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.2.0'}).validate();
@@ -76,10 +73,11 @@
 
   test('Offline versions of pub commands also handle retracted packages',
       () async {
+    final server = await servePackages();
     await populateCache({
       'foo': ['1.0.0'],
       'bar': ['1.0.0', '1.1.0']
-    });
+    }, server);
 
     await d.cacheDir({
       'foo': '1.0.0',
@@ -87,18 +85,17 @@
     }).validate();
 
     final barVersionsCache =
-        p.join(globalPackageServer.cachingPath, '.cache', 'bar-versions.json');
+        p.join(globalServer.cachingPath, '.cache', 'bar-versions.json');
     expect(fileExists(barVersionsCache), isTrue);
     deleteEntry(barVersionsCache);
 
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('bar', '1.1.0'));
+    server.retractPackageVersion('bar', '1.1.0');
     await pubGet();
 
     await d.cacheDir({'bar': '1.1.0'}).validate();
 
     // Now serve only errors - to validate we are truly offline.
-    await serveErrors();
+    server.serveErrors();
 
     await d.appDir({'foo': '1.0.0', 'bar': '^1.0.0'}).create();
 
@@ -117,11 +114,10 @@
   });
 
   test('Allow retracted version when pinned in dependency_overrides', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0');
-      builder.serve('foo', '3.0.0');
-    });
+    final server = await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0')
+      ..serve('foo', '3.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -131,8 +127,7 @@
       })
     ]).create();
 
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('foo', '2.0.0'));
+    server.retractPackageVersion('foo', '2.0.0');
 
     await pubGet();
     await d.appPackagesFile({'foo': '2.0.0'}).validate();
@@ -140,19 +135,16 @@
 
   test('Prefer retracted version in dependency_overrides over pubspec.lock',
       () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0');
-      builder.serve('foo', '3.0.0');
-    });
+    final server = await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0')
+      ..serve('foo', '3.0.0');
 
     await d.appDir({'foo': 'any'}).create();
     await pubGet();
 
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('foo', '2.0.0'));
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('foo', '3.0.0'));
+    server.retractPackageVersion('foo', '2.0.0');
+    server.retractPackageVersion('foo', '3.0.0');
 
     await pubUpgrade();
     await d.appPackagesFile({'foo': '3.0.0'}).validate();
diff --git a/test/get/hosted/stay_locked_if_compatible_test.dart b/test/get/hosted/stay_locked_if_compatible_test.dart
index 716f734..bb5e63a 100644
--- a/test/get/hosted/stay_locked_if_compatible_test.dart
+++ b/test/get/hosted/stay_locked_if_compatible_test.dart
@@ -11,7 +11,8 @@
   test(
       "doesn't upgrade a locked pub server package with a new "
       'compatible constraint', () async {
-    await servePackages((builder) => builder.serve('foo', '1.0.0'));
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -19,7 +20,7 @@
 
     await d.appPackagesFile({'foo': '1.0.0'}).validate();
 
-    globalPackageServer.add((builder) => builder.serve('foo', '1.0.1'));
+    server.serve('foo', '1.0.1');
 
     await 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 41fd315..dbe6039 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
@@ -11,11 +11,10 @@
   test(
       "doesn't unlock dependencies if a new dependency is already "
       'satisfied', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
-      builder.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
-      builder.serve('baz', '1.0.0');
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
+    server.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
+    server.serve('baz', '1.0.0');
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -24,12 +23,10 @@
     await d.appPackagesFile(
         {'foo': '1.0.0', 'bar': '1.0.0', 'baz': '1.0.0'}).validate();
 
-    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');
-      builder.serve('newdep', '2.0.0', deps: {'baz': '>=1.0.0'});
-    });
+    server.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
+    server.serve('bar', '2.0.0', deps: {'baz': '<3.0.0'});
+    server.serve('baz', '2.0.0');
+    server.serve('newdep', '2.0.0', deps: {'baz': '>=1.0.0'});
 
     await d.appDir({'foo': 'any', 'newdep': 'any'}).create();
 
diff --git a/test/get/hosted/stay_locked_test.dart b/test/get/hosted/stay_locked_test.dart
index 216b7d6..134e8b5 100644
--- a/test/get/hosted/stay_locked_test.dart
+++ b/test/get/hosted/stay_locked_test.dart
@@ -13,7 +13,8 @@
   test(
       'keeps a hosted package locked to the version in the '
       'lockfile', () async {
-    await servePackages((builder) => builder.serve('foo', '1.0.0'));
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -26,7 +27,7 @@
     deleteEntry(path.join(d.sandbox, packageConfigFilePath));
 
     // Start serving a newer package as well.
-    globalPackageServer.add((builder) => builder.serve('foo', '1.0.1'));
+    server.serve('foo', '1.0.1');
 
     // This shouldn't upgrade the foo dependency due to the lockfile.
     await pubGet();
diff --git a/test/get/hosted/unlock_if_incompatible_test.dart b/test/get/hosted/unlock_if_incompatible_test.dart
index 56ad89a..11bf909 100644
--- a/test/get/hosted/unlock_if_incompatible_test.dart
+++ b/test/get/hosted/unlock_if_incompatible_test.dart
@@ -11,14 +11,15 @@
   test(
       'upgrades a locked pub server package with a new incompatible '
       'constraint', () async {
-    await servePackages((builder) => builder.serve('foo', '1.0.0'));
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await d.appDir({'foo': 'any'}).create();
 
     await pubGet();
 
     await d.appPackagesFile({'foo': '1.0.0'}).validate();
-    globalPackageServer.add((builder) => builder.serve('foo', '1.0.1'));
+    server.serve('foo', '1.0.1');
     await d.appDir({'foo': '>1.0.0'}).create();
 
     await 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 082bb1e..1cedc5a 100644
--- a/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart
+++ b/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart
@@ -11,12 +11,12 @@
   test(
       'unlocks dependencies if necessary to ensure that a new '
       'dependency is satisfied', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
-      builder.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
-      builder.serve('baz', '1.0.0', deps: {'qux': '<2.0.0'});
-      builder.serve('qux', '1.0.0');
-    });
+    final server = await servePackages();
+
+    server.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
+    server.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
+    server.serve('baz', '1.0.0', deps: {'qux': '<2.0.0'});
+    server.serve('qux', '1.0.0');
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -29,13 +29,11 @@
       'qux': '1.0.0'
     }).validate();
 
-    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'});
-      builder.serve('qux', '2.0.0');
-      builder.serve('newdep', '2.0.0', deps: {'baz': '>=1.5.0'});
-    });
+    server.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
+    server.serve('bar', '2.0.0', deps: {'baz': '<3.0.0'});
+    server.serve('baz', '2.0.0', deps: {'qux': '<3.0.0'});
+    server.serve('qux', '2.0.0');
+    server.serve('newdep', '2.0.0', deps: {'baz': '>=1.5.0'});
 
     await d.appDir({'foo': 'any', 'newdep': 'any'}).create();
 
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 8e6e9dd..7eb4246 100644
--- a/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
+++ b/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
@@ -12,7 +12,8 @@
 void main() {
   test('upgrades a locked pub server package with a nonexistent version',
       () async {
-    await servePackages((builder) => builder.serve('foo', '1.0.0'));
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await d.appDir({'foo': 'any'}).create();
     await pubGet();
@@ -20,7 +21,9 @@
 
     deleteEntry(p.join(d.sandbox, cachePath));
 
-    globalPackageServer.replace((builder) => builder.serve('foo', '1.0.1'));
+    server.clearPackages();
+    server.serve('foo', '1.0.1');
+
     await pubGet();
     await d.appPackagesFile({'foo': '1.0.1'}).validate();
   });
diff --git a/test/get/hosted/warn_about_discontinued_test.dart b/test/get/hosted/warn_about_discontinued_test.dart
index 89a19e0..7057f9b 100644
--- a/test/get/hosted/warn_about_discontinued_test.dart
+++ b/test/get/hosted/warn_about_discontinued_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:path/path.dart' as p;
 import 'package:pub/src/io.dart';
-import 'package:shelf/shelf.dart';
+import 'package:shelf/shelf.dart' as shelf;
 import 'package:test/test.dart';
 
 import '../../descriptor.dart' as d;
@@ -14,22 +14,22 @@
 
 void main() {
   test('Warns about discontinued dependencies', () async {
-    await servePackages((builder) => builder
-      ..serve('foo', '1.2.3', deps: {'transitive': 'any'})
-      ..serve('transitive', '1.0.0'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3', deps: {'transitive': 'any'});
+    server.serve('transitive', '1.0.0');
     await d.appDir({'foo': '1.2.3'}).create();
     await pubGet();
 
-    globalPackageServer.add((builder) => builder
+    server
       ..discontinue('foo')
-      ..discontinue('transitive'));
+      ..discontinue('transitive');
     // A pub get straight away will not trigger the warning, as we cache
     // responses for a while.
     await pubGet();
     final fooVersionsCache =
-        p.join(globalPackageServer.cachingPath, '.cache', 'foo-versions.json');
-    final transitiveVersionsCache = p.join(
-        globalPackageServer.cachingPath, '.cache', 'transitive-versions.json');
+        p.join(globalServer.cachingPath, '.cache', 'foo-versions.json');
+    final transitiveVersionsCache =
+        p.join(globalServer.cachingPath, '.cache', 'transitive-versions.json');
     expect(fileExists(fooVersionsCache), isTrue);
     expect(fileExists(transitiveVersionsCache), isTrue);
     deleteEntry(fooVersionsCache);
@@ -46,8 +46,9 @@
     c['_fetchedAt'] =
         DateTime.now().subtract(Duration(days: 5)).toIso8601String();
     writeTextFile(fooVersionsCache, json.encode(c));
-    globalPackageServer
-        .add((builder) => builder.discontinue('foo', replacementText: 'bar'));
+
+    server.discontinue('foo', replacementText: 'bar');
+
     await pubGet(output: '''
 Resolving dependencies...
   foo 1.2.3 (discontinued replaced by bar)
@@ -67,7 +68,7 @@
 Got dependencies!''');
     // Test that --offline won't try to access the server for retrieving the
     // status.
-    await serveErrors();
+    server.serveErrors();
     await pubGet(args: ['--offline'], output: '''
 Resolving dependencies...
   foo 1.2.3 (discontinued replaced by bar)
@@ -81,9 +82,10 @@
   });
 
   test('Warns about discontinued dev dependencies', () async {
-    await servePackages((builder) => builder
+    final builder = await servePackages();
+    builder
       ..serve('foo', '1.2.3', deps: {'transitive': 'any'})
-      ..serve('transitive', '1.0.0'));
+      ..serve('transitive', '1.0.0');
 
     await d.dir(appPath, [
       d.file('pubspec.yaml', '''
@@ -98,14 +100,14 @@
     ]).create();
     await pubGet();
 
-    globalPackageServer.add((builder) => builder
+    builder
       ..discontinue('foo')
-      ..discontinue('transitive'));
+      ..discontinue('transitive');
     // A pub get straight away will not trigger the warning, as we cache
     // responses for a while.
     await pubGet();
     final fooVersionsCache =
-        p.join(globalPackageServer.cachingPath, '.cache', 'foo-versions.json');
+        p.join(globalServer.cachingPath, '.cache', 'foo-versions.json');
     expect(fileExists(fooVersionsCache), isTrue);
     deleteEntry(fooVersionsCache);
     // We warn only about the direct dependency here:
@@ -120,8 +122,7 @@
     c['_fetchedAt'] =
         DateTime.now().subtract(Duration(days: 5)).toIso8601String();
     writeTextFile(fooVersionsCache, json.encode(c));
-    globalPackageServer
-        .add((builder) => builder.discontinue('foo', replacementText: 'bar'));
+    builder.discontinue('foo', replacementText: 'bar');
     await pubGet(output: '''
 Resolving dependencies...
   foo 1.2.3 (discontinued replaced by bar)
@@ -141,7 +142,7 @@
 Got dependencies!''');
     // Test that --offline won't try to access the server for retrieving the
     // status.
-    await serveErrors();
+    builder.serveErrors();
     await pubGet(args: ['--offline'], output: '''
 Resolving dependencies...
   foo 1.2.3 (discontinued replaced by bar)
@@ -154,17 +155,17 @@
   });
 
   test('get does not fail when status listing fails', () async {
-    await servePackages((builder) => builder..serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
     await d.appDir({'foo': '1.2.3'}).create();
     await pubGet();
     final fooVersionsCache =
-        p.join(globalPackageServer.cachingPath, '.cache', 'foo-versions.json');
+        p.join(globalServer.cachingPath, '.cache', 'foo-versions.json');
     expect(fileExists(fooVersionsCache), isTrue);
     deleteEntry(fooVersionsCache);
     // Serve 400 on all requests.
-    globalPackageServer.extraHandlers
-      ..clear()
-      ..[RegExp('.*')] = (request) async => Response(400);
+    globalServer.handle(RegExp('.*'),
+        (shelf.Request request) => shelf.Response.notFound('Not found'));
 
     /// Even if we fail to get status we still report success if versions don't unlock.
     await pubGet();
diff --git a/test/get/hosted/warn_about_retracted_package_test.dart b/test/get/hosted/warn_about_retracted_package_test.dart
index 750dc87..2336c7f 100644
--- a/test/get/hosted/warn_about_retracted_package_test.dart
+++ b/test/get/hosted/warn_about_retracted_package_test.dart
@@ -11,38 +11,36 @@
 
 void main() {
   test('Report retracted packages', () async {
-    await servePackages((builder) => builder
+    final server = await servePackages()
       ..serve('foo', '1.0.0', deps: {'bar': 'any'})
-      ..serve('bar', '1.0.0'));
+      ..serve('bar', '1.0.0');
     await d.appDir({'foo': '1.0.0'}).create();
 
     await pubGet();
 
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('bar', '1.0.0'));
+    server.retractPackageVersion('bar', '1.0.0');
     // Delete the cache to trigger the report.
     final barVersionsCache =
-        p.join(globalPackageServer.cachingPath, '.cache', 'bar-versions.json');
+        p.join(server.cachingPath, '.cache', 'bar-versions.json');
     expect(fileExists(barVersionsCache), isTrue);
     deleteEntry(barVersionsCache);
     await pubGet(output: contains('bar 1.0.0 (retracted)'));
   });
 
   test('Report retracted packages with newer version available', () async {
-    await servePackages((builder) => builder
+    final server = await servePackages()
       ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
       ..serve('bar', '1.0.0')
       ..serve('bar', '2.0.0')
-      ..serve('bar', '2.0.1-pre'));
+      ..serve('bar', '2.0.1-pre');
     await d.appDir({'foo': '1.0.0'}).create();
 
     await pubGet();
 
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('bar', '1.0.0'));
+    server.retractPackageVersion('bar', '1.0.0');
     // Delete the cache to trigger the report.
     final barVersionsCache =
-        p.join(globalPackageServer.cachingPath, '.cache', 'bar-versions.json');
+        p.join(server.cachingPath, '.cache', 'bar-versions.json');
     expect(fileExists(barVersionsCache), isTrue);
     deleteEntry(barVersionsCache);
     await pubGet(output: contains('bar 1.0.0 (retracted, 2.0.0 available)'));
@@ -50,19 +48,18 @@
 
   test('Report retracted packages with newer prerelease version available',
       () async {
-    await servePackages((builder) => builder
+    final server = await servePackages()
       ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0-pre'})
       ..serve('bar', '1.0.0-pre')
-      ..serve('bar', '2.0.1-pre'));
+      ..serve('bar', '2.0.1-pre');
     await d.appDir({'foo': '1.0.0'}).create();
 
     await pubGet();
 
-    globalPackageServer
-        .add((builder) => builder..retractPackageVersion('bar', '1.0.0-pre'));
+    server.retractPackageVersion('bar', '1.0.0-pre');
     // Delete the cache to trigger the report.
     final barVersionsCache =
-        p.join(globalPackageServer.cachingPath, '.cache', 'bar-versions.json');
+        p.join(server.cachingPath, '.cache', 'bar-versions.json');
     expect(fileExists(barVersionsCache), isTrue);
     deleteEntry(barVersionsCache);
     await pubGet(
diff --git a/test/get/switch_source_test.dart b/test/get/switch_source_test.dart
index dd8c97d..ffbf8b4 100644
--- a/test/get/switch_source_test.dart
+++ b/test/get/switch_source_test.dart
@@ -9,7 +9,8 @@
 
 void main() {
   test('re-gets a package if its source has changed', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     await d.dir('foo',
         [d.libDir('foo', 'foo 0.0.1'), d.libPubspec('foo', '0.0.1')]).create();
diff --git a/test/get/with_empty_environment_test.dart b/test/get/with_empty_environment_test.dart
index 9a9f9e2..30768c4 100644
--- a/test/get/with_empty_environment_test.dart
+++ b/test/get/with_empty_environment_test.dart
@@ -11,7 +11,8 @@
 
 void main() {
   test(r'runs even with an empty environment (eg. no $HOME)', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     await d.appDir({'foo': 'any'}).create();
 
diff --git a/test/global/activate/activate_git_after_hosted_test.dart b/test/global/activate/activate_git_after_hosted_test.dart
index 75925d3..c553041 100644
--- a/test/global/activate/activate_git_after_hosted_test.dart
+++ b/test/global/activate/activate_git_after_hosted_test.dart
@@ -11,11 +11,10 @@
   test('activating a Git package deactivates the hosted one', () async {
     ensureGit();
 
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
+    ]);
 
     await d.git('foo.git', [
       d.libPubspec('foo', '1.0.0'),
diff --git a/test/global/activate/activate_hosted_after_git_test.dart b/test/global/activate/activate_hosted_after_git_test.dart
index ba267b6..58c65fb 100644
--- a/test/global/activate/activate_hosted_after_git_test.dart
+++ b/test/global/activate/activate_hosted_after_git_test.dart
@@ -9,11 +9,10 @@
 
 void main() {
   test('activating a hosted package deactivates the Git one', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '2.0.0', contents: [
-        d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '2.0.0', contents: [
+      d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
+    ]);
 
     await d.git('foo.git', [
       d.libPubspec('foo', '1.0.0'),
diff --git a/test/global/activate/activate_hosted_after_path_test.dart b/test/global/activate/activate_hosted_after_path_test.dart
index 92985bd..4cd753f 100644
--- a/test/global/activate/activate_hosted_after_path_test.dart
+++ b/test/global/activate/activate_hosted_after_path_test.dart
@@ -11,11 +11,10 @@
 
 void main() {
   test('activating a hosted package deactivates the path one', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '2.0.0', contents: [
-        d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '2.0.0', contents: [
+      d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
+    ]);
 
     await d.dir('foo', [
       d.libPubspec('foo', '1.0.0'),
diff --git a/test/global/activate/activate_hosted_twice_test.dart b/test/global/activate/activate_hosted_twice_test.dart
index 16f3f9a..9baed5b 100644
--- a/test/global/activate/activate_hosted_twice_test.dart
+++ b/test/global/activate/activate_hosted_twice_test.dart
@@ -9,7 +9,8 @@
 
 void main() {
   test('activating a hosted package twice will not precompile', () async {
-    await servePackages((builder) => builder
+    final server = await servePackages();
+    server
       ..serve('foo', '1.0.0', deps: {
         'bar': 'any'
       }, contents: [
@@ -21,7 +22,7 @@
       ])
       ..serve('bar', '1.0.0', contents: [
         d.dir('lib', [d.file('bar.dart', 'final version = "1.0.0";')])
-      ]));
+      ]);
 
     await runPub(args: ['global', 'activate', 'foo'], output: '''
 Resolving dependencies...
@@ -46,10 +47,9 @@
 
     await runPub(args: ['global', 'activate', 'foo']);
 
-    globalPackageServer
-        .add((builder) => builder.serve('bar', '2.0.0', contents: [
-              d.dir('lib', [d.file('bar.dart', 'final version = "2.0.0";')])
-            ]));
+    server.serve('bar', '2.0.0', contents: [
+      d.dir('lib', [d.file('bar.dart', 'final version = "2.0.0";')])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo'], output: '''
 Package foo is currently active at version 1.0.0.
diff --git a/test/global/activate/activate_path_after_hosted_test.dart b/test/global/activate/activate_path_after_hosted_test.dart
index f7cfa95..cfc28fd 100644
--- a/test/global/activate/activate_path_after_hosted_test.dart
+++ b/test/global/activate/activate_path_after_hosted_test.dart
@@ -11,11 +11,10 @@
 
 void main() {
   test('activating a hosted package deactivates the path one', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
+    ]);
 
     await d.dir('foo', [
       d.libPubspec('foo', '2.0.0'),
diff --git a/test/global/activate/cached_package_test.dart b/test/global/activate/cached_package_test.dart
index 2daeaad..98db402 100644
--- a/test/global/activate/cached_package_test.dart
+++ b/test/global/activate/cached_package_test.dart
@@ -9,11 +9,10 @@
 
 void main() {
   test('can activate an already cached package', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
+    ]);
 
     await runPub(args: ['cache', 'add', 'foo']);
 
diff --git a/test/global/activate/constraint_test.dart b/test/global/activate/constraint_test.dart
index 0a18257..23386c0 100644
--- a/test/global/activate/constraint_test.dart
+++ b/test/global/activate/constraint_test.dart
@@ -9,12 +9,11 @@
 
 void main() {
   test('chooses the highest version that matches the constraint', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '1.0.1');
-      builder.serve('foo', '1.1.0');
-      builder.serve('foo', '1.2.3');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '1.0.1')
+      ..serve('foo', '1.1.0')
+      ..serve('foo', '1.2.3');
 
     await runPub(args: ['global', 'activate', 'foo', '<1.1.0']);
 
diff --git a/test/global/activate/custom_hosted_url_test.dart b/test/global/activate/custom_hosted_url_test.dart
index 54ee463..8b2f0fc 100644
--- a/test/global/activate/custom_hosted_url_test.dart
+++ b/test/global/activate/custom_hosted_url_test.dart
@@ -9,22 +9,21 @@
 void main() {
   test('activating a package from a custom pub server', () async {
     // The default pub server (i.e. pub.dartlang.org).
-    await servePackages((builder) {
-      builder.serve('baz', '1.0.0');
-    });
+    final server = await servePackages();
+    server.serve('baz', '1.0.0');
 
     // The custom pub server.
-    final customServer = await PackageServer.start((builder) {
-      Map<String, dynamic> hostedDep(String name, String constraint) => {
-            'hosted': {
-              'url': builder.serverUrl,
-              'name': name,
-            },
-            'version': constraint,
-          };
-      builder.serve('foo', '1.0.0', deps: {'bar': hostedDep('bar', 'any')});
-      builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
-    });
+    final customServer = await startPackageServer();
+    Map<String, dynamic> hostedDep(String name, String constraint) => {
+          'hosted': {
+            'url': customServer.url,
+            'name': name,
+          },
+          'version': constraint,
+        };
+
+    customServer.serve('foo', '1.0.0', deps: {'bar': hostedDep('bar', 'any')});
+    customServer.serve('bar', '1.0.0', deps: {'baz': 'any'});
 
     await runPub(
         args: ['global', 'activate', 'foo', '-u', customServer.url],
diff --git a/test/global/activate/different_version_test.dart b/test/global/activate/different_version_test.dart
index dd6cca2..8406b92 100644
--- a/test/global/activate/different_version_test.dart
+++ b/test/global/activate/different_version_test.dart
@@ -11,14 +11,13 @@
   test(
       "discards the previous active version if it doesn't match the "
       'constraint', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
+    await servePackages()
+      ..serve('foo', '1.0.0', contents: [
+        d.dir('bin', [d.file('foo.dart', 'main() => print("hi");')])
+      ])
+      ..serve('foo', '2.0.0', contents: [
+        d.dir('bin', [d.file('foo.dart', 'main() => print("hi2");')])
       ]);
-      builder.serve('foo', '2.0.0', contents: [
-        d.dir('bin', [d.file('foo.dart', 'main() => print("hi2"); ')])
-      ]);
-    });
 
     // Activate 1.0.0.
     await runPub(args: ['global', 'activate', 'foo', '1.0.0']);
diff --git a/test/global/activate/empty_constraint_test.dart b/test/global/activate/empty_constraint_test.dart
index fe0bd27..d893bcd 100644
--- a/test/global/activate/empty_constraint_test.dart
+++ b/test/global/activate/empty_constraint_test.dart
@@ -9,10 +9,9 @@
 
 void main() {
   test('errors if the constraint matches no versions', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '1.0.1');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '1.0.1');
 
     await runPub(
         args: ['global', 'activate', 'foo', '>1.1.0'],
diff --git a/test/global/activate/feature_test.dart b/test/global/activate/feature_test.dart
index 6095aa1..58119d1 100644
--- a/test/global/activate/feature_test.dart
+++ b/test/global/activate/feature_test.dart
@@ -10,8 +10,8 @@
 
 void main() {
   test('enables default-on features by default', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'dependencies': {'bar': '1.0.0'}
@@ -21,11 +21,9 @@
             'dependencies': {'baz': '1.0.0'}
           }
         }
-      });
-
-      builder.serve('bar', '1.0.0');
-      builder.serve('baz', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0')
+      ..serve('baz', '1.0.0');
 
     await runPub(args: ['global', 'activate', 'foo'], output: contains('''
 Resolving dependencies...
@@ -35,8 +33,8 @@
   });
 
   test('can enable default-off features', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'dependencies': {'bar': '1.0.0'}
@@ -46,11 +44,9 @@
             'dependencies': {'baz': '1.0.0'}
           }
         }
-      });
-
-      builder.serve('bar', '1.0.0');
-      builder.serve('baz', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0')
+      ..serve('baz', '1.0.0');
 
     await runPub(
         args: ['global', 'activate', 'foo', '--features', 'things'],
@@ -63,8 +59,8 @@
   });
 
   test('can disable default-on features', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'dependencies': {'bar': '1.0.0'}
@@ -74,11 +70,9 @@
             'dependencies': {'baz': '1.0.0'}
           }
         }
-      });
-
-      builder.serve('bar', '1.0.0');
-      builder.serve('baz', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0')
+      ..serve('baz', '1.0.0');
 
     await runPub(
         args: ['global', 'activate', 'foo', '--omit-features', 'stuff'],
@@ -89,8 +83,8 @@
   });
 
   test('supports multiple arguments', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
@@ -101,11 +95,9 @@
             'dependencies': {'baz': '1.0.0'}
           }
         }
-      });
-
-      builder.serve('bar', '1.0.0');
-      builder.serve('baz', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0')
+      ..serve('baz', '1.0.0');
 
     await runPub(
         args: ['global', 'activate', 'foo', '--features', 'things,stuff'],
@@ -118,8 +110,8 @@
   });
 
   test('can both enable and disable', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'dependencies': {'bar': '1.0.0'}
@@ -129,11 +121,9 @@
             'dependencies': {'baz': '1.0.0'}
           }
         }
-      });
-
-      builder.serve('bar', '1.0.0');
-      builder.serve('baz', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0')
+      ..serve('baz', '1.0.0');
 
     await runPub(args: [
       'global',
diff --git a/test/global/activate/ignores_active_version_test.dart b/test/global/activate/ignores_active_version_test.dart
index 949456f..777a631 100644
--- a/test/global/activate/ignores_active_version_test.dart
+++ b/test/global/activate/ignores_active_version_test.dart
@@ -9,15 +9,14 @@
 
 void main() {
   test('ignores previously activated version', () async {
-    await servePackages((builder) {
-      builder.serve(
+    await servePackages()
+      ..serve(
         'foo',
         '1.2.3',
-      );
-      builder.serve('foo', '1.3.0', contents: [
+      )
+      ..serve('foo', '1.3.0', contents: [
         d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
       ]);
-    });
 
     // Activate 1.2.3.
     await runPub(args: ['global', 'activate', 'foo', '1.2.3']);
diff --git a/test/global/activate/installs_dependencies_for_git_test.dart b/test/global/activate/installs_dependencies_for_git_test.dart
index e67fad4..6018f50 100644
--- a/test/global/activate/installs_dependencies_for_git_test.dart
+++ b/test/global/activate/installs_dependencies_for_git_test.dart
@@ -9,10 +9,9 @@
 
 void main() {
   test('activating a Git package installs its dependencies', () async {
-    await servePackages((builder) {
-      builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
-      builder.serve('baz', '1.0.0');
-    });
+    await servePackages()
+      ..serve('bar', '1.0.0', deps: {'baz': 'any'})
+      ..serve('baz', '1.0.0');
 
     await d.git('foo.git', [
       d.libPubspec('foo', '1.0.0', deps: {'bar': 'any'}),
diff --git a/test/global/activate/installs_dependencies_for_path_test.dart b/test/global/activate/installs_dependencies_for_path_test.dart
index 52f3e65..4688f07 100644
--- a/test/global/activate/installs_dependencies_for_path_test.dart
+++ b/test/global/activate/installs_dependencies_for_path_test.dart
@@ -9,10 +9,9 @@
 
 void main() {
   test('activating a path package installs dependencies', () async {
-    await servePackages((builder) {
-      builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
-      builder.serve('baz', '2.0.0');
-    });
+    await servePackages()
+      ..serve('bar', '1.0.0', deps: {'baz': 'any'})
+      ..serve('baz', '2.0.0');
 
     await d.dir('foo', [
       d.libPubspec('foo', '0.0.0', deps: {'bar': 'any'}),
diff --git a/test/global/activate/installs_dependencies_test.dart b/test/global/activate/installs_dependencies_test.dart
index 7114170..770ebcf 100644
--- a/test/global/activate/installs_dependencies_test.dart
+++ b/test/global/activate/installs_dependencies_test.dart
@@ -8,11 +8,10 @@
 
 void main() {
   test('activating a package installs its dependencies', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
-      builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
-      builder.serve('baz', '1.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': 'any'})
+      ..serve('bar', '1.0.0', deps: {'baz': 'any'})
+      ..serve('baz', '1.0.0');
 
     await runPub(
         args: ['global', 'activate', 'foo'],
diff --git a/test/global/activate/outdated_binstub_test.dart b/test/global/activate/outdated_binstub_test.dart
index 64a379a..6d9e298 100644
--- a/test/global/activate/outdated_binstub_test.dart
+++ b/test/global/activate/outdated_binstub_test.dart
@@ -19,14 +19,12 @@
 
 void main() {
   test('an outdated binstub is replaced', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {'foo-script': 'script'}
-      }, contents: [
-        d.dir(
-            'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {'foo-script': 'script'}
+    }, contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/activate/path_package_test.dart b/test/global/activate/path_package_test.dart
index 6a08e9c..514176a 100644
--- a/test/global/activate/path_package_test.dart
+++ b/test/global/activate/path_package_test.dart
@@ -55,14 +55,13 @@
   });
 
   test("Doesn't precompile binaries when activating from path", () async {
-    await servePackages(
-      (builder) => builder.serve(
-        'bar',
-        '1.0.0',
-        contents: [
-          d.dir('bin', [d.file('bar.dart', "main() => print('bar');")])
-        ],
-      ),
+    final server = await servePackages();
+    server.serve(
+      'bar',
+      '1.0.0',
+      contents: [
+        d.dir('bin', [d.file('bar.dart', "main() => print('bar');")])
+      ],
     );
 
     await d.dir('foo', [
diff --git a/test/global/activate/removes_old_lockfile_test.dart b/test/global/activate/removes_old_lockfile_test.dart
index a91a153..3392aff 100644
--- a/test/global/activate/removes_old_lockfile_test.dart
+++ b/test/global/activate/removes_old_lockfile_test.dart
@@ -9,9 +9,8 @@
 
 void main() {
   test('removes the 1.6-style lockfile', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await d.dir(cachePath, [
       d.dir('global_packages', [
diff --git a/test/global/activate/snapshots_hosted_executables_test.dart b/test/global/activate/snapshots_hosted_executables_test.dart
index c400ec7..bc2b332 100644
--- a/test/global/activate/snapshots_hosted_executables_test.dart
+++ b/test/global/activate/snapshots_hosted_executables_test.dart
@@ -9,16 +9,15 @@
 
 void main() {
   test('snapshots the executables for a hosted package', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [
-          d.file('hello.dart', "void main() => print('hello!');"),
-          d.file('goodbye.dart', "void main() => print('goodbye!');"),
-          d.file('shell.sh', 'echo shell'),
-          d.dir('subdir', [d.file('sub.dart', "void main() => print('sub!');")])
-        ])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [
+        d.file('hello.dart', "void main() => print('hello!');"),
+        d.file('goodbye.dart', "void main() => print('goodbye!');"),
+        d.file('shell.sh', 'echo shell'),
+        d.dir('subdir', [d.file('sub.dart', "void main() => print('sub!');")])
+      ])
+    ]);
 
     await runPub(
         args: ['global', 'activate', 'foo'],
diff --git a/test/global/activate/supports_version_solver_backtracking_test.dart b/test/global/activate/supports_version_solver_backtracking_test.dart
index 7731bc6..c8c138d 100644
--- a/test/global/activate/supports_version_solver_backtracking_test.dart
+++ b/test/global/activate/supports_version_solver_backtracking_test.dart
@@ -9,14 +9,13 @@
 
 void main() {
   test('performs verison solver backtracking if necessary', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.1.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.1.0', pubspec: {
         'environment': {'sdk': '>=0.1.2 <0.2.0'}
-      });
-      builder.serve('foo', '1.2.0', pubspec: {
+      })
+      ..serve('foo', '1.2.0', pubspec: {
         'environment': {'sdk': '>=0.1.3 <0.2.0'}
       });
-    });
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/activate/uncached_package_test.dart b/test/global/activate/uncached_package_test.dart
index 98b12af..1a18d70 100644
--- a/test/global/activate/uncached_package_test.dart
+++ b/test/global/activate/uncached_package_test.dart
@@ -9,17 +9,16 @@
 
 void main() {
   test('installs and activates the best version of a package', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
+    await servePackages()
+      ..serve('foo', '1.0.0', contents: [
+        d.dir('bin', [d.file('foo.dart', 'main() => print("hi");')])
+      ])
+      ..serve('foo', '1.2.3', contents: [
+        d.dir('bin', [d.file('foo.dart', 'main() => print("hi 1.2.3");')])
+      ])
+      ..serve('foo', '2.0.0-wildly.unstable', contents: [
+        d.dir('bin', [d.file('foo.dart', 'main() => print("hi unstable");')])
       ]);
-      builder.serve('foo', '1.2.3', contents: [
-        d.dir('bin', [d.file('foo.dart', 'main() => print("hi 1.2.3"); ')])
-      ]);
-      builder.serve('foo', '2.0.0-wildly.unstable', contents: [
-        d.dir('bin', [d.file('foo.dart', 'main() => print("hi unstable"); ')])
-      ]);
-    });
 
     await runPub(args: ['global', 'activate', 'foo'], output: '''
         Resolving dependencies...
diff --git a/test/global/activate/unknown_package_test.dart b/test/global/activate/unknown_package_test.dart
index 93a5d3a..271545d 100644
--- a/test/global/activate/unknown_package_test.dart
+++ b/test/global/activate/unknown_package_test.dart
@@ -9,7 +9,7 @@
 
 void main() {
   test('errors if the package could not be found', () async {
-    await serveNoPackages();
+    await servePackages();
 
     await runPub(
         args: ['global', 'activate', 'foo'],
diff --git a/test/global/binstubs/binstub_runs_executable_test.dart b/test/global/binstubs/binstub_runs_executable_test.dart
index c733f47..98ab53b 100644
--- a/test/global/binstubs/binstub_runs_executable_test.dart
+++ b/test/global/binstubs/binstub_runs_executable_test.dart
@@ -12,14 +12,12 @@
 
 void main() {
   test('the generated binstub runs a snapshotted executable', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {'foo-script': 'script'}
-      }, contents: [
-        d.dir(
-            'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {'foo-script': 'script'}
+    }, contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart b/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart
index f66a251..cd477db 100644
--- a/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart
+++ b/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart
@@ -9,13 +9,12 @@
 
 void main() {
   test('the binstubs runs a built snapshot if present', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {'foo-script': 'script'}
-      }, contents: [
-        d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {'foo-script': 'script'}
+    }, contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/binstubs/creates_executables_in_pubspec_test.dart b/test/global/binstubs/creates_executables_in_pubspec_test.dart
index 8fe53dc..a6604ab 100644
--- a/test/global/binstubs/creates_executables_in_pubspec_test.dart
+++ b/test/global/binstubs/creates_executables_in_pubspec_test.dart
@@ -9,17 +9,16 @@
 
 void main() {
   test('creates binstubs for each executable in the pubspec', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {'one': null, 'two-renamed': 'second'}
-      }, contents: [
-        d.dir('bin', [
-          d.file('one.dart', "main(args) => print('one');"),
-          d.file('second.dart', "main(args) => print('two');"),
-          d.file('nope.dart', "main(args) => print('nope');")
-        ])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {'one': null, 'two-renamed': 'second'}
+    }, contents: [
+      d.dir('bin', [
+        d.file('one.dart', "main(args) => print('one');"),
+        d.file('second.dart', "main(args) => print('two');"),
+        d.file('nope.dart', "main(args) => print('nope');")
+      ])
+    ]);
 
     await runPub(
         args: ['global', 'activate', 'foo'],
diff --git a/test/global/binstubs/does_not_warn_if_no_executables_test.dart b/test/global/binstubs/does_not_warn_if_no_executables_test.dart
index b7ca722..9814f15 100644
--- a/test/global/binstubs/does_not_warn_if_no_executables_test.dart
+++ b/test/global/binstubs/does_not_warn_if_no_executables_test.dart
@@ -9,12 +9,10 @@
 
 void main() {
   test('does not warn if the package has no executables', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir(
-            'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+    ]);
 
     await runPub(
         args: ['global', 'activate', 'foo'],
diff --git a/test/global/binstubs/does_not_warn_if_on_path_test.dart b/test/global/binstubs/does_not_warn_if_on_path_test.dart
index fd0dfa7..9b11386 100644
--- a/test/global/binstubs/does_not_warn_if_on_path_test.dart
+++ b/test/global/binstubs/does_not_warn_if_on_path_test.dart
@@ -12,14 +12,12 @@
 
 void main() {
   test('does not warn if the binstub directory is on the path', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {'script': null}
-      }, contents: [
-        d.dir(
-            'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {'script': null}
+    }, contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+    ]);
 
     // Add the test's cache bin directory to the path.
     var binDir = p.dirname(Platform.executable);
diff --git a/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart b/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart
index e86757c..442dfbc 100644
--- a/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart
+++ b/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart
@@ -24,23 +24,22 @@
 void main() {
   test("an outdated binstub runs 'pub global run', which replaces old binstub",
       () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {
-          'foo-script': 'script',
-          'foo-script2': 'script',
-          'foo-script-not-installed': 'script',
-          'foo-another-script': 'another-script',
-          'foo-another-script-not-installed': 'another-script'
-        }
-      }, contents: [
-        d.dir('bin', [
-          d.file('script.dart', r"main(args) => print('ok $args');"),
-          d.file('another-script.dart',
-              r"main(args) => print('not so good $args');")
-        ])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {
+        'foo-script': 'script',
+        'foo-script2': 'script',
+        'foo-script-not-installed': 'script',
+        'foo-another-script': 'another-script',
+        'foo-another-script-not-installed': 'another-script'
+      }
+    }, contents: [
+      d.dir('bin', [
+        d.file('script.dart', r"main(args) => print('ok $args');"),
+        d.file(
+            'another-script.dart', r"main(args) => print('not so good $args');")
+      ])
+    ]);
 
     await runPub(args: [
       'global',
diff --git a/test/global/binstubs/outdated_snapshot_test.dart b/test/global/binstubs/outdated_snapshot_test.dart
index e749a5c..91bfff6 100644
--- a/test/global/binstubs/outdated_snapshot_test.dart
+++ b/test/global/binstubs/outdated_snapshot_test.dart
@@ -13,14 +13,12 @@
 
 void main() {
   test("a binstub runs 'pub global run' for an outdated snapshot", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {'foo-script': 'script'}
-      }, contents: [
-        d.dir(
-            'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {'foo-script': 'script'}
+    }, contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/binstubs/removes_when_deactivated_test.dart b/test/global/binstubs/removes_when_deactivated_test.dart
index 05c8413..975defe 100644
--- a/test/global/binstubs/removes_when_deactivated_test.dart
+++ b/test/global/binstubs/removes_when_deactivated_test.dart
@@ -9,16 +9,15 @@
 
 void main() {
   test('removes binstubs when the package is deactivated', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {'one': null, 'two': null}
-      }, contents: [
-        d.dir('bin', [
-          d.file('one.dart', "main(args) => print('one');"),
-          d.file('two.dart', "main(args) => print('two');")
-        ])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {'one': null, 'two': null}
+    }, contents: [
+      d.dir('bin', [
+        d.file('one.dart', "main(args) => print('one');"),
+        d.file('two.dart', "main(args) => print('two');")
+      ])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
     await runPub(args: ['global', 'deactivate', 'foo']);
diff --git a/test/global/binstubs/runs_once_even_when_dart_is_batch_test.dart b/test/global/binstubs/runs_once_even_when_dart_is_batch_test.dart
index 54f3932..99eeaaf 100644
--- a/test/global/binstubs/runs_once_even_when_dart_is_batch_test.dart
+++ b/test/global/binstubs/runs_once_even_when_dart_is_batch_test.dart
@@ -14,18 +14,17 @@
   test(
       'runs only once even when dart on path is a batch file (as in flutter/bin)',
       () async {
-    await servePackages((builder) {
-      builder.serve(
-        'foo',
-        '1.0.0',
-        contents: [
-          d.dir('bin', [d.file('script.dart', 'main(args) => print(args);')]),
-        ],
-        pubspec: {
-          'executables': {'script': 'script'},
-        },
-      );
-    });
+    final server = await servePackages();
+    server.serve(
+      'foo',
+      '1.0.0',
+      contents: [
+        d.dir('bin', [d.file('script.dart', 'main(args) => print(args);')]),
+      ],
+      pubspec: {
+        'executables': {'script': 'script'},
+      },
+    );
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/binstubs/warns_if_not_on_path_test.dart b/test/global/binstubs/warns_if_not_on_path_test.dart
index d09e698..d98bf76 100644
--- a/test/global/binstubs/warns_if_not_on_path_test.dart
+++ b/test/global/binstubs/warns_if_not_on_path_test.dart
@@ -9,14 +9,12 @@
 
 void main() {
   test('warns if the binstub directory is not on the path', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'executables': {'some-dart-script': 'script'}
-      }, contents: [
-        d.dir(
-            'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'executables': {'some-dart-script': 'script'}
+    }, contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+    ]);
 
     await runPub(
         args: ['global', 'activate', 'foo'],
diff --git a/test/global/deactivate/deactivate_and_reactivate_package_test.dart b/test/global/deactivate/deactivate_and_reactivate_package_test.dart
index cc7f597..da33486 100644
--- a/test/global/deactivate/deactivate_and_reactivate_package_test.dart
+++ b/test/global/deactivate/deactivate_and_reactivate_package_test.dart
@@ -8,10 +8,9 @@
 
 void main() {
   test('activates a different version after deactivating', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0');
 
     // Activate an old version.
     await runPub(args: ['global', 'activate', 'foo', '1.0.0']);
diff --git a/test/global/deactivate/hosted_package_test.dart b/test/global/deactivate/hosted_package_test.dart
index 854d6a9..fa91829 100644
--- a/test/global/deactivate/hosted_package_test.dart
+++ b/test/global/deactivate/hosted_package_test.dart
@@ -8,7 +8,8 @@
 
 void main() {
   test('deactivates an active hosted package', () async {
-    await servePackages((builder) => builder.serve('foo', '1.0.0'));
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/deactivate/removes_precompiled_snapshots_test.dart b/test/global/deactivate/removes_precompiled_snapshots_test.dart
index 7ea6d58..a7670e2 100644
--- a/test/global/deactivate/removes_precompiled_snapshots_test.dart
+++ b/test/global/deactivate/removes_precompiled_snapshots_test.dart
@@ -9,7 +9,8 @@
 
 void main() {
   test('removes built snapshots', () async {
-    await servePackages((builder) => builder.serve('foo', '1.0.0'));
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/deactivate/unknown_package_test.dart b/test/global/deactivate/unknown_package_test.dart
index d67460d..35023ad 100644
--- a/test/global/deactivate/unknown_package_test.dart
+++ b/test/global/deactivate/unknown_package_test.dart
@@ -9,7 +9,7 @@
 
 void main() {
   test('errors if the package is not activated', () async {
-    await serveNoPackages();
+    await servePackages();
 
     await runPub(
         args: ['global', 'deactivate', 'foo'],
diff --git a/test/global/list_test.dart b/test/global/list_test.dart
index 4b50184..8d4d02e 100644
--- a/test/global/list_test.dart
+++ b/test/global/list_test.dart
@@ -12,9 +12,8 @@
 
 void main() {
   test('lists an activated hosted package', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await runPub(args: ['global', 'activate', 'foo']);
 
@@ -49,11 +48,10 @@
   });
 
   test('lists activated packages in alphabetical order', () async {
-    await servePackages((builder) {
-      builder.serve('aaa', '1.0.0');
-      builder.serve('bbb', '1.0.0');
-      builder.serve('ccc', '1.0.0');
-    });
+    await servePackages()
+      ..serve('aaa', '1.0.0')
+      ..serve('bbb', '1.0.0')
+      ..serve('ccc', '1.0.0');
 
     await runPub(args: ['global', 'activate', 'ccc']);
     await runPub(args: ['global', 'activate', 'aaa']);
diff --git a/test/global/run/errors_if_outside_bin_test.dart b/test/global/run/errors_if_outside_bin_test.dart
index 098f0bb..72bcd4f 100644
--- a/test/global/run/errors_if_outside_bin_test.dart
+++ b/test/global/run/errors_if_outside_bin_test.dart
@@ -10,11 +10,10 @@
 
 void main() {
   test('errors if the script is in a subdirectory.', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('example', [d.file('script.dart', "main(args) => print('ok');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('example', [d.file('script.dart', "main(args) => print('ok');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
     await runPub(
diff --git a/test/global/run/fails_if_sdk_constraint_is_unmet_test.dart b/test/global/run/fails_if_sdk_constraint_is_unmet_test.dart
index 08adbcc..3bef340 100644
--- a/test/global/run/fails_if_sdk_constraint_is_unmet_test.dart
+++ b/test/global/run/fails_if_sdk_constraint_is_unmet_test.dart
@@ -10,11 +10,10 @@
 
 void main() {
   test("fails if the current SDK doesn't match the constraint", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
@@ -41,15 +40,14 @@
   });
 
   test('fails if SDK is downgraded below the constraints', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'environment': {
-          'sdk': '>=2.0.0 <3.0.0',
-        },
-      }, contents: [
-        d.dir('bin', [d.file('script.dart', "main(args) => print('123-OK');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'environment': {
+        'sdk': '>=2.0.0 <3.0.0',
+      },
+    }, contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('123-OK');")])
+    ]);
 
     await runPub(
       environment: {'_PUB_TEST_SDK_VERSION': '2.0.0'},
@@ -69,8 +67,8 @@
   });
 
   test('fails if SDK is downgraded below dependency SDK constraints', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {
         'bar': '^1.0.0',
       }, pubspec: {
         'environment': {
@@ -78,13 +76,12 @@
         },
       }, contents: [
         d.dir('bin', [d.file('script.dart', "main(args) => print('123-OK');")])
-      ]);
-      builder.serve('bar', '1.0.0', pubspec: {
+      ])
+      ..serve('bar', '1.0.0', pubspec: {
         'environment': {
           'sdk': '>=2.2.0 <3.0.0',
         },
       });
-    });
 
     await runPub(
       environment: {'_PUB_TEST_SDK_VERSION': '2.2.0'},
diff --git a/test/global/run/implicit_executable_name_test.dart b/test/global/run/implicit_executable_name_test.dart
index fa7bf51..9757772 100644
--- a/test/global/run/implicit_executable_name_test.dart
+++ b/test/global/run/implicit_executable_name_test.dart
@@ -9,11 +9,10 @@
 
 void main() {
   test('defaults to the package name if the script is omitted', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('foo.dart', "main(args) => print('foo');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('foo.dart', "main(args) => print('foo');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/run/nonexistent_script_test.dart b/test/global/run/nonexistent_script_test.dart
index d4f9577..8ff0a42 100644
--- a/test/global/run/nonexistent_script_test.dart
+++ b/test/global/run/nonexistent_script_test.dart
@@ -10,9 +10,10 @@
 
 void main() {
   test('errors if the script does not exist.', () async {
-    await servePackages((builder) => builder.serve('foo', '1.0.0', pubspec: {
-          'dev_dependencies': {'bar': '1.0.0'}
-        }));
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'dev_dependencies': {'bar': '1.0.0'}
+    });
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/run/package_api_test.dart b/test/global/run/package_api_test.dart
index 26ebc2a..5db401b 100644
--- a/test/global/run/package_api_test.dart
+++ b/test/global/run/package_api_test.dart
@@ -10,10 +10,9 @@
 
 void main() {
   test('an immutable application sees a file: package config', () async {
-    await servePackages((builder) {
-      builder.serve('bar', '1.0.0');
-
-      builder.serve('foo', '1.0.0', deps: {
+    await servePackages()
+      ..serve('bar', '1.0.0')
+      ..serve('foo', '1.0.0', deps: {
         'bar': '1.0.0'
       }, contents: [
         d.dir('bin', [
@@ -31,7 +30,6 @@
 """)
         ])
       ]);
-    });
 
     await runPub(args: ['global', 'activate', 'foo']);
 
@@ -43,12 +41,12 @@
         'global_packages/foo/.dart_tool/package_config.json');
     expect(pub.stdout, emits(p.toUri(packageConfigPath).toString()));
 
-    var fooResourcePath = p.join(
-        globalPackageServer.pathInCache('foo', '1.0.0'), 'lib/resource.txt');
+    var fooResourcePath =
+        p.join(globalServer.pathInCache('foo', '1.0.0'), 'lib/resource.txt');
     expect(pub.stdout, emits(p.toUri(fooResourcePath).toString()));
 
-    var barResourcePath = p.join(
-        globalPackageServer.pathInCache('bar', '1.0.0'), 'lib/resource.txt');
+    var barResourcePath =
+        p.join(globalServer.pathInCache('bar', '1.0.0'), 'lib/resource.txt');
     expect(pub.stdout, emits(p.toUri(barResourcePath).toString()));
     await pub.shouldExit(0);
   });
diff --git a/test/global/run/recompiles_if_snapshot_is_out_of_date_test.dart b/test/global/run/recompiles_if_snapshot_is_out_of_date_test.dart
index 97c69f2..24e65bf 100644
--- a/test/global/run/recompiles_if_snapshot_is_out_of_date_test.dart
+++ b/test/global/run/recompiles_if_snapshot_is_out_of_date_test.dart
@@ -11,11 +11,10 @@
 
 void main() {
   test('recompiles a script if the snapshot is out-of-date', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/run/runs_script_in_checked_mode_test.dart b/test/global/run/runs_script_in_checked_mode_test.dart
index 69cd393..d0511cf 100644
--- a/test/global/run/runs_script_in_checked_mode_test.dart
+++ b/test/global/run/runs_script_in_checked_mode_test.dart
@@ -9,11 +9,10 @@
 
 void main() {
   test('runs a script with assertions enabled', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('script.dart', 'main() { assert(false); }')])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', 'main() { assert(false); }')])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/run/runs_script_in_unchecked_mode_test.dart b/test/global/run/runs_script_in_unchecked_mode_test.dart
index 866847b..ca752b2 100644
--- a/test/global/run/runs_script_in_unchecked_mode_test.dart
+++ b/test/global/run/runs_script_in_unchecked_mode_test.dart
@@ -16,11 +16,10 @@
 
 void main() {
   test('runs a script in unchecked mode by default', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('script.dart', _script)])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', _script)])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/run/runs_script_test.dart b/test/global/run/runs_script_test.dart
index fe767ef..f3f0e99 100644
--- a/test/global/run/runs_script_test.dart
+++ b/test/global/run/runs_script_test.dart
@@ -9,11 +9,10 @@
 
 void main() {
   test('runs a script in an activated package', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/run/runs_script_without_packages_file_test.dart b/test/global/run/runs_script_without_packages_file_test.dart
index cb63be2..dc225ba 100644
--- a/test/global/run/runs_script_without_packages_file_test.dart
+++ b/test/global/run/runs_script_without_packages_file_test.dart
@@ -12,11 +12,10 @@
 void main() {
   test('runs a snapshotted script without a .dart_tool/package_config file',
       () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+    ]);
 
     await runPub(args: ['global', 'activate', 'foo']);
 
diff --git a/test/global/run/unknown_package_test.dart b/test/global/run/unknown_package_test.dart
index a5fba21..adcb666 100644
--- a/test/global/run/unknown_package_test.dart
+++ b/test/global/run/unknown_package_test.dart
@@ -9,7 +9,7 @@
 
 void main() {
   test('errors if the package is not activated', () async {
-    await serveNoPackages();
+    await servePackages();
 
     await runPub(
         args: ['global', 'run', 'foo:bar'],
diff --git a/test/global/run/uses_old_lockfile_test.dart b/test/global/run/uses_old_lockfile_test.dart
index 5eb8406..1afab81 100644
--- a/test/global/run/uses_old_lockfile_test.dart
+++ b/test/global/run/uses_old_lockfile_test.dart
@@ -9,9 +9,9 @@
 
 void main() {
   test('uses the 1.6-style lockfile if necessary', () async {
-    await servePackages((builder) {
-      builder.serve('bar', '1.0.0');
-      builder.serve('foo', '1.0.0', deps: {
+    await servePackages()
+      ..serve('bar', '1.0.0')
+      ..serve('foo', '1.0.0', deps: {
         'bar': 'any'
       }, contents: [
         d.dir('bin', [
@@ -21,7 +21,6 @@
               main(args) => print(bar.main());""")
         ])
       ]);
-    });
 
     await runPub(args: ['cache', 'add', 'foo']);
     await runPub(args: ['cache', 'add', 'bar']);
diff --git a/test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart b/test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
index 25f3c50..7fb22a3 100644
--- a/test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
+++ b/test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
@@ -17,15 +17,18 @@
     test(
         'fails gracefully if the package server responds with broken package listings',
         () async {
-      await servePackages((b) => b..serve('foo', '1.2.3'));
-      globalPackageServer.extraHandlers[RegExp('/api/packages/.*')] =
-          expectAsync1((request) {
-        expect(request.method, 'GET');
-        return Response(200,
-            body: jsonEncode({
-              'notTheRight': {'response': 'type'}
-            }));
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
+      server.expect(
+        'GET',
+        RegExp('/api/packages/.*'),
+        expectAsync1((request) {
+          return Response(200,
+              body: jsonEncode({
+                'notTheRight': {'response': 'type'}
+              }));
+        }),
+      );
       await d.appDir({'foo': '1.2.3'}).create();
 
       await pubCommand(command,
@@ -39,10 +42,9 @@
   });
 
   testWithGolden('bad_json', (ctx) async {
-    await servePackages((b) => b..serve('foo', '1.2.3'));
-    globalPackageServer.extraHandlers[RegExp('/api/packages/.*')] =
-        expectAsync1((request) {
-      expect(request.method, 'GET');
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
+    server.expect('GET', RegExp('/api/packages/.*'), (request) {
       return Response(200,
           body: jsonEncode({
             'notTheRight': {'response': 'type'}
@@ -54,10 +56,9 @@
   });
 
   testWithGolden('403', (ctx) async {
-    await servePackages((b) => b..serve('foo', '1.2.3'));
-    globalPackageServer.extraHandlers[RegExp('/api/packages/.*')] =
-        expectAsync1((request) {
-      expect(request.method, 'GET');
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
+    server.expect('GET', RegExp('/api/packages/.*'), (request) {
       return Response(403,
           body: jsonEncode({
             'notTheRight': {'response': 'type'}
@@ -69,10 +70,9 @@
   });
 
   testWithGolden('401', (ctx) async {
-    await servePackages((b) => b..serve('foo', '1.2.3'));
-    globalPackageServer.extraHandlers[RegExp('/api/packages/.*')] =
-        expectAsync1((request) {
-      expect(request.method, 'GET');
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
+    server.expect('GET', RegExp('/api/packages/.*'), (request) {
       return Response(401,
           body: jsonEncode({
             'notTheRight': {'response': 'type'}
@@ -84,10 +84,9 @@
   });
 
   testWithGolden('403-with-message', (ctx) async {
-    await servePackages((b) => b..serve('foo', '1.2.3'));
-    globalPackageServer.extraHandlers[RegExp('/api/packages/.*')] =
-        expectAsync1((request) {
-      expect(request.method, 'GET');
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
+    server.expect('GET', RegExp('/api/packages/.*'), (request) {
       return Response(403,
           headers: {
             'www-authenticate': 'Bearer realm="pub", message="<message>"',
@@ -102,10 +101,9 @@
   });
 
   testWithGolden('401-with-message', (ctx) async {
-    await servePackages((b) => b..serve('foo', '1.2.3'));
-    globalPackageServer.extraHandlers[RegExp('/api/packages/.*')] =
-        expectAsync1((request) {
-      expect(request.method, 'GET');
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
+    server.expect('GET', RegExp('/api/packages/.*'), (request) {
       return Response(401,
           headers: {
             'www-authenticate': 'Bearer realm="pub", message="<message>"',
diff --git a/test/hosted/fail_gracefully_on_missing_package_test.dart b/test/hosted/fail_gracefully_on_missing_package_test.dart
index 1840f18..7c6290d 100644
--- a/test/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/test/hosted/fail_gracefully_on_missing_package_test.dart
@@ -11,7 +11,7 @@
 void main() {
   forBothPubGetAndUpgrade((command) {
     test('fails gracefully if the package does not exist', () async {
-      await serveNoPackages();
+      await servePackages();
 
       await d.appDir({'foo': '1.2.3'}).create();
 
diff --git a/test/hosted/fail_gracefully_with_hint_test.dart b/test/hosted/fail_gracefully_with_hint_test.dart
index bbb510b..4f1a326 100644
--- a/test/hosted/fail_gracefully_with_hint_test.dart
+++ b/test/hosted/fail_gracefully_with_hint_test.dart
@@ -12,7 +12,7 @@
 void main() {
   testWithGolden('hint: try without --offline', (ctx) async {
     // Run the server so that we know what URL to use in the system cache.
-    await serveErrors();
+    (await servePackages()).serveErrors();
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -25,7 +25,7 @@
 
   testWithGolden('supports two hints', (ctx) async {
     // Run the server so that we know what URL to use in the system cache.
-    await serveErrors();
+    (await servePackages()).serveErrors();
 
     await d.hostedCache([
       d.dir('foo-1.2.3', [
diff --git a/test/hosted/metadata_test.dart b/test/hosted/metadata_test.dart
index 7554a0f..c705ac7 100644
--- a/test/hosted/metadata_test.dart
+++ b/test/hosted/metadata_test.dart
@@ -12,9 +12,8 @@
 void main() {
   forBothPubGetAndUpgrade((command) {
     test('sends metadata headers for a direct dependency', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0');
 
       await d.appDir({'foo': '1.0.0'}).create();
 
@@ -33,9 +32,8 @@
     });
 
     test('sends metadata headers for a dev dependency', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -59,9 +57,8 @@
     });
 
     test('sends metadata headers for a transitive dependency', () async {
-      await servePackages((builder) {
-        builder.serve('bar', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('bar', '1.0.0');
 
       await d.appDir({
         'foo': {'path': '../foo'}
@@ -82,9 +79,8 @@
     });
 
     test("doesn't send metadata headers to a foreign server", () async {
-      var server = await PackageServer.start((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      var server = await startPackageServer()
+        ..serve('foo', '1.0.0');
 
       await d.appDir({
         'foo': {
@@ -97,9 +93,7 @@
     });
 
     test("doesn't send metadata headers when CI=true", () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      (await servePackages()).serve('foo', '1.0.0');
 
       await d.appDir({'foo': '1.0.0'}).create();
 
diff --git a/test/hosted/offline_test.dart b/test/hosted/offline_test.dart
index 911f405..6482656 100644
--- a/test/hosted/offline_test.dart
+++ b/test/hosted/offline_test.dart
@@ -8,14 +8,13 @@
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
-Future<void> populateCache(Map<String, List<String>> versions) async {
-  await servePackages((b) {
-    for (final entry in versions.entries) {
-      for (final version in entry.value) {
-        b.serve(entry.key, version);
-      }
+Future<void> populateCache(
+    Map<String, List<String>> versions, PackageServer server) async {
+  for (final entry in versions.entries) {
+    for (final version in entry.value) {
+      server.serve(entry.key, version);
     }
-  });
+  }
   for (final entry in versions.entries) {
     for (final version in entry.value) {
       await d.appDir({entry.key: version}).create();
@@ -27,13 +26,14 @@
 void main() {
   forBothPubGetAndUpgrade((command) {
     test('upgrades a package using the cache', () async {
+      final server = await servePackages();
       await populateCache({
         'foo': ['1.2.2', '1.2.3'],
         'bar': ['1.2.3']
-      });
+      }, server);
 
       // Now serve only errors - to validate we are truly offline.
-      await serveErrors();
+      server.serveErrors();
 
       await d.appDir({'foo': 'any', 'bar': 'any'}).create();
 
@@ -49,11 +49,12 @@
     });
 
     test('supports prerelease versions', () async {
+      final server = await servePackages();
       await populateCache({
         'foo': ['1.2.3-alpha.1']
-      });
+      }, server);
       // Now serve only errors - to validate we are truly offline.
-      await serveErrors();
+      server.serveErrors();
 
       await d.appDir({'foo': 'any'}).create();
 
@@ -70,7 +71,8 @@
 
     test('fails gracefully if a dependency is not cached', () async {
       // Run the server so that we know what URL to use in the system cache.
-      await serveErrors();
+      final server = await servePackages();
+      server.serveErrors();
 
       await d.appDir({'foo': 'any'}).create();
 
@@ -86,12 +88,13 @@
     });
 
     test('fails gracefully if no cached versions match', () async {
+      final server = await servePackages();
       await populateCache({
         'foo': ['1.2.2', '1.2.3']
-      });
+      }, server);
 
       // Run the server so that we know what URL to use in the system cache.
-      await serveErrors();
+      server.serveErrors();
 
       await d.appDir({'foo': '>2.0.0'}).create();
 
@@ -105,8 +108,10 @@
     test(
         'fails gracefully if a dependency is not cached and a lockfile '
         'exists', () async {
+      final server = await servePackages();
+
       // Run the server so that we know what URL to use in the system cache.
-      await serveErrors();
+      server.serveErrors();
 
       await d.appDir({'foo': 'any'}).create();
 
@@ -124,11 +129,13 @@
     });
 
     test('downgrades to the version in the cache if necessary', () async {
+      final server = await servePackages();
+
       await populateCache({
         'foo': ['1.2.2', '1.2.3']
-      });
+      }, server);
       // Run the server so that we know what URL to use in the system cache.
-      await serveErrors();
+      server.serveErrors();
 
       await d.appDir({'foo': 'any'}).create();
 
@@ -140,11 +147,13 @@
     });
 
     test('skips invalid cached versions', () async {
+      final server = await servePackages();
+
       await populateCache({
         'foo': ['1.2.2', '1.2.3']
-      });
+      }, server);
       // Run the server so that we know what URL to use in the system cache.
-      await serveErrors();
+      server.serveErrors();
 
       await d.hostedCache([
         d.dir('foo-1.2.3', [d.file('pubspec.yaml', '{')]),
@@ -159,11 +168,13 @@
     });
 
     test('skips invalid locked versions', () async {
+      final server = await servePackages();
+
       await populateCache({
         'foo': ['1.2.2', '1.2.3']
-      });
+      }, server);
       // Run the server so that we know what URL to use in the system cache.
-      await serveErrors();
+      server.serveErrors();
 
       await d.hostedCache([
         d.dir('foo-1.2.3', [d.file('pubspec.yaml', '{')])
diff --git a/test/hosted/remove_removed_dependency_test.dart b/test/hosted/remove_removed_dependency_test.dart
index d326384..bb2e091 100644
--- a/test/hosted/remove_removed_dependency_test.dart
+++ b/test/hosted/remove_removed_dependency_test.dart
@@ -10,10 +10,9 @@
 void main() {
   forBothPubGetAndUpgrade((command) {
     test("removes a dependency that's removed from the pubspec", () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('bar', '1.0.0');
-      });
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('bar', '1.0.0');
 
       await d.appDir({'foo': 'any', 'bar': 'any'}).create();
 
diff --git a/test/hosted/remove_removed_transitive_dependency_test.dart b/test/hosted/remove_removed_transitive_dependency_test.dart
index 50702d7..ac3a452 100644
--- a/test/hosted/remove_removed_transitive_dependency_test.dart
+++ b/test/hosted/remove_removed_transitive_dependency_test.dart
@@ -12,13 +12,11 @@
     test(
         "removes a transitive dependency that's no longer depended "
         'on', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', deps: {'shared_dep': 'any'});
-        builder.serve('bar', '1.0.0',
-            deps: {'shared_dep': 'any', 'bar_dep': 'any'});
-        builder.serve('shared_dep', '1.0.0');
-        builder.serve('bar_dep', '1.0.0');
-      });
+      await servePackages()
+        ..serve('foo', '1.0.0', deps: {'shared_dep': 'any'})
+        ..serve('bar', '1.0.0', deps: {'shared_dep': 'any', 'bar_dep': 'any'})
+        ..serve('shared_dep', '1.0.0')
+        ..serve('bar_dep', '1.0.0');
 
       await d.appDir({'foo': 'any', 'bar': 'any'}).create();
 
diff --git a/test/hosted/short_syntax_test.dart b/test/hosted/short_syntax_test.dart
index 7581e34..5d4cf28 100644
--- a/test/hosted/short_syntax_test.dart
+++ b/test/hosted/short_syntax_test.dart
@@ -12,10 +12,12 @@
 import '../test_pub.dart';
 
 void main() {
-  setUp(() => servePackages((b) => b.serve('foo', '1.2.3', pubspec: {
-        'environment': {'sdk': '^2.0.0'}
-      })));
-
+  setUp(() async {
+    final server = await servePackages();
+    server.serve('foo', '1.2.3', pubspec: {
+      'environment': {'sdk': '^2.0.0'}
+    });
+  });
   forBothPubGetAndUpgrade((command) {
     Future<void> testWith(dynamic dependency) async {
       await d.dir(appPath, [
@@ -42,19 +44,19 @@
         'source': 'hosted',
         'description': {
           'name': 'foo',
-          'url': globalPackageServer.url,
+          'url': globalServer.url,
         },
         'version': '1.2.3',
       });
     }
 
     test('supports hosted: <url> syntax', () async {
-      return testWith({'hosted': globalPackageServer.url});
+      return testWith({'hosted': globalServer.url});
     });
 
     test('supports hosted map without name', () {
       return testWith({
-        'hosted': {'url': globalPackageServer.url},
+        'hosted': {'url': globalServer.url},
       });
     });
 
@@ -80,8 +82,8 @@
         await File(p.join(d.sandbox, appPath, 'pubspec.lock')).readAsString(),
       );
 
-      expect(lockFile['packages']['foo']['description']['url'],
-          globalPackageServer.url);
+      expect(
+          lockFile['packages']['foo']['description']['url'], globalServer.url);
     });
   });
 }
diff --git a/test/hosted/version_negotiation_test.dart b/test/hosted/version_negotiation_test.dart
index bed8e2d..44dbe7a 100644
--- a/test/hosted/version_negotiation_test.dart
+++ b/test/hosted/version_negotiation_test.dart
@@ -16,11 +16,11 @@
 
       await d.appDir({
         'foo': {
-          'hosted': {'name': 'foo', 'url': globalPackageServer.url}
+          'hosted': {'name': 'foo', 'url': globalServer.url}
         }
       }).create();
 
-      globalPackageServer.expect('GET', '/api/packages/foo', (request) {
+      globalServer.expect('GET', '/api/packages/foo', (request) {
         expect(
             request.headers['accept'], equals('application/vnd.pub.v2+json'));
         return shelf.Response(404);
@@ -35,13 +35,13 @@
 
       await d.appDir({
         'foo': {
-          'hosted': {'name': 'foo', 'url': globalPackageServer.url}
+          'hosted': {'name': 'foo', 'url': globalServer.url}
         }
       }).create();
 
       var pub = await startPub(args: [command.name]);
 
-      globalPackageServer.expect(
+      globalServer.expect(
           'GET', '/api/packages/foo', (request) => shelf.Response(406));
 
       await pub.shouldExit(1);
diff --git a/test/hosted/will_normalize_hosted_url_test.dart b/test/hosted/will_normalize_hosted_url_test.dart
index 08cf2b3..6cc3888 100644
--- a/test/hosted/will_normalize_hosted_url_test.dart
+++ b/test/hosted/will_normalize_hosted_url_test.dart
@@ -13,47 +13,50 @@
 void main() {
   forBothPubGetAndUpgrade((command) {
     test('does not require slash on bare domain', () async {
-      await servePackages((b) => b..serve('foo', '1.2.3'));
-      // All the tests in this file assumes that [globalPackageServer.url]
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
+      // All the tests in this file assumes that [globalServer.url]
       // will be on the form:
       //   http://localhost:<port>
       // In particular, that it doesn't contain anything path segment.
-      expect(Uri.parse(globalPackageServer.url).path, isEmpty);
+      expect(Uri.parse(globalServer.url).path, isEmpty);
 
       await d.dir(appPath, [
         d.appPubspec({
           'foo': {
-            'hosted': {'name': 'foo', 'url': globalPackageServer.url},
+            'hosted': {'name': 'foo', 'url': globalServer.url},
           },
         }),
       ]).create();
 
       await pubCommand(
         command,
-        silent: contains('${globalPackageServer.url}/api/packages/foo'),
+        silent: contains('${globalServer.url}/api/packages/foo'),
       );
     });
 
     test('normalizes extra slash', () async {
-      await servePackages((b) => b..serve('foo', '1.2.3'));
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
 
       await d.dir(appPath, [
         d.appPubspec({
           'foo': {
-            'hosted': {'name': 'foo', 'url': globalPackageServer.url + '/'},
+            'hosted': {'name': 'foo', 'url': globalServer.url + '/'},
           },
         }),
       ]).create();
 
       await pubCommand(
         command,
-        silent: contains('${globalPackageServer.url}/api/packages/foo'),
+        silent: contains('${globalServer.url}/api/packages/foo'),
       );
     });
 
     test('cannot normalize double slash', () async {
-      await servePackages((b) => b..serve('foo', '1.2.3'));
-      globalPackageServer.expect(
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
+      globalServer.expect(
         'GET',
         '//api/packages/foo',
         (request) => Response.notFound(''),
@@ -62,15 +65,14 @@
       await d.dir(appPath, [
         d.appPubspec({
           'foo': {
-            'hosted': {'name': 'foo', 'url': globalPackageServer.url + '//'},
+            'hosted': {'name': 'foo', 'url': globalServer.url + '//'},
           },
         }),
       ]).create();
 
       await pubCommand(
         command,
-        error: contains(
-            'could not find package foo at ${globalPackageServer.url}//'),
+        error: contains('could not find package foo at ${globalServer.url}//'),
         exitCode: exit_codes.UNAVAILABLE,
       );
     });
@@ -80,27 +82,31 @@
     /// This is a bit of a hack, to easily test if hosted pub URLs with a path
     /// segment works and if the slashes are normalized.
     void _proxyMyFolderToRoot() {
-      globalPackageServer.extraHandlers[RegExp('/my-folder/.*')] = (r) async {
-        if (r.method != 'GET' && r.method != 'HEAD') {
-          return Response.forbidden(null);
-        }
-        final path = r.requestedUri.path.substring('/my-folder/'.length);
-        final res = await http.get(
-          Uri.parse(globalPackageServer.url + '/$path'),
-        );
-        return Response(res.statusCode, body: res.bodyBytes, headers: {
-          'content-type': res.headers['content-type']!,
-        });
-      };
+      globalServer.handle(
+        RegExp('/my-folder/.*'),
+        (r) async {
+          if (r.method != 'GET' && r.method != 'HEAD') {
+            return Response.forbidden(null);
+          }
+          final path = r.requestedUri.path.substring('/my-folder/'.length);
+          final res = await http.get(
+            Uri.parse(globalServer.url + '/$path'),
+          );
+          return Response(res.statusCode, body: res.bodyBytes, headers: {
+            'Content-Type': res.headers['content-type']!,
+          });
+        },
+      );
     }
 
     test('will use normalized url with path', () async {
-      await servePackages((b) => b..serve('foo', '1.2.3'));
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
       _proxyMyFolderToRoot();
 
       // testing with a normalized URL
-      final testUrl = globalPackageServer.url + '/my-folder/';
-      final normalizedUrl = globalPackageServer.url + '/my-folder/';
+      final testUrl = globalServer.url + '/my-folder/';
+      final normalizedUrl = globalServer.url + '/my-folder/';
 
       await d.dir(appPath, [
         d.appPubspec({
@@ -118,12 +124,13 @@
     });
 
     test('will normalize url with path by adding slash', () async {
-      await servePackages((b) => b..serve('foo', '1.2.3'));
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
       _proxyMyFolderToRoot();
 
       // Testing with a URL that is missing the slash.
-      final testUrl = globalPackageServer.url + '/my-folder';
-      final normalizedUrl = globalPackageServer.url + '/my-folder/';
+      final testUrl = globalServer.url + '/my-folder';
+      final normalizedUrl = globalServer.url + '/my-folder/';
 
       await d.dir(appPath, [
         d.appPubspec({
diff --git a/test/lish/archives_and_uploads_a_package_test.dart b/test/lish/archives_and_uploads_a_package_test.dart
index 8ce491f..5bbac54 100644
--- a/test/lish/archives_and_uploads_a_package_test.dart
+++ b/test/lish/archives_and_uploads_a_package_test.dart
@@ -19,14 +19,14 @@
 
   test('archives and uploads a package', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.ok(jsonEncode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
@@ -53,14 +53,14 @@
     await d.dir(p.join(appPath, 'empty')).create();
 
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.ok(jsonEncode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
diff --git a/test/lish/cloud_storage_upload_doesnt_redirect_test.dart b/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
index 242b2a9..0f792d5 100644
--- a/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
+++ b/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
@@ -14,13 +14,13 @@
 
   test("cloud storage upload doesn't redirect", () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
+    handleUploadForm(globalServer);
 
-    globalPackageServer.expect('POST', '/upload', (request) async {
+    globalServer.expect('POST', '/upload', (request) async {
       await request.read().drain();
       return shelf.Response(200);
     });
diff --git a/test/lish/cloud_storage_upload_provides_an_error_test.dart b/test/lish/cloud_storage_upload_provides_an_error_test.dart
index 048f10a..5dec03d 100644
--- a/test/lish/cloud_storage_upload_provides_an_error_test.dart
+++ b/test/lish/cloud_storage_upload_provides_an_error_test.dart
@@ -14,13 +14,13 @@
 
   test('cloud storage upload provides an error', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
+    handleUploadForm(globalServer);
 
-    globalPackageServer.expect('POST', '/upload', (request) {
+    globalServer.expect('POST', '/upload', (request) {
       return request.read().drain().then((_) {
         return shelf.Response.notFound(
             '<Error><Message>Your request sucked.</Message></Error>',
diff --git a/test/lish/does_not_include_dot_file.dart b/test/lish/does_not_include_dot_file.dart
index ecc07b8..cec8ab0 100644
--- a/test/lish/does_not_include_dot_file.dart
+++ b/test/lish/does_not_include_dot_file.dart
@@ -30,14 +30,14 @@
 
   test('Check if package doesn\'t include dot-files', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.ok(jsonEncode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
diff --git a/test/lish/force_does_not_publish_if_there_are_errors_test.dart b/test/lish/force_does_not_publish_if_there_are_errors_test.dart
index d9ddb39..481f627 100644
--- a/test/lish/force_does_not_publish_if_there_are_errors_test.dart
+++ b/test/lish/force_does_not_publish_if_there_are_errors_test.dart
@@ -21,7 +21,7 @@
     ]).create();
 
     await servePackages();
-    var pub = await startPublish(globalPackageServer, args: ['--force']);
+    var pub = await startPublish(globalServer, args: ['--force']);
 
     await pub.shouldExit(exit_codes.DATA);
     expect(
diff --git a/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart b/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
index 8deb351..c5d8957 100644
--- a/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
+++ b/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
@@ -17,13 +17,13 @@
 
   test('--force publishes if there are no warnings or errors', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer, args: ['--force']);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer, args: ['--force']);
 
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.ok(jsonEncode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
diff --git a/test/lish/force_publishes_if_there_are_warnings_test.dart b/test/lish/force_publishes_if_there_are_warnings_test.dart
index eb60965..9fb3d53 100644
--- a/test/lish/force_publishes_if_there_are_warnings_test.dart
+++ b/test/lish/force_publishes_if_there_are_warnings_test.dart
@@ -22,13 +22,13 @@
     await d.dir(appPath, [d.pubspec(pkg)]).create();
 
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer, args: ['--force']);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer, args: ['--force']);
 
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.ok(jsonEncode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
diff --git a/test/lish/many_files_test.dart b/test/lish/many_files_test.dart
index 713d12d..36f4ed7 100644
--- a/test/lish/many_files_test.dart
+++ b/test/lish/many_files_test.dart
@@ -73,14 +73,14 @@
     }
 
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.ok(jsonEncode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
diff --git a/test/lish/package_creation_provides_a_malformed_error_test.dart b/test/lish/package_creation_provides_a_malformed_error_test.dart
index c1fc105..7ab0bcd 100644
--- a/test/lish/package_creation_provides_a_malformed_error_test.dart
+++ b/test/lish/package_creation_provides_a_malformed_error_test.dart
@@ -16,15 +16,15 @@
 
   test('package creation provides a malformed error', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
     var body = {'error': 'Your package was too boring.'};
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.notFound(jsonEncode(body));
     });
 
diff --git a/test/lish/package_creation_provides_a_malformed_success_test.dart b/test/lish/package_creation_provides_a_malformed_success_test.dart
index 997a61f..089d09e 100644
--- a/test/lish/package_creation_provides_a_malformed_success_test.dart
+++ b/test/lish/package_creation_provides_a_malformed_success_test.dart
@@ -16,15 +16,15 @@
 
   test('package creation provides a malformed success', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
     var body = {'success': 'Your package was awesome.'};
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.ok(jsonEncode(body));
     });
 
diff --git a/test/lish/package_creation_provides_an_error_test.dart b/test/lish/package_creation_provides_an_error_test.dart
index a4c5fd4..f5ff128 100644
--- a/test/lish/package_creation_provides_an_error_test.dart
+++ b/test/lish/package_creation_provides_an_error_test.dart
@@ -16,14 +16,14 @@
 
   test('package creation provides an error', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.notFound(jsonEncode({
         'error': {'message': 'Your package was too boring.'}
       }));
diff --git a/test/lish/package_creation_provides_invalid_json_test.dart b/test/lish/package_creation_provides_invalid_json_test.dart
index 9d845c4..2cd6212 100644
--- a/test/lish/package_creation_provides_invalid_json_test.dart
+++ b/test/lish/package_creation_provides_invalid_json_test.dart
@@ -14,14 +14,14 @@
 
   test('package creation provides invalid JSON', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.ok('{not json');
     });
 
diff --git a/test/lish/package_validation_has_a_warning_and_continues_test.dart b/test/lish/package_validation_has_a_warning_and_continues_test.dart
index 7bfcb26..c39dbc4 100644
--- a/test/lish/package_validation_has_a_warning_and_continues_test.dart
+++ b/test/lish/package_validation_has_a_warning_and_continues_test.dart
@@ -22,13 +22,13 @@
     await d.dir(appPath, [d.pubspec(pkg)]).create();
 
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
     pub.stdin.writeln('y');
-    handleUploadForm(globalPackageServer);
-    handleUpload(globalPackageServer);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
 
-    globalPackageServer.expect('GET', '/create', (request) {
+    globalServer.expect('GET', '/create', (request) {
       return shelf.Response.ok(jsonEncode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
diff --git a/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart b/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart
index ce82509..0d5a563 100644
--- a/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart
+++ b/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart
@@ -18,7 +18,7 @@
     await d.dir(appPath, [d.pubspec(pkg)]).create();
 
     await servePackages();
-    var pub = await startPublish(globalPackageServer);
+    var pub = await startPublish(globalServer);
 
     pub.stdin.writeln('n');
     await pub.shouldExit(exit_codes.DATA);
diff --git a/test/lish/package_validation_has_an_error_test.dart b/test/lish/package_validation_has_an_error_test.dart
index 5cfb41a..14c83c0 100644
--- a/test/lish/package_validation_has_an_error_test.dart
+++ b/test/lish/package_validation_has_an_error_test.dart
@@ -21,7 +21,7 @@
     ]).create();
 
     await servePackages();
-    var pub = await startPublish(globalPackageServer);
+    var pub = await startPublish(globalServer);
 
     await pub.shouldExit(exit_codes.DATA);
     expect(
diff --git a/test/lish/preview_package_validation_has_a_warning_test.dart b/test/lish/preview_package_validation_has_a_warning_test.dart
index 86472db..69f59af 100644
--- a/test/lish/preview_package_validation_has_a_warning_test.dart
+++ b/test/lish/preview_package_validation_has_a_warning_test.dart
@@ -19,7 +19,7 @@
     await d.dir(appPath, [d.pubspec(pkg)]).create();
 
     await servePackages();
-    var pub = await startPublish(globalPackageServer, args: ['--dry-run']);
+    var pub = await startPublish(globalServer, args: ['--dry-run']);
 
     await pub.shouldExit(exit_codes.DATA);
     expect(
diff --git a/test/lish/preview_package_validation_has_no_warnings_test.dart b/test/lish/preview_package_validation_has_no_warnings_test.dart
index c5b04e9..179c648 100644
--- a/test/lish/preview_package_validation_has_no_warnings_test.dart
+++ b/test/lish/preview_package_validation_has_no_warnings_test.dart
@@ -17,8 +17,8 @@
         packageMap('test_pkg', '1.0.0', null, null, {'sdk': '>=1.8.0 <2.0.0'});
     await d.dir(appPath, [d.pubspec(pkg)]).create();
 
-    await servePackages((_) {});
-    var pub = await startPublish(globalPackageServer, args: ['--dry-run']);
+    await servePackages();
+    var pub = await startPublish(globalServer, args: ['--dry-run']);
 
     await pub.shouldExit(exit_codes.SUCCESS);
     expect(pub.stderr, emitsThrough('Package has 0 warnings.'));
diff --git a/test/lish/server_arg_overrides_publish_to_url_test.dart b/test/lish/server_arg_overrides_publish_to_url_test.dart
index b2d4c14..1597146 100644
--- a/test/lish/server_arg_overrides_publish_to_url_test.dart
+++ b/test/lish/server_arg_overrides_publish_to_url_test.dart
@@ -13,16 +13,15 @@
   test('an explicit --server argument overrides a "publish_to" url', () async {
     // Create a real server that can reject requests because validators will
     // try to ping it, and will use multiple retries when doing so.
-    final packageServer = await DescriptorServer.start();
-    final fakePackageServer = 'http://localhost:${packageServer.port}';
+    final packageServer = await startPackageServer();
 
     var pkg = packageMap('test_pkg', '1.0.0');
     pkg['publish_to'] = 'http://pubspec.com';
     await d.dir(appPath, [d.pubspec(pkg)]).create();
 
     await runPub(
-        args: ['lish', '--dry-run', '--server', fakePackageServer],
-        output: contains(fakePackageServer),
+        args: ['lish', '--dry-run', '--server', packageServer.url],
+        output: contains(packageServer.url),
         exitCode: exit_codes.DATA);
 
     await packageServer.close();
diff --git a/test/lish/upload_form_fields_has_a_non_string_value_test.dart b/test/lish/upload_form_fields_has_a_non_string_value_test.dart
index d26ac3e..290e807 100644
--- a/test/lish/upload_form_fields_has_a_non_string_value_test.dart
+++ b/test/lish/upload_form_fields_has_a_non_string_value_test.dart
@@ -14,9 +14,9 @@
   setUp(d.validPackage.create);
 
   test('upload form fields has a non-string value', () async {
-    await servePackages((_) {});
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await servePackages();
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
 
@@ -24,7 +24,7 @@
       'url': 'http://example.com/upload',
       'fields': {'field': 12}
     };
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalServer, body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/lish/upload_form_fields_is_not_a_map_test.dart b/test/lish/upload_form_fields_is_not_a_map_test.dart
index c21183a..ed87da6 100644
--- a/test/lish/upload_form_fields_is_not_a_map_test.dart
+++ b/test/lish/upload_form_fields_is_not_a_map_test.dart
@@ -15,13 +15,13 @@
 
   test('upload form fields is not a map', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
 
     var body = {'url': 'http://example.com/upload', 'fields': 12};
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalServer, body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/lish/upload_form_is_missing_fields_test.dart b/test/lish/upload_form_is_missing_fields_test.dart
index 24453fb..79b6e0b 100644
--- a/test/lish/upload_form_is_missing_fields_test.dart
+++ b/test/lish/upload_form_is_missing_fields_test.dart
@@ -15,13 +15,13 @@
 
   test('upload form is missing fields', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
 
     var body = {'url': 'http://example.com/upload'};
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalServer, body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/lish/upload_form_is_missing_url_test.dart b/test/lish/upload_form_is_missing_url_test.dart
index 7861cf1..e3986cb 100644
--- a/test/lish/upload_form_is_missing_url_test.dart
+++ b/test/lish/upload_form_is_missing_url_test.dart
@@ -15,8 +15,8 @@
 
   test('upload form is missing url', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
 
@@ -24,7 +24,7 @@
       'fields': {'field1': 'value1', 'field2': 'value2'}
     };
 
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalServer, body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/lish/upload_form_provides_an_error_test.dart b/test/lish/upload_form_provides_an_error_test.dart
index 767ba10..35932b8 100644
--- a/test/lish/upload_form_provides_an_error_test.dart
+++ b/test/lish/upload_form_provides_an_error_test.dart
@@ -14,15 +14,13 @@
   setUp(d.validPackage.create);
 
   test('upload form provides an error', () async {
-    await servePackages((_) {});
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await servePackages();
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
 
-    globalPackageServer.extraHandlers['/api/packages/versions/new'] =
-        expectAsync1((request) {
-      expect(request.method, 'GET');
+    globalServer.expect('GET', '/api/packages/versions/new', (request) async {
       return shelf.Response.notFound(jsonEncode({
         'error': {'message': 'your request sucked'}
       }));
diff --git a/test/lish/upload_form_provides_invalid_json_test.dart b/test/lish/upload_form_provides_invalid_json_test.dart
index 6e02185..a046755 100644
--- a/test/lish/upload_form_provides_invalid_json_test.dart
+++ b/test/lish/upload_form_provides_invalid_json_test.dart
@@ -13,12 +13,12 @@
 
   test('upload form provides invalid JSON', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
 
-    globalPackageServer.expect('GET', '/api/packages/versions/new',
+    globalServer.expect('GET', '/api/packages/versions/new',
         (request) => shelf.Response.ok('{not json'));
 
     expect(
diff --git a/test/lish/upload_form_url_is_not_a_string_test.dart b/test/lish/upload_form_url_is_not_a_string_test.dart
index cc9b14f..784289f 100644
--- a/test/lish/upload_form_url_is_not_a_string_test.dart
+++ b/test/lish/upload_form_url_is_not_a_string_test.dart
@@ -15,8 +15,8 @@
 
   test('upload form url is not a string', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
 
@@ -25,7 +25,7 @@
       'fields': {'field1': 'value1', 'field2': 'value2'}
     };
 
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalServer, body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/list_package_dirs/lists_dependency_directories_test.dart b/test/list_package_dirs/lists_dependency_directories_test.dart
index af019a6..2cd9664 100644
--- a/test/list_package_dirs/lists_dependency_directories_test.dart
+++ b/test/list_package_dirs/lists_dependency_directories_test.dart
@@ -12,7 +12,8 @@
 
 void main() {
   test('prints the local paths to all packages in the lockfile', () async {
-    await servePackages((builder) => builder.serve('bar', '1.0.0'));
+    final server = await servePackages()
+      ..serve('bar', '1.0.0');
 
     await d
         .dir('foo', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
@@ -37,7 +38,7 @@
       'packages': {
         'foo': path.join(d.sandbox, 'foo', 'lib'),
         'bar': path.join(d.sandbox, cachePath, 'hosted',
-            'localhost%58${globalServer!.port}', 'bar-1.0.0', 'lib'),
+            'localhost%58${server.port}', 'bar-1.0.0', 'lib'),
         'myapp': canonicalize(path.join(d.sandbox, appPath, 'lib'))
       },
       'input_files': [
diff --git a/test/must_pub_get_test.dart b/test/must_pub_get_test.dart
index 6ead4da..dfc09d7 100644
--- a/test/must_pub_get_test.dart
+++ b/test/must_pub_get_test.dart
@@ -14,12 +14,14 @@
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
 
+late PackageServer server;
+
 void main() {
   setUp(() async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0');
-    });
+    server = await servePackages();
+
+    server.serve('foo', '1.0.0');
+    server.serve('foo', '2.0.0');
 
     await d.dir(appPath, [
       d.appPubspec(),
@@ -332,10 +334,8 @@
       setUp(() async {
         // Avoid using a path dependency because it triggers the full validation
         // logic. We want to be sure SDK-validation works without that logic.
-        globalPackageServer.add((builder) {
-          builder.serve('foo', '3.0.0', pubspec: {
-            'environment': {'sdk': '>=1.0.0 <2.0.0'}
-          });
+        server.serve('foo', '3.0.0', pubspec: {
+          'environment': {'sdk': '>=1.0.0 <2.0.0'}
         });
 
         await d.dir(appPath, [
@@ -360,10 +360,8 @@
         'current Flutter SDK', () async {
       // Avoid using a path dependency because it triggers the full validation
       // logic. We want to be sure SDK-validation works without that logic.
-      globalPackageServer.add((builder) {
-        builder.serve('foo', '3.0.0', pubspec: {
-          'environment': {'flutter': '>=1.0.0 <2.0.0'}
-        });
+      server.serve('foo', '3.0.0', pubspec: {
+        'environment': {'flutter': '>=1.0.0 <2.0.0'}
       });
 
       await d.dir('flutter', [d.file('version', '1.2.3')]).create();
@@ -522,10 +520,8 @@
 
     group("an overridden dependency's SDK constraint is unmatched", () {
       setUp(() async {
-        globalPackageServer.add((builder) {
-          builder.serve('bar', '1.0.0', pubspec: {
-            'environment': {'sdk': '0.0.0-fake'}
-          });
+        server.serve('bar', '1.0.0', pubspec: {
+          'environment': {'sdk': '0.0.0-fake'}
         });
 
         await d.dir(appPath, [
@@ -547,10 +543,8 @@
         () async {
       // Avoid using a path dependency because it triggers the full validation
       // logic. We want to be sure SDK-validation works without that logic.
-      globalPackageServer.add((builder) {
-        builder.serve('foo', '3.0.0', pubspec: {
-          'environment': {'flutter': '>=1.0.0 <2.0.0'}
-        });
+      server.serve('foo', '3.0.0', pubspec: {
+        'environment': {'flutter': '>=1.0.0 <2.0.0'}
       });
 
       await d.dir('flutter', [d.file('version', '1.2.3')]).create();
diff --git a/test/oauth2/logout_test.dart b/test/oauth2/logout_test.dart
index 9f01187..a12a652 100644
--- a/test/oauth2/logout_test.dart
+++ b/test/oauth2/logout_test.dart
@@ -11,7 +11,7 @@
   test('with an existing credentials file, deletes it.', () async {
     await servePackages();
     await d
-        .credentialsFile(globalPackageServer, 'access token',
+        .credentialsFile(globalServer, 'access token',
             refreshToken: 'refresh token',
             expiration: DateTime.now().add(Duration(hours: 1)))
         .create();
@@ -28,7 +28,7 @@
     await servePackages();
     await d
         .credentialsFile(
-          globalPackageServer,
+          globalServer,
           'access token',
           refreshToken: 'refresh token',
           expiration: DateTime.now().add(Duration(hours: 1)),
@@ -37,7 +37,7 @@
 
     await d
         .legacyCredentialsFile(
-          globalPackageServer,
+          globalServer,
           'access token',
           refreshToken: 'refresh token',
           expiration: DateTime.now().add(Duration(hours: 1)),
diff --git a/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart b/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
index 5d462b1..75b47ab 100644
--- a/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
+++ b/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
@@ -19,11 +19,11 @@
     await d.dir(
         configPath, [d.file('pub-credentials.json', '{bad json')]).create();
 
-    var pub = await startPublish(globalPackageServer);
+    var pub = await startPublish(globalServer);
     await confirmPublish(pub);
-    await authorizePub(pub, globalPackageServer, 'new access token');
+    await authorizePub(pub, globalServer, 'new access token');
 
-    globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
+    globalServer.expect('GET', '/api/packages/versions/new', (request) {
       expect(request.headers,
           containsPair('authorization', 'Bearer new access token'));
 
@@ -34,6 +34,6 @@
     // do so rather than killing it so it'll write out the credentials file.
     await pub.shouldExit(1);
 
-    await d.credentialsFile(globalPackageServer, 'new access token').validate();
+    await d.credentialsFile(globalServer, 'new access token').validate();
   });
 }
diff --git a/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart b/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
index 4994503..3c22994 100644
--- a/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
+++ b/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
@@ -12,8 +12,8 @@
     await d.validPackage.create();
 
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
 
diff --git a/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart b/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
index c8b56c3..624f427 100644
--- a/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
+++ b/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
@@ -21,14 +21,14 @@
 
     await servePackages();
     await d
-        .credentialsFile(globalPackageServer, 'access token',
+        .credentialsFile(globalServer, 'access token',
             refreshToken: 'bad refresh token',
             expiration: DateTime.now().subtract(Duration(hours: 1)))
         .create();
 
-    var pub = await startPublish(globalPackageServer);
+    var pub = await startPublish(globalServer);
 
-    globalPackageServer.expect('POST', '/token', (request) {
+    globalServer.expect('POST', '/token', (request) {
       return request.read().drain().then((_) {
         return shelf.Response(400,
             body: jsonEncode({'error': 'invalid_request'}),
@@ -39,11 +39,10 @@
     await confirmPublish(pub);
 
     await expectLater(pub.stdout, emits(startsWith('Uploading...')));
-    await authorizePub(pub, globalPackageServer, 'new access token');
+    await authorizePub(pub, globalServer, 'new access token');
 
     var done = Completer();
-    globalPackageServer.expect('GET', '/api/packages/versions/new',
-        (request) async {
+    globalServer.expect('GET', '/api/packages/versions/new', (request) async {
       expect(request.headers,
           containsPair('authorization', 'Bearer new access token'));
 
diff --git a/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart b/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
index de2e53c..7fbbb9f 100644
--- a/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
+++ b/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
@@ -18,15 +18,15 @@
 
     await servePackages();
     await d
-        .credentialsFile(globalPackageServer, 'access token',
+        .credentialsFile(globalServer, 'access token',
             refreshToken: 'refresh token',
             expiration: DateTime.now().subtract(Duration(hours: 1)))
         .create();
 
-    var pub = await startPublish(globalPackageServer);
+    var pub = await startPublish(globalServer);
     await confirmPublish(pub);
 
-    globalPackageServer.expect('POST', '/token', (request) {
+    globalServer.expect('POST', '/token', (request) {
       return request.readAsString().then((body) {
         expect(
             body, matches(RegExp(r'(^|&)refresh_token=refresh\+token(&|$)')));
@@ -38,7 +38,7 @@
       });
     });
 
-    globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
+    globalServer.expect('GET', '/api/packages/versions/new', (request) {
       expect(request.headers,
           containsPair('authorization', 'Bearer new access token'));
 
@@ -48,7 +48,7 @@
     await pub.shouldExit();
 
     await d
-        .credentialsFile(globalPackageServer, 'new access token',
+        .credentialsFile(globalServer, 'new access token',
             refreshToken: 'refresh token')
         .validate();
   });
diff --git a/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart b/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
index 14009a7..803c529 100644
--- a/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
+++ b/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
@@ -17,20 +17,20 @@
 
     await servePackages();
     await d
-        .credentialsFile(globalPackageServer, 'access token',
+        .credentialsFile(globalServer, 'access token',
             expiration: DateTime.now().subtract(Duration(hours: 1)))
         .create();
 
-    var pub = await startPublish(globalPackageServer);
+    var pub = await startPublish(globalServer);
     await confirmPublish(pub);
 
     await expectLater(
         pub.stderr,
         emits("Pub's authorization to upload packages has expired and "
             "can't be automatically refreshed."));
-    await authorizePub(pub, globalPackageServer, 'new access token');
+    await authorizePub(pub, globalServer, 'new access token');
 
-    globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
+    globalServer.expect('GET', '/api/packages/versions/new', (request) {
       expect(request.headers,
           containsPair('authorization', 'Bearer new access token'));
 
@@ -41,6 +41,6 @@
     // do so rather than killing it so it'll write out the credentials file.
     await pub.shouldExit(1);
 
-    await d.credentialsFile(globalPackageServer, 'new access token').validate();
+    await d.credentialsFile(globalServer, 'new access token').validate();
   });
 }
diff --git a/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart b/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
index e1dae14..961a465 100644
--- a/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
+++ b/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
@@ -16,11 +16,11 @@
     await d.validPackage.create();
 
     await servePackages();
-    var pub = await startPublish(globalPackageServer);
+    var pub = await startPublish(globalServer);
     await confirmPublish(pub);
-    await authorizePub(pub, globalPackageServer);
+    await authorizePub(pub, globalServer);
 
-    globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
+    globalServer.expect('GET', '/api/packages/versions/new', (request) {
       expect(request.headers,
           containsPair('authorization', 'Bearer access token'));
 
@@ -31,6 +31,6 @@
     // do so rather than killing it so it'll write out the credentials file.
     await pub.shouldExit(1);
 
-    await d.credentialsFile(globalPackageServer, 'access token').validate();
+    await d.credentialsFile(globalServer, 'access token').validate();
   });
 }
diff --git a/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index 136342f..2e3b62f 100644
--- a/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -16,12 +16,12 @@
       'credentials.json', () async {
     await d.validPackage.create();
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPublish(globalPackageServer);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPublish(globalServer);
 
     await confirmPublish(pub);
 
-    globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
+    globalServer.expect('GET', '/api/packages/versions/new', (request) {
       return shelf.Response(401,
           body: jsonEncode({
             'error': {'message': 'your token sucks'}
diff --git a/test/outdated/outdated_test.dart b/test/outdated/outdated_test.dart
index 763f304..31113c7 100644
--- a/test/outdated/outdated_test.dart
+++ b/test/outdated/outdated_test.dart
@@ -45,10 +45,10 @@
 
   testWithGolden('no lockfile', (ctx) async {
     await d.appDir({'foo': '^1.0.0', 'bar': '^1.0.0'}).create();
-    await servePackages((builder) => builder
+    await servePackages()
       ..serve('foo', '1.2.3')
       ..serve('bar', '1.2.3')
-      ..serve('bar', '2.0.0'));
+      ..serve('bar', '2.0.0');
 
     await ctx.runOutdatedTests();
   });
@@ -61,7 +61,8 @@
   });
 
   testWithGolden('newer versions available', (ctx) async {
-    await servePackages((builder) => builder
+    final builder = await servePackages();
+    builder
       ..serve('foo', '1.2.3', deps: {'transitive': '^1.0.0'})
       ..serve('bar', '1.0.0')
       ..serve('builder', '1.2.3', deps: {
@@ -69,7 +70,7 @@
         'dev_trans': '^1.0.0',
       })
       ..serve('transitive', '1.2.3')
-      ..serve('dev_trans', '1.0.0'));
+      ..serve('dev_trans', '1.0.0');
 
     await d.dir('local_package', [
       d.libDir('local_package'),
@@ -88,7 +89,7 @@
       })
     ]).create();
     await pubGet();
-    globalPackageServer.add((builder) => builder
+    builder
       ..serve('foo', '1.3.0', deps: {'transitive': '>=1.0.0<3.0.0'})
       ..serve('foo', '2.0.0',
           deps: {'transitive': '>=1.0.0<3.0.0', 'transitive2': '^1.0.0'})
@@ -104,15 +105,13 @@
       ..serve('transitive', '2.0.0')
       ..serve('transitive2', '1.0.0')
       ..serve('transitive3', '1.0.0')
-      ..serve('dev_trans', '2.0.0'));
-
+      ..serve('dev_trans', '2.0.0');
     await ctx.runOutdatedTests();
   });
 
   testWithGolden('circular dependency on root', (ctx) async {
-    await servePackages(
-      (builder) => builder..serve('foo', '1.2.3', deps: {'app': '^1.0.0'}),
-    );
+    final server = await servePackages();
+    server.serve('foo', '1.2.3', deps: {'app': '^1.0.0'});
 
     await d.dir(appPath, [
       d.pubspec({
@@ -126,10 +125,7 @@
 
     await pubGet();
 
-    globalPackageServer.add(
-      (builder) => builder..serve('foo', '1.3.0', deps: {'app': '^1.0.1'}),
-    );
-
+    server.serve('foo', '1.3.0', deps: {'app': '^1.0.1'});
     await ctx.runOutdatedTests();
   });
 
@@ -145,11 +141,11 @@
       })
     ]).create();
 
-    await servePackages((builder) => builder
+    await servePackages()
       ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
       ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
       ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
-      ..serve('bar', '2.0.0', deps: {'foo': '^1.0.0'}));
+      ..serve('bar', '2.0.0', deps: {'foo': '^1.0.0'});
     await pubGet();
 
     await ctx.runOutdatedTests();
@@ -172,62 +168,60 @@
       }),
     ]).create();
 
-    await servePackages(
-      (builder) => builder
-        ..serve('foo', '1.0.0', deps: {
-          'bar': '^1.0.0'
-        }, pubspec: {
-          'environment': {'sdk': '>=2.9.0 < 3.0.0'}
-        })
-        ..serve('bar', '1.0.0', pubspec: {
-          'environment': {'sdk': '>=2.9.0 < 3.0.0'}
-        })
-        ..serve('foo', '2.0.0-nullsafety.0', deps: {
-          'bar': '^2.0.0'
-        }, pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'}
-        })
-        ..serve('foo', '2.0.0', deps: {
-          'bar': '^1.0.0'
-        }, pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'}
-        })
-        ..serve('bar', '2.0.0', pubspec: {
-          'environment': {'sdk': '>=2.13.0 < 3.0.0'}
-        })
-        ..serve('file_opts_out', '1.0.0', pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'},
-        }, contents: [
-          d.dir('lib', [d.file('main.dart', '// @dart = 2.9\n')])
-        ])
-        ..serve('file_opts_out', '2.0.0', pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'},
-        })
-        ..serve('fails_analysis', '1.0.0', pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'},
-        }, contents: [
-          d.dir('lib', [d.file('main.dart', 'syntax error\n')])
-        ])
-        ..serve('fails_analysis', '2.0.0', pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'},
-        })
-        ..serve('file_in_dependency_opts_out', '1.0.0', deps: {
-          'file_opts_out': '^1.0.0'
-        }, pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'},
-        })
-        ..serve('file_in_dependency_opts_out', '2.0.0', pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'},
-        })
-        ..serve('fails_analysis_in_dependency', '1.0.0', deps: {
-          'fails_analysis': '^1.0.0'
-        }, pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'},
-        })
-        ..serve('fails_analysis_in_dependency', '2.0.0', pubspec: {
-          'environment': {'sdk': '>=2.12.0 < 3.0.0'},
-        }),
-    );
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {
+        'bar': '^1.0.0'
+      }, pubspec: {
+        'environment': {'sdk': '>=2.9.0 < 3.0.0'}
+      })
+      ..serve('bar', '1.0.0', pubspec: {
+        'environment': {'sdk': '>=2.9.0 < 3.0.0'}
+      })
+      ..serve('foo', '2.0.0-nullsafety.0', deps: {
+        'bar': '^2.0.0'
+      }, pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'}
+      })
+      ..serve('foo', '2.0.0', deps: {
+        'bar': '^1.0.0'
+      }, pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'}
+      })
+      ..serve('bar', '2.0.0', pubspec: {
+        'environment': {'sdk': '>=2.13.0 < 3.0.0'}
+      })
+      ..serve('file_opts_out', '1.0.0', pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+      }, contents: [
+        d.dir('lib', [d.file('main.dart', '// @dart = 2.9\n')])
+      ])
+      ..serve('file_opts_out', '2.0.0', pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+      })
+      ..serve('fails_analysis', '1.0.0', pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+      }, contents: [
+        d.dir('lib', [d.file('main.dart', 'syntax error\n')])
+      ])
+      ..serve('fails_analysis', '2.0.0', pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+      })
+      ..serve('file_in_dependency_opts_out', '1.0.0', deps: {
+        'file_opts_out': '^1.0.0'
+      }, pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+      })
+      ..serve('file_in_dependency_opts_out', '2.0.0', pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+      })
+      ..serve('fails_analysis_in_dependency', '1.0.0', deps: {
+        'fails_analysis': '^1.0.0'
+      }, pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+      })
+      ..serve('fails_analysis_in_dependency', '2.0.0', pubspec: {
+        'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+      });
     await pubGet(environment: {'_PUB_TEST_SDK_VERSION': '2.13.0'});
 
     await ctx.runOutdatedTests(environment: {
@@ -236,7 +230,7 @@
   });
 
   testWithGolden('null-safety no resolution', (ctx) async {
-    await servePackages((builder) => builder
+    await servePackages()
       ..serve('foo', '1.0.0', pubspec: {
         'environment': {'sdk': '>=2.9.0 < 3.0.0'}
       })
@@ -252,7 +246,7 @@
         'foo': '^1.0.0'
       }, pubspec: {
         'environment': {'sdk': '>=2.12.0 < 3.0.0'}
-      }));
+      });
 
     await d.dir(appPath, [
       d.pubspec({
@@ -274,7 +268,7 @@
   });
 
   testWithGolden('null-safety already migrated', (ctx) async {
-    await servePackages((builder) => builder
+    await servePackages()
       ..serve('foo', '1.0.0', pubspec: {
         'environment': {'sdk': '>=2.9.0 < 3.0.0'}
       })
@@ -291,7 +285,7 @@
       })
       ..serve('devTransitive', '1.0.0', pubspec: {
         'environment': {'sdk': '>=2.9.0 < 3.0.0'}
-      }));
+      });
 
     await d.dir(appPath, [
       d.pubspec({
@@ -316,15 +310,13 @@
 
   testWithGolden('overridden dependencies', (ctx) async {
     ensureGit();
-    await servePackages(
-      (builder) => builder
-        ..serve('foo', '1.0.0')
-        ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
-        ..serve('bar', '1.0.0')
-        ..serve('bar', '2.0.0')
-        ..serve('baz', '1.0.0')
-        ..serve('baz', '2.0.0'),
-    );
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '2.0.0')
+      ..serve('baz', '1.0.0')
+      ..serve('baz', '2.0.0');
 
     await d.git('foo.git', [
       d.libPubspec('foo', '1.0.1'),
@@ -360,13 +352,11 @@
 
   testWithGolden('overridden dependencies - no resolution', (ctx) async {
     ensureGit();
-    await servePackages(
-      (builder) => builder
-        ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'})
-        ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
-        ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
-        ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'}),
-    );
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'})
+      ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
+      ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
+      ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'});
 
     await d.dir(appPath, [
       d.pubspec({
@@ -391,7 +381,7 @@
   testWithGolden(
       'latest version reported while locked on a prerelease can be a prerelease',
       (ctx) async {
-    await servePackages((builder) => builder
+    await servePackages()
       ..serve('foo', '0.9.0')
       ..serve('foo', '1.0.0-dev.1')
       ..serve('foo', '1.0.0-dev.2')
@@ -400,7 +390,7 @@
       ..serve('bar', '1.0.0-dev.2')
       ..serve('mop', '0.10.0-dev')
       ..serve('mop', '0.10.0')
-      ..serve('mop', '1.0.0-dev'));
+      ..serve('mop', '1.0.0-dev');
     await d.dir(appPath, [
       d.pubspec({
         'name': 'app',
@@ -419,7 +409,7 @@
   });
 
   testWithGolden('Handles SDK dependencies', (ctx) async {
-    await servePackages((builder) => builder
+    await servePackages()
       ..serve('foo', '1.0.0', pubspec: {
         'environment': {'sdk': '>=2.10.0 <3.0.0'}
       })
@@ -428,7 +418,7 @@
       })
       ..serve('foo', '2.0.0', pubspec: {
         'environment': {'sdk': '>=2.12.0 <3.0.0'}
-      }));
+      });
 
     await d.dir('flutter-root', [
       d.file('version', '1.2.3'),
diff --git a/test/package_config_file_test.dart b/test/package_config_file_test.dart
index e609d28..763ce42 100644
--- a/test/package_config_file_test.dart
+++ b/test/package_config_file_test.dart
@@ -12,13 +12,12 @@
 void main() {
   forBothPubGetAndUpgrade((command) {
     test('package_config.json file is created', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3',
-            deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])]);
-        builder.serve('bar', '3.2.1', contents: [d.dir('lib', [])]);
-        builder.serve('baz', '2.2.2',
+      await servePackages()
+        ..serve('foo', '1.2.3',
+            deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])])
+        ..serve('bar', '3.2.1', contents: [d.dir('lib', [])])
+        ..serve('baz', '2.2.2',
             deps: {'bar': '3.2.1'}, contents: [d.dir('lib', [])]);
-      });
 
       await d.dir(appPath, [
         d.appPubspec({'foo': '1.2.3'}),
@@ -54,13 +53,12 @@
     });
 
     test('package_config.json file is overwritten', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3',
-            deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])]);
-        builder.serve('bar', '3.2.1', contents: [d.dir('lib', [])]);
-        builder.serve('baz', '2.2.2',
+      await servePackages()
+        ..serve('foo', '1.2.3',
+            deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])])
+        ..serve('bar', '3.2.1', contents: [d.dir('lib', [])])
+        ..serve('baz', '2.2.2',
             deps: {'bar': '3.2.1'}, contents: [d.dir('lib', [])]);
-      });
 
       await d.dir(appPath, [
         d.appPubspec({'foo': '1.2.3'}),
@@ -129,11 +127,10 @@
     test(
         '.dart_tool/package_config.json file has relative path to path dependency',
         () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3',
-            deps: {'baz': 'any'}, contents: [d.dir('lib', [])]);
-        builder.serve('baz', '9.9.9', deps: {}, contents: [d.dir('lib', [])]);
-      });
+      await servePackages()
+        ..serve('foo', '1.2.3',
+            deps: {'baz': 'any'}, contents: [d.dir('lib', [])])
+        ..serve('baz', '9.9.9', deps: {}, contents: [d.dir('lib', [])]);
 
       await d.dir('local_baz', [
         d.libDir('baz', 'baz 3.2.1'),
@@ -180,18 +177,17 @@
     });
 
     test('package_config.json has language version', () async {
-      await servePackages((builder) {
-        builder.serve(
-          'foo',
-          '1.2.3',
-          pubspec: {
-            'environment': {
-              'sdk': '>=0.0.1 <=0.2.2+2', // tests runs with '0.1.2+3'
-            },
+      final server = await servePackages();
+      server.serve(
+        'foo',
+        '1.2.3',
+        pubspec: {
+          'environment': {
+            'sdk': '>=0.0.1 <=0.2.2+2', // tests runs with '0.1.2+3'
           },
-          contents: [d.dir('lib', [])],
-        );
-      });
+        },
+        contents: [d.dir('lib', [])],
+      );
 
       await d.dir(appPath, [
         d.pubspec({
@@ -225,18 +221,17 @@
     });
 
     test('package_config.json has 2.7 default language version', () async {
-      await servePackages((builder) {
-        builder.serve(
-          'foo',
-          '1.2.3',
-          pubspec: {
-            'environment': {
-              'sdk': 'any',
-            },
+      final server = await servePackages();
+      server.serve(
+        'foo',
+        '1.2.3',
+        pubspec: {
+          'environment': {
+            'sdk': 'any',
           },
-          contents: [d.dir('lib', [])],
-        );
-      });
+        },
+        contents: [d.dir('lib', [])],
+      );
 
       await d.dir(appPath, [
         d.pubspec({
diff --git a/test/package_server.dart b/test/package_server.dart
index b9c9d3c..952c189 100644
--- a/test/package_server.dart
+++ b/test/package_server.dart
@@ -4,179 +4,156 @@
 
 import 'dart:async';
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:path/path.dart' as p;
+import 'package:pub/src/third_party/tar/tar.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
 import 'package:test/test.dart';
 import 'package:test/test.dart' as test show expect;
 
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
 
-/// The current global [PackageServer].
-PackageServer get globalPackageServer {
-  final packageServer = _globalPackageServer;
-  if (packageServer != null) {
-    return packageServer;
-  }
-  throw StateError(
-    'globalPackageServer is not running yet, '
-    'try calling servicePackages() or serveNoPackages() first!',
-  );
-}
-
-PackageServer? _globalPackageServer;
-
-/// Get port of the global [PackageServer].
-int? get globalPackageServerPort {
-  final packageServer = _globalPackageServer;
-  if (packageServer != null) {
-    return packageServer.port;
-  }
-  return null;
-}
-
-/// 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.
-Future<void> servePackages(
-    [void Function(PackageServerBuilder)? callback]) async {
-  _globalPackageServer = await PackageServer.start(callback ?? (_) {});
-  globalServer = _globalPackageServer!._inner;
-
-  addTearDown(() {
-    _globalPackageServer = null;
-  });
-}
-
-/// Like [servePackages], but instead creates an empty server with no packages
-/// registered.
-///
-/// This will always replace a previous server.
-Future<void> serveNoPackages() => servePackages((_) {});
-
-/// Sets up the global package server to report an error on any request.
-///
-/// If no server has been set up, an empty server will be started.
-Future<void> serveErrors() async {
-  if (_globalPackageServer == null) {
-    await serveNoPackages();
-  } else {
-    globalPackageServer.serveErrors();
-  }
-}
-
 class PackageServer {
   /// The inner [DescriptorServer] that this uses to serve its descriptors.
-  final DescriptorServer _inner;
+  final shelf.Server _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', []);
+  /// Handlers of requests. Last matching handler will be used.
+  final List<_PatternAndHandler> _handlers = [];
 
-  /// 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', []);
+  // A list of all the requests recieved up till now.
+  final List<String> requestedPaths = <String>[];
 
-  /// The current [PackageServerBuilder] that a user uses to specify which
-  /// package to serve.
-  ///
-  /// This is preserved so that additional packages can be added.
-  late final PackageServerBuilder _builder;
+  PackageServer._(this._inner) {
+    _inner.mount((request) {
+      final path = request.url.path;
+      requestedPaths.add(path);
 
-  /// The port used for the server.
-  int get port => _inner.port;
+      final pathWithInitialSlash = '/$path';
+      for (final entry in _handlers.reversed) {
+        final match = entry.pattern.matchAsPrefix(pathWithInitialSlash);
+        if (match != null && match.end == pathWithInitialSlash.length) {
+          final a = entry.handler(request);
+          return a;
+        }
+      }
+      return shelf.Response.notFound('Could not find ${request.url}');
+    });
+  }
 
-  /// The URL for the server.
-  String get url => 'http://localhost:$port';
+  static final _versionInfoPattern = RegExp(r'/api/packages/([a-zA-Z_0-9]*)');
+  static final _downloadPattern =
+      RegExp(r'/packages/([^/]*)/versions/([^/]*).tar.gz');
 
-  /// Handlers for requests not easily described as packages.
-  Map<Pattern, shelf.Handler> get extraHandlers => _inner.extraHandlers;
+  static Future<PackageServer> start() async {
+    final server =
+        PackageServer._(await shelf_io.IOServer.bind('localhost', 0));
+    server.handle(
+      _versionInfoPattern,
+      (shelf.Request request) {
+        final parts = request.url.pathSegments;
+        assert(parts[0] == 'api');
+        assert(parts[1] == 'packages');
+        final name = parts[2];
 
-  /// From now on report errors on any request.
-  void serveErrors() => extraHandlers
-    ..clear()
-    ..[RegExp('.*')] = (request) {
-      fail('The HTTP server received an unexpected request:\n'
-          '${request.method} ${request.requestedUri}');
-    };
+        final package = server._packages[name];
+        if (package == null) {
+          return shelf.Response.notFound('No package named $name');
+        }
+        return shelf.Response.ok(jsonEncode({
+          'name': name,
+          'uploaders': ['nweiz@google.com'],
+          'versions': package.versions.values
+              .map((version) => packageVersionApiMap(
+                    server._inner.url.toString(),
+                    version.pubspec,
+                    retracted: version.isRetracted,
+                  ))
+              .toList(),
+          if (package.isDiscontinued) 'isDiscontinued': true,
+          if (package.discontinuedReplacementText != null)
+            'replacedBy': package.discontinuedReplacementText,
+        }));
+      },
+    );
 
-  /// 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.
-  static Future<PackageServer> start(
-      void Function(PackageServerBuilder) callback) async {
-    var descriptorServer = await DescriptorServer.start();
-    var server = PackageServer._(descriptorServer);
-    descriptorServer.contents
-      ..add(d.dir('api', [server._servedApiPackageDir]))
-      ..add(server._servedPackageDir);
-    server.add(callback);
+    server.handle(
+      _downloadPattern,
+      (shelf.Request request) {
+        final parts = request.url.pathSegments;
+        assert(parts[0] == 'packages');
+        final name = parts[1];
+        assert(parts[2] == 'versions');
+        final package = server._packages[name];
+        if (package == null) {
+          return shelf.Response.notFound('No package $name');
+        }
+
+        final version = Version.parse(
+            parts[3].substring(0, parts[3].length - '.tar.gz'.length));
+        assert(parts[3].endsWith('.tar.gz'));
+
+        for (final packageVersion in package.versions.values) {
+          if (packageVersion.version == version) {
+            return shelf.Response.ok(packageVersion.contents());
+          }
+        }
+        return shelf.Response.notFound('No version $version of $name');
+      },
+    );
     return server;
   }
 
-  PackageServer._(this._inner) {
-    _builder = PackageServerBuilder._(this);
+  Future<void> close() async {
+    await _inner.close();
   }
 
-  /// Add to the current set of packages that are being served.
-  void add(void Function(PackageServerBuilder) callback) {
-    callback(_builder);
+  /// The port used for the server.
+  int get port => _inner.url.port;
 
-    _servedApiPackageDir.contents.clear();
-    _servedPackageDir.contents.clear();
+  /// The URL for the server.
+  String get url => _inner.url.toString();
 
-    _builder._packages.forEach((name, package) {
-      _servedApiPackageDir.contents.addAll([
-        d.file(
-            name,
-            jsonEncode({
-              'name': name,
-              'uploaders': ['nweiz@google.com'],
-              'versions': package.versions.values
-                  .map((version) => packageVersionApiMap(url, version.pubspec,
-                      retracted: version.isRetracted))
-                  .toList(),
-              if (package.isDiscontinued) 'isDiscontinued': true,
-              if (package.discontinuedReplacementText != null)
-                'replacedBy': package.discontinuedReplacementText,
-            })),
-        d.dir(name, [
-          d.dir('versions', package.versions.values.map((version) {
-            return d.file(
-                version.version.toString(),
-                jsonEncode(packageVersionApiMap(url, version.pubspec,
-                    retracted: version.isRetracted, full: true)));
-          }))
-        ])
-      ]);
+  /// From now on report errors on any request.
+  void serveErrors() => _handlers
+    ..clear()
+    ..add(
+      _PatternAndHandler(
+        RegExp('.*'),
+        (request) {
+          fail('The HTTP server received an unexpected request:\n'
+              '${request.method} ${request.requestedUri}');
+        },
+      ),
+    );
 
-      _servedPackageDir.contents.add(d.dir(name, [
-        d.dir(
-            'versions',
-            package.versions.values.map((version) =>
-                d.tar('${version.version}.tar.gz', version.contents)))
-      ]));
-    });
+  void handle(Pattern pattern, shelf.Handler handler) {
+    _handlers.add(
+      _PatternAndHandler(
+        pattern,
+        handler,
+      ),
+    );
   }
 
   // Installs a handler at [pattern] that expects to be called exactly once with
   // the given [method].
+  //
+  // The handler is installed as the start to give it priority over more general
+  // handlers.
   void expect(String method, Pattern pattern, shelf.Handler handler) {
-    extraHandlers[pattern] = expectAsync1((request) {
-      test.expect(request.method, method);
-      return handler(request);
-    });
+    handle(
+      pattern,
+      expectAsync1(
+        (request) {
+          test.expect(request.method, method);
+          return handler(request);
+        },
+      ),
+    );
   }
 
   /// Returns the path of [package] at [version], installed from this server, in
@@ -188,26 +165,9 @@
   String get cachingPath =>
       p.join(d.sandbox, cachePath, 'hosted', 'localhost%58$port');
 
-  /// Replace the current set of packages that are being served.
-  void replace(void Function(PackageServerBuilder) callback) {
-    _builder._clear();
-    add(callback);
-  }
-}
-
-/// A builder for specifying which packages should be served by [servePackages].
-class PackageServerBuilder {
   /// A map from package names to the concrete packages to serve.
   final _packages = <String, _ServedPackage>{};
 
-  /// The package server that this builder is associated with.
-  final PackageServer _server;
-
-  /// The URL for the server that this builder is associated with.
-  String get serverUrl => _server.url;
-
-  PackageServerBuilder._(this._server);
-
   /// 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.
@@ -227,7 +187,44 @@
     contents = [d.file('pubspec.yaml', yaml(pubspecFields)), ...contents];
 
     var package = _packages.putIfAbsent(name, () => _ServedPackage());
-    package.versions[version] = _ServedPackageVersion(pubspecFields, contents);
+    package.versions[version] = _ServedPackageVersion(
+      pubspecFields,
+      contents: () {
+        final entries = <TarEntry>[];
+
+        void addDescriptor(d.Descriptor descriptor, String path) {
+          if (descriptor is d.DirectoryDescriptor) {
+            for (final e in descriptor.contents) {
+              addDescriptor(e, p.posix.join(path, descriptor.name));
+            }
+          } else {
+            entries.add(
+              TarEntry(
+                TarHeader(
+                  // Ensure paths in tar files use forward slashes
+                  name: p.posix.join(path, descriptor.name),
+                  // We want to keep executable bits, but otherwise use the default
+                  // file mode
+                  mode: 420,
+                  // size: 100,
+                  modified: DateTime.now(),
+                  userName: 'pub',
+                  groupName: 'pub',
+                ),
+                (descriptor as d.FileDescriptor).readAsBytes(),
+              ),
+            );
+          }
+        }
+
+        for (final e in contents ?? <d.Descriptor>[]) {
+          addDescriptor(e, '');
+        }
+        return Stream.fromIterable(entries)
+            .transform(tarWriterWith(format: OutputFormat.gnuLongName))
+            .transform(gzip.encoder);
+      },
+    );
   }
 
   // Mark a package discontinued.
@@ -239,7 +236,7 @@
   }
 
   /// Clears all existing packages from this builder.
-  void _clear() {
+  void clearPackages() {
     _packages.clear();
   }
 
@@ -257,10 +254,17 @@
 /// A package that's intended to be served.
 class _ServedPackageVersion {
   final Map pubspec;
-  final List<d.Descriptor> contents;
+  final Stream<List<int>> Function() contents;
   bool isRetracted = false;
 
   Version get version => Version.parse(pubspec['version']);
 
-  _ServedPackageVersion(this.pubspec, this.contents);
+  _ServedPackageVersion(this.pubspec, {required this.contents});
+}
+
+class _PatternAndHandler {
+  Pattern pattern;
+  shelf.Handler handler;
+
+  _PatternAndHandler(this.pattern, this.handler);
 }
diff --git a/test/packages_file_test.dart b/test/packages_file_test.dart
index e7a8a88..e7736be 100644
--- a/test/packages_file_test.dart
+++ b/test/packages_file_test.dart
@@ -12,13 +12,12 @@
 void main() {
   forBothPubGetAndUpgrade((command) {
     test('.packages file is created', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3',
-            deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])]);
-        builder.serve('bar', '3.2.1', contents: [d.dir('lib', [])]);
-        builder.serve('baz', '2.2.2',
+      await servePackages()
+        ..serve('foo', '1.2.3',
+            deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])])
+        ..serve('bar', '3.2.1', contents: [d.dir('lib', [])])
+        ..serve('baz', '2.2.2',
             deps: {'bar': '3.2.1'}, contents: [d.dir('lib', [])]);
-      });
 
       await d.dir(appPath, [
         d.appPubspec({'foo': '1.2.3'}),
@@ -34,13 +33,12 @@
     });
 
     test('.packages file is overwritten', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3',
-            deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])]);
-        builder.serve('bar', '3.2.1', contents: [d.dir('lib', [])]);
-        builder.serve('baz', '2.2.2',
+      await servePackages()
+        ..serve('foo', '1.2.3',
+            deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])])
+        ..serve('bar', '3.2.1', contents: [d.dir('lib', [])])
+        ..serve('baz', '2.2.2',
             deps: {'bar': '3.2.1'}, contents: [d.dir('lib', [])]);
-      });
 
       await d.dir(appPath, [
         d.appPubspec({'foo': '1.2.3'}),
@@ -79,11 +77,10 @@
     });
 
     test('.packages file has relative path to path dependency', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3',
-            deps: {'baz': 'any'}, contents: [d.dir('lib', [])]);
-        builder.serve('baz', '9.9.9', deps: {}, contents: [d.dir('lib', [])]);
-      });
+      await servePackages()
+        ..serve('foo', '1.2.3',
+            deps: {'baz': 'any'}, contents: [d.dir('lib', [])])
+        ..serve('baz', '9.9.9', deps: {}, contents: [d.dir('lib', [])]);
 
       await d.dir('local_baz', [
         d.libDir('baz', 'baz 3.2.1'),
diff --git a/test/pub_uploader_test.dart b/test/pub_uploader_test.dart
index a216b35..47d50d3 100644
--- a/test/pub_uploader_test.dart
+++ b/test/pub_uploader_test.dart
@@ -40,12 +40,11 @@
 
   test('adds an uploader', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
+    await d.credentialsFile(globalServer, 'access token').create();
     var pub = await startPubUploader(
-        globalPackageServer, ['--package', 'pkg', 'add', 'email']);
+        globalServer, ['--package', 'pkg', 'add', 'email']);
 
-    globalPackageServer.expect('POST', '/api/packages/pkg/uploaders',
-        (request) {
+    globalServer.expect('POST', '/api/packages/pkg/uploaders', (request) {
       return request.readAsString().then((body) {
         expect(body, equals('email=email'));
 
@@ -63,11 +62,11 @@
 
   test('removes an uploader', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
+    await d.credentialsFile(globalServer, 'access token').create();
     var pub = await startPubUploader(
-        globalPackageServer, ['--package', 'pkg', 'remove', 'email']);
+        globalServer, ['--package', 'pkg', 'remove', 'email']);
 
-    globalPackageServer.expect('DELETE', '/api/packages/pkg/uploaders/email',
+    globalServer.expect('DELETE', '/api/packages/pkg/uploaders/email',
         (request) {
       return shelf.Response.ok(
           jsonEncode({
@@ -84,11 +83,10 @@
     await d.validPackage.create();
 
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
-    var pub = await startPubUploader(globalPackageServer, ['add', 'email']);
+    await d.credentialsFile(globalServer, 'access token').create();
+    var pub = await startPubUploader(globalServer, ['add', 'email']);
 
-    globalPackageServer.expect('POST', '/api/packages/test_pkg/uploaders',
-        (request) {
+    globalServer.expect('POST', '/api/packages/test_pkg/uploaders', (request) {
       return shelf.Response.ok(
           jsonEncode({
             'success': {'message': 'Good job!'}
@@ -102,12 +100,11 @@
 
   test('add provides an error', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
+    await d.credentialsFile(globalServer, 'access token').create();
     var pub = await startPubUploader(
-        globalPackageServer, ['--package', 'pkg', 'add', 'email']);
+        globalServer, ['--package', 'pkg', 'add', 'email']);
 
-    globalPackageServer.expect('POST', '/api/packages/pkg/uploaders',
-        (request) {
+    globalServer.expect('POST', '/api/packages/pkg/uploaders', (request) {
       return shelf.Response(400,
           body: jsonEncode({
             'error': {'message': 'Bad job!'}
@@ -121,11 +118,11 @@
 
   test('remove provides an error', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
+    await d.credentialsFile(globalServer, 'access token').create();
     var pub = await startPubUploader(
-        globalPackageServer, ['--package', 'pkg', 'remove', 'e/mail']);
+        globalServer, ['--package', 'pkg', 'remove', 'e/mail']);
 
-    globalPackageServer.expect('DELETE', '/api/packages/pkg/uploaders/e%2Fmail',
+    globalServer.expect('DELETE', '/api/packages/pkg/uploaders/e%2Fmail',
         (request) {
       return shelf.Response(400,
           body: jsonEncode({
@@ -140,11 +137,11 @@
 
   test('add provides invalid JSON', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
+    await d.credentialsFile(globalServer, 'access token').create();
     var pub = await startPubUploader(
-        globalPackageServer, ['--package', 'pkg', 'add', 'email']);
+        globalServer, ['--package', 'pkg', 'add', 'email']);
 
-    globalPackageServer.expect('POST', '/api/packages/pkg/uploaders',
+    globalServer.expect('POST', '/api/packages/pkg/uploaders',
         (request) => shelf.Response.ok('{not json'));
 
     expect(
@@ -156,11 +153,11 @@
 
   test('remove provides invalid JSON', () async {
     await servePackages();
-    await d.credentialsFile(globalPackageServer, 'access token').create();
+    await d.credentialsFile(globalServer, 'access token').create();
     var pub = await startPubUploader(
-        globalPackageServer, ['--package', 'pkg', 'remove', 'email']);
+        globalServer, ['--package', 'pkg', 'remove', 'email']);
 
-    globalPackageServer.expect('DELETE', '/api/packages/pkg/uploaders/email',
+    globalServer.expect('DELETE', '/api/packages/pkg/uploaders/email',
         (request) => shelf.Response.ok('{not json'));
 
     expect(
diff --git a/test/remove/remove_test.dart b/test/remove/remove_test.dart
index 52194c9..e369c85 100644
--- a/test/remove/remove_test.dart
+++ b/test/remove/remove_test.dart
@@ -12,7 +12,8 @@
 
 void main() {
   test('removes a package from dependencies', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     await d.appDir({'foo': '1.2.3'}).create();
     await pubGet();
@@ -26,11 +27,10 @@
 
   test('removing a package from dependencies does not affect dev_dependencies',
       () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.3');
-      builder.serve('foo', '1.2.2');
-      builder.serve('bar', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.3')
+      ..serve('foo', '1.2.2')
+      ..serve('bar', '2.0.0');
 
     await d.dir(appPath, [
       d.file('pubspec.yaml', '''
@@ -60,7 +60,8 @@
   });
 
   test('dry-run does not actually remove dependency', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     await d.appDir({'foo': '1.2.3'}).create();
     await pubGet();
@@ -98,7 +99,8 @@
   });
 
   test('removes a package from dev_dependencies', () async {
-    await servePackages((builder) => builder.serve('foo', '1.2.3'));
+    final server = await servePackages();
+    server.serve('foo', '1.2.3');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -120,12 +122,11 @@
 
   test('removes multiple packages from dependencies and dev_dependencies',
       () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.3');
-      builder.serve('bar', '2.3.4');
-      builder.serve('baz', '3.2.1');
-      builder.serve('jfj', '0.2.1');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.3')
+      ..serve('bar', '2.3.4')
+      ..serve('baz', '3.2.1')
+      ..serve('jfj', '0.2.1');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -150,7 +151,8 @@
   });
 
   test('removes git dependencies', () async {
-    await servePackages((builder) => builder.serve('bar', '1.2.3'));
+    final server = await servePackages();
+    server.serve('bar', '1.2.3');
 
     ensureGit();
     final repo = d.git('foo.git', [
@@ -173,7 +175,8 @@
   });
 
   test('removes path dependencies', () async {
-    await servePackages((builder) => builder.serve('bar', '1.2.3'));
+    final server = await servePackages();
+    server.serve('bar', '1.2.3');
     await d
         .dir('foo', [d.libDir('foo'), d.libPubspec('foo', '0.0.1')]).create();
 
@@ -190,16 +193,16 @@
   });
 
   test('removes hosted dependencies', () async {
-    await servePackages((builder) => builder.serve('bar', '2.0.1'));
+    final server = await servePackages();
+    server.serve('bar', '2.0.1');
 
-    var server = await PackageServer.start((builder) {
-      builder.serve('foo', '1.2.3');
-    });
+    var custom = await startPackageServer();
+    custom.serve('foo', '1.2.3');
 
     await d.appDir({
       'foo': {
         'version': '1.2.3',
-        'hosted': {'name': 'foo', 'url': 'http://localhost:${server.port}'}
+        'hosted': {'name': 'foo', 'url': 'http://localhost:${custom.port}'}
       },
       'bar': '2.0.1'
     }).create();
@@ -212,10 +215,9 @@
   });
 
   test('preserves comments', () async {
-    await servePackages((builder) {
-      builder.serve('bar', '1.0.0');
-      builder.serve('foo', '1.0.0');
-    });
+    await servePackages()
+      ..serve('bar', '1.0.0')
+      ..serve('foo', '1.0.0');
 
     await d.dir(appPath, [
       d.file('pubspec.yaml', '''
diff --git a/test/run/package_api_test.dart b/test/run/package_api_test.dart
index f5660b6..4d05408 100644
--- a/test/run/package_api_test.dart
+++ b/test/run/package_api_test.dart
@@ -49,11 +49,10 @@
   });
 
   test('a snapshotted application sees a file: package root', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', contents: [
-        d.dir('bin', [d.file('script.dart', _script)])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', contents: [
+      d.dir('bin', [d.file('script.dart', _script)])
+    ]);
 
     await d.dir(appPath, [
       d.appPubspec({'foo': 'any'})
@@ -73,8 +72,8 @@
             .toString()));
     expect(pub.stdout,
         emits(p.toUri(p.join(d.sandbox, 'myapp/lib/resource.txt')).toString()));
-    var fooResourcePath = p.join(
-        globalPackageServer.pathInCache('foo', '1.0.0'), 'lib/resource.txt');
+    var fooResourcePath =
+        p.join(globalServer.pathInCache('foo', '1.0.0'), 'lib/resource.txt');
     expect(pub.stdout, emits(p.toUri(fooResourcePath).toString()));
     await pub.shouldExit(0);
   });
diff --git a/test/run/precompile_test.dart b/test/run/precompile_test.dart
index 5506a0b..2d70b4c 100644
--- a/test/run/precompile_test.dart
+++ b/test/run/precompile_test.dart
@@ -21,11 +21,11 @@
       d.appPubspec({'test': '1.0.0'}),
     ]).create();
 
-    await servePackages((server) => server
-      ..serve('test', '1.0.0', contents: [
-        d.dir('bin',
-            [d.file('test.dart', 'main(List<String> args) => print("hello");')])
-      ]));
+    final server = await servePackages();
+    server.serve('test', '1.0.0', contents: [
+      d.dir('bin',
+          [d.file('test.dart', 'main(List<String> args) => print("hello");')])
+    ]);
 
     await pubGet(args: ['--no-precompile']);
   }
@@ -57,10 +57,10 @@
       d.appPubspec({'test': '1.0.0'}),
     ]).create();
 
-    await servePackages((server) => server
-      ..serve('test', '1.0.0', contents: [
-        d.dir('bin', [d.file('test.dart', _script)])
-      ]));
+    final server = await servePackages();
+    server.serve('test', '1.0.0', contents: [
+      d.dir('bin', [d.file('test.dart', _script)])
+    ]);
 
     await pubGet(
         args: ['--no-precompile'], environment: {'PUB_CACHE': '.pub_cache'});
@@ -80,10 +80,10 @@
       d.appPubspec({'test': '1.0.0'}),
     ]).create();
 
-    await servePackages((server) => server
-      ..serve('test', '1.0.0', contents: [
-        d.dir('bin', [d.file('test.dart', _script)])
-      ]));
+    final server = await servePackages();
+    server.serve('test', '1.0.0', contents: [
+      d.dir('bin', [d.file('test.dart', _script)])
+    ]);
 
     await pubGet(
         args: ['--precompile'],
@@ -104,10 +104,10 @@
       d.appPubspec({'test': '1.0.0'}),
     ]).create();
 
-    await servePackages((server) => server
-      ..serve('test', '1.0.0', contents: [
-        d.dir('bin', [d.file('test.dart', _script)])
-      ]));
+    final server = await servePackages();
+    server.serve('test', '1.0.0', contents: [
+      d.dir('bin', [d.file('test.dart', _script)])
+    ]);
 
     await pubGet(
         args: ['--precompile'],
diff --git a/test/run/runs_from_a_dependency_override_after_dependency_test.dart b/test/run/runs_from_a_dependency_override_after_dependency_test.dart
index f7e7c7a..c11bacb 100644
--- a/test/run/runs_from_a_dependency_override_after_dependency_test.dart
+++ b/test/run/runs_from_a_dependency_override_after_dependency_test.dart
@@ -10,14 +10,13 @@
 void main() {
   // Regression test for issue 23113
   test('runs a named Dart application in a dependency', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'name': 'foo',
-        'version': '1.0.0'
-      }, contents: [
-        d.dir('bin', [d.file('bar.dart', "main() => print('foobar');")])
-      ]);
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'name': 'foo',
+      'version': '1.0.0'
+    }, contents: [
+      d.dir('bin', [d.file('bar.dart', "main() => print('foobar');")])
+    ]);
 
     await d.dir(appPath, [
       d.appPubspec({'foo': null})
diff --git a/test/sdk_test.dart b/test/sdk_test.dart
index 3f3b00b..6e50ff0 100644
--- a/test/sdk_test.dart
+++ b/test/sdk_test.dart
@@ -13,9 +13,8 @@
 void main() {
   forBothPubGetAndUpgrade((command) {
     setUp(() async {
-      await servePackages((builder) {
-        builder.serve('bar', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('bar', '1.0.0');
 
       await d.dir('flutter', [
         d.dir('packages', [
diff --git a/test/snapshot_test.dart b/test/snapshot_test.dart
index 4641ca9..8143f7e 100644
--- a/test/snapshot_test.dart
+++ b/test/snapshot_test.dart
@@ -11,17 +11,15 @@
 void main() {
   group('creates a snapshot', () {
     test('for an immediate dependency', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3', contents: [
-          d.dir('bin', [
-            d.file('hello.dart', "void main() => print('hello!');"),
-            d.file('goodbye.dart', "void main() => print('goodbye!');"),
-            d.file('shell.sh', 'echo shell'),
-            d.dir(
-                'subdir', [d.file('sub.dart', "void main() => print('sub!');")])
-          ])
-        ]);
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.2.3', contents: [
+        d.dir('bin', [
+          d.file('hello.dart', "void main() => print('hello!');"),
+          d.file('goodbye.dart', "void main() => print('goodbye!');"),
+          d.file('shell.sh', 'echo shell'),
+          d.dir('subdir', [d.file('sub.dart', "void main() => print('sub!');")])
+        ])
+      ]);
 
       await d.appDir({'foo': '1.2.3'}).create();
 
@@ -49,8 +47,8 @@
     });
 
     test("for an immediate dependency that's also transitive", () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.2.3', contents: [
+      await servePackages()
+        ..serve('foo', '1.2.3', contents: [
           d.dir('bin', [
             d.file('hello.dart', "void main() => print('hello!');"),
             d.file('goodbye.dart', "void main() => print('goodbye!');"),
@@ -58,9 +56,8 @@
             d.dir(
                 'subdir', [d.file('sub.dart', "void main() => print('sub!');")])
           ])
-        ]);
-        builder.serve('bar', '1.2.3', deps: {'foo': '1.2.3'});
-      });
+        ])
+        ..serve('bar', '1.2.3', deps: {'foo': '1.2.3'});
 
       await d.appDir({'foo': '1.2.3'}).create();
 
@@ -89,12 +86,11 @@
 
     group('again if', () {
       test('its package is updated', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3', contents: [
-            d.dir('bin',
-                [d.file('hello.dart', "void main() => print('hello!');")])
-          ]);
-        });
+        final server = await servePackages();
+        server.serve('foo', '1.2.3', contents: [
+          d.dir(
+              'bin', [d.file('hello.dart', "void main() => print('hello!');")])
+        ]);
 
         await d.appDir({'foo': 'any'}).create();
 
@@ -105,12 +101,10 @@
           d.file('hello.dart-$versionSuffix.snapshot', contains('hello!'))
         ]).validate();
 
-        globalPackageServer.add((builder) {
-          builder.serve('foo', '1.2.4', contents: [
-            d.dir('bin',
-                [d.file('hello.dart', "void main() => print('hello 2!');")])
-          ]);
-        });
+        server.serve('foo', '1.2.4', contents: [
+          d.dir('bin',
+              [d.file('hello.dart', "void main() => print('hello 2!');")])
+        ]);
 
         await pubUpgrade(
             args: ['--precompile'], output: contains('Built foo:hello.'));
@@ -125,22 +119,22 @@
       });
 
       test('a dependency of its package is updated', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.2.3', pubspec: {
-            'dependencies': {'bar': 'any'}
-          }, contents: [
-            d.dir('bin', [
-              d.file('hello.dart', """
+        final server = await servePackages();
+
+        server.serve('foo', '1.2.3', pubspec: {
+          'dependencies': {'bar': 'any'}
+        }, contents: [
+          d.dir('bin', [
+            d.file('hello.dart', """
             import 'package:bar/bar.dart';
 
             void main() => print(message);
           """)
-            ])
-          ]);
-          builder.serve('bar', '1.2.3', contents: [
-            d.dir('lib', [d.file('bar.dart', "final message = 'hello!';")])
-          ]);
-        });
+          ])
+        ]);
+        server.serve('bar', '1.2.3', contents: [
+          d.dir('lib', [d.file('bar.dart', "final message = 'hello!';")])
+        ]);
 
         await d.appDir({'foo': 'any'}).create();
 
@@ -151,11 +145,9 @@
           d.file('hello.dart-$versionSuffix.snapshot', contains('hello!'))
         ]).validate();
 
-        globalPackageServer.add((builder) {
-          builder.serve('bar', '1.2.4', contents: [
-            d.dir('lib', [d.file('bar.dart', "final message = 'hello 2!';")]),
-          ]);
-        });
+        server.serve('bar', '1.2.4', contents: [
+          d.dir('lib', [d.file('bar.dart', "final message = 'hello 2!';")]),
+        ]);
 
         await pubUpgrade(
             args: ['--precompile'], output: contains('Built foo:hello.'));
@@ -207,12 +199,11 @@
       });
 
       test('the SDK is out of date', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '5.6.7', contents: [
-            d.dir('bin',
-                [d.file('hello.dart', "void main() => print('hello!');")])
-          ]);
-        });
+        final server = await servePackages();
+        server.serve('foo', '5.6.7', contents: [
+          d.dir(
+              'bin', [d.file('hello.dart', "void main() => print('hello!');")])
+        ]);
 
         await d.appDir({'foo': '5.6.7'}).create();
 
diff --git a/test/test_pub.dart b/test/test_pub.dart
index 5897d69..e180f3d 100644
--- a/test/test_pub.dart
+++ b/test/test_pub.dart
@@ -36,11 +36,9 @@
 import 'package:test_process/test_process.dart';
 
 import 'descriptor.dart' as d;
-import 'descriptor_server.dart';
 import 'package_server.dart';
 
-export 'descriptor_server.dart';
-export 'package_server.dart';
+export 'package_server.dart' show PackageServer;
 
 /// A [Matcher] that matches JavaScript generated by dart2js with minification
 /// enabled.
@@ -412,29 +410,19 @@
 String testVersion = '0.1.2+3';
 
 /// Gets the environment variables used to run pub in a test context.
-Map<String, String> getPubTestEnvironment([String? tokenEndpoint]) {
-  var environment = {
-    'CI': 'false', // unless explicitly given tests don't run pub in CI mode
-    '_PUB_TESTING': 'true',
-    '_PUB_TEST_CONFIG_DIR': _pathInSandbox(configPath),
-    'PUB_CACHE': _pathInSandbox(cachePath),
-    'PUB_ENVIRONMENT': 'test-environment',
+Map<String, String> getPubTestEnvironment([String? tokenEndpoint]) => {
+      'CI': 'false', // unless explicitly given tests don't run pub in CI mode
+      '_PUB_TESTING': 'true',
+      '_PUB_TEST_CONFIG_DIR': _pathInSandbox(configPath),
+      'PUB_CACHE': _pathInSandbox(cachePath),
+      'PUB_ENVIRONMENT': 'test-environment',
 
-    // Ensure a known SDK version is set for the tests that rely on that.
-    '_PUB_TEST_SDK_VERSION': testVersion
-  };
-
-  if (tokenEndpoint != null) {
-    environment['_PUB_TEST_TOKEN_ENDPOINT'] = tokenEndpoint;
-  }
-
-  var server = globalServer;
-  if (server != null) {
-    environment['PUB_HOSTED_URL'] = 'http://localhost:${server.port}';
-  }
-
-  return environment;
-}
+      // Ensure a known SDK version is set for the tests that rely on that.
+      '_PUB_TEST_SDK_VERSION': testVersion,
+      if (tokenEndpoint != null) '_PUB_TEST_TOKEN_ENDPOINT': tokenEndpoint,
+      if (_globalServer?.port != null)
+        'PUB_HOSTED_URL': 'http://localhost:${_globalServer?.port}'
+    };
 
 /// The path to the root of pub's sources in the pub repo.
 final String _pubRoot = (() {
@@ -913,7 +901,7 @@
     line = line
         .replaceAll(d.sandbox, r'$SANDBOX')
         .replaceAll(Platform.pathSeparator, '/');
-    var port = globalPackageServerPort;
+    var port = _globalServer?.port;
     if (port != null) {
       line = line.replaceAll(port.toString(), '\$PORT');
     }
@@ -956,3 +944,28 @@
   }
   buffer.write('\n');
 }
+
+/// The current global [PackageServer].
+PackageServer get globalServer => _globalServer!;
+PackageServer? _globalServer;
+
+/// Creates an HTTP server that replicates the structure of pub.dartlang.org and
+/// makes it the current [globalServer].
+Future<PackageServer> servePackages() async {
+  final server = await startPackageServer();
+  _globalServer = server;
+
+  addTearDown(() {
+    _globalServer = null;
+  });
+  return server;
+}
+
+Future<PackageServer> startPackageServer() async {
+  final server = await PackageServer.start();
+
+  addTearDown(() async {
+    await server.close();
+  });
+  return server;
+}
diff --git a/test/token/error_message_test.dart b/test/token/error_message_test.dart
index 18061fa..53431a5 100644
--- a/test/token/error_message_test.dart
+++ b/test/token/error_message_test.dart
@@ -9,7 +9,7 @@
 import '../test_pub.dart';
 
 void respondWithWwwAuthenticate(String headerValue) {
-  globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
+  globalServer.expect('GET', '/api/packages/versions/new', (request) {
     return shelf.Response(403, headers: {'www-authenticate': headerValue});
   });
 }
@@ -18,7 +18,7 @@
   return runPub(
     args: ['lish'],
     environment: {
-      'PUB_HOSTED_URL': globalPackageServer.url,
+      'PUB_HOSTED_URL': globalServer.url,
       '_PUB_TEST_AUTH_METHOD': 'token',
     },
     exitCode: 65,
@@ -34,7 +34,7 @@
     await d.tokensFile({
       'version': 1,
       'hosted': [
-        {'url': globalPackageServer.url, 'token': 'access token'},
+        {'url': globalServer.url, 'token': 'access token'},
       ]
     }).create();
   });
diff --git a/test/token/token_authentication_test.dart b/test/token/token_authentication_test.dart
index 7bf554e..c020ac0 100644
--- a/test/token/token_authentication_test.dart
+++ b/test/token/token_authentication_test.dart
@@ -16,14 +16,14 @@
     await d.tokensFile({
       'version': 1,
       'hosted': [
-        {'url': globalPackageServer.url, 'env': 'TOKEN'},
+        {'url': globalServer.url, 'env': 'TOKEN'},
       ]
     }).create();
-    var pub = await startPublish(globalPackageServer,
+    var pub = await startPublish(globalServer,
         authMethod: 'token', environment: {'TOKEN': 'access token'});
     await confirmPublish(pub);
 
-    handleUploadForm(globalPackageServer);
+    handleUploadForm(globalServer);
 
     await pub.shouldExit(1);
   });
@@ -33,13 +33,13 @@
     await d.tokensFile({
       'version': 1,
       'hosted': [
-        {'url': globalPackageServer.url, 'token': 'access token'},
+        {'url': globalServer.url, 'token': 'access token'},
       ]
     }).create();
-    var pub = await startPublish(globalPackageServer, authMethod: 'token');
+    var pub = await startPublish(globalServer, authMethod: 'token');
     await confirmPublish(pub);
 
-    handleUploadForm(globalPackageServer);
+    handleUploadForm(globalServer);
 
     await pub.shouldExit(1);
   });
diff --git a/test/token/when_receives_401_removes_token_test.dart b/test/token/when_receives_401_removes_token_test.dart
index 2074288..86c0559 100644
--- a/test/token/when_receives_401_removes_token_test.dart
+++ b/test/token/when_receives_401_removes_token_test.dart
@@ -12,17 +12,17 @@
   setUp(d.validPackage.create);
 
   test('when receives 401 response removes saved token', () async {
-    await servePackages();
+    final server = await servePackages();
     await d.tokensFile({
       'version': 1,
       'hosted': [
-        {'url': globalPackageServer.url, 'token': 'access token'},
+        {'url': server.url, 'token': 'access token'},
       ]
     }).create();
-    var pub = await startPublish(globalPackageServer, authMethod: 'token');
+    var pub = await startPublish(server, authMethod: 'token');
     await confirmPublish(pub);
 
-    globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
+    server.expect('GET', '/api/packages/versions/new', (request) {
       return shelf.Response(401);
     });
 
diff --git a/test/token/when_receives_403_persists_saved_token_test.dart b/test/token/when_receives_403_persists_saved_token_test.dart
index ee4f02e..45fc7a4 100644
--- a/test/token/when_receives_403_persists_saved_token_test.dart
+++ b/test/token/when_receives_403_persists_saved_token_test.dart
@@ -12,17 +12,17 @@
   setUp(d.validPackage.create);
 
   test('when receives 403 response persists saved token', () async {
-    await servePackages();
+    final server = await servePackages();
     await d.tokensFile({
       'version': 1,
       'hosted': [
-        {'url': globalPackageServer.url, 'token': 'access token'},
+        {'url': server.url, 'token': 'access token'},
       ]
     }).create();
-    var pub = await startPublish(globalPackageServer, authMethod: 'token');
+    var pub = await startPublish(server, authMethod: 'token');
     await confirmPublish(pub);
 
-    globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
+    server.expect('GET', '/api/packages/versions/new', (request) {
       return shelf.Response(403);
     });
 
@@ -31,7 +31,7 @@
     await d.tokensFile({
       'version': 1,
       'hosted': [
-        {'url': globalPackageServer.url, 'token': 'access token'},
+        {'url': server.url, 'token': 'access token'},
       ]
     }).validate();
   });
diff --git a/test/upgrade/dry_run_does_not_apply_changes_test.dart b/test/upgrade/dry_run_does_not_apply_changes_test.dart
index de1e6b5..8c942ca 100644
--- a/test/upgrade/dry_run_does_not_apply_changes_test.dart
+++ b/test/upgrade/dry_run_does_not_apply_changes_test.dart
@@ -11,10 +11,9 @@
 
 void main() {
   test('--dry-run: shows report, changes nothing', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0');
 
     // Create the first lockfile.
     await d.appDir({'foo': '1.0.0'}).create();
@@ -50,10 +49,9 @@
   });
 
   test('--dry-run --major-versions: shows report, changes nothing', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0');
 
     await d.appDir({'foo': '^1.0.0'}).create();
 
diff --git a/test/upgrade/example_warns_about_major_versions_test.dart b/test/upgrade/example_warns_about_major_versions_test.dart
index a9b2965..b5c9a67 100644
--- a/test/upgrade/example_warns_about_major_versions_test.dart
+++ b/test/upgrade/example_warns_about_major_versions_test.dart
@@ -10,11 +10,11 @@
   testWithGolden(
       'pub upgrade --major-versions does not update major versions in example/',
       (ctx) async {
-    await servePackages((b) => b
+    await servePackages()
       ..serve('foo', '1.0.0')
       ..serve('foo', '2.0.0')
       ..serve('bar', '1.0.0')
-      ..serve('bar', '2.0.0'));
+      ..serve('bar', '2.0.0');
     await d.dir(appPath, [
       d.pubspec({
         'name': 'myapp',
@@ -39,7 +39,7 @@
   testWithGolden(
       'pub upgrade --null-safety does not update null-safety of dependencies in example/',
       (ctx) async {
-    await servePackages((b) => b
+    await servePackages()
       ..serve('foo', '1.0.0', pubspec: {
         'environment': {'sdk': '>=2.7.0 <3.0.0'},
       })
@@ -51,7 +51,7 @@
       })
       ..serve('bar', '2.0.0', pubspec: {
         'environment': {'sdk': '>=2.12.0 <3.0.0'},
-      }));
+      });
     await d.dir(appPath, [
       d.pubspec({
         'name': 'myapp',
diff --git a/test/upgrade/hosted/unlock_if_necessary_test.dart b/test/upgrade/hosted/unlock_if_necessary_test.dart
index 54ff94f..c285e66 100644
--- a/test/upgrade/hosted/unlock_if_necessary_test.dart
+++ b/test/upgrade/hosted/unlock_if_necessary_test.dart
@@ -11,10 +11,10 @@
   test(
       "upgrades one locked pub server package's dependencies if it's "
       'necessary', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'foo_dep': 'any'});
-      builder.serve('foo_dep', '1.0.0');
-    });
+    final server = await servePackages();
+
+    server.serve('foo', '1.0.0', deps: {'foo_dep': 'any'});
+    server.serve('foo_dep', '1.0.0');
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -22,10 +22,8 @@
 
     await d.appPackagesFile({'foo': '1.0.0', 'foo_dep': '1.0.0'}).validate();
 
-    globalPackageServer.add((builder) {
-      builder.serve('foo', '2.0.0', deps: {'foo_dep': '>1.0.0'});
-      builder.serve('foo_dep', '2.0.0');
-    });
+    server.serve('foo', '2.0.0', deps: {'foo_dep': '>1.0.0'});
+    server.serve('foo_dep', '2.0.0');
 
     await pubUpgrade(args: ['foo']);
 
diff --git a/test/upgrade/hosted/unlock_single_package_test.dart b/test/upgrade/hosted/unlock_single_package_test.dart
index ed2b678..bc78a3d 100644
--- a/test/upgrade/hosted/unlock_single_package_test.dart
+++ b/test/upgrade/hosted/unlock_single_package_test.dart
@@ -9,10 +9,10 @@
 
 void main() {
   test('can unlock a single package only in upgrade', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
-      builder.serve('bar', '1.0.0');
-    });
+    final server = await servePackages();
+
+    server.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
+    server.serve('bar', '1.0.0');
 
     await d.appDir({'foo': 'any', 'bar': 'any'}).create();
 
@@ -20,10 +20,8 @@
 
     await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
 
-    globalPackageServer.add((builder) {
-      builder.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
-      builder.serve('bar', '2.0.0');
-    });
+    server.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
+    server.serve('bar', '2.0.0');
 
     // This can't upgrade 'bar'
     await pubUpgrade(args: ['bar']);
@@ -31,10 +29,8 @@
     await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
 
     // Introducing foo and bar 1.1.0, to show that only 'bar' will be upgraded
-    globalPackageServer.add((builder) {
-      builder.serve('foo', '1.1.0', deps: {'bar': '<2.0.0'});
-      builder.serve('bar', '1.1.0');
-    });
+    server.serve('foo', '1.1.0', deps: {'bar': '<2.0.0'});
+    server.serve('bar', '1.1.0');
 
     await pubUpgrade(args: ['bar']);
     await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
diff --git a/test/upgrade/hosted/upgrade_removed_constraints_test.dart b/test/upgrade/hosted/upgrade_removed_constraints_test.dart
index 7c20816..248ac90 100644
--- a/test/upgrade/hosted/upgrade_removed_constraints_test.dart
+++ b/test/upgrade/hosted/upgrade_removed_constraints_test.dart
@@ -9,12 +9,11 @@
 
 void main() {
   test('upgrades dependencies whose constraints have been removed', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'shared_dep': 'any'});
-      builder.serve('bar', '1.0.0', deps: {'shared_dep': '<2.0.0'});
-      builder.serve('shared_dep', '1.0.0');
-      builder.serve('shared_dep', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'shared_dep': 'any'})
+      ..serve('bar', '1.0.0', deps: {'shared_dep': '<2.0.0'})
+      ..serve('shared_dep', '1.0.0')
+      ..serve('shared_dep', '2.0.0');
 
     await d.appDir({'foo': 'any', 'bar': 'any'}).create();
 
diff --git a/test/upgrade/hosted/warn_about_discontinued_test.dart b/test/upgrade/hosted/warn_about_discontinued_test.dart
index 48adf85..ba7fc57 100644
--- a/test/upgrade/hosted/warn_about_discontinued_test.dart
+++ b/test/upgrade/hosted/warn_about_discontinued_test.dart
@@ -9,15 +9,15 @@
 
 void main() {
   test('Warns about discontinued dependencies', () async {
-    await servePackages((builder) => builder
+    final server = await servePackages()
       ..serve('foo', '1.2.3', deps: {'transitive': 'any'})
-      ..serve('transitive', '1.0.0'));
+      ..serve('transitive', '1.0.0');
     await d.appDir({'foo': '1.2.3'}).create();
     await pubGet();
 
-    globalPackageServer.add((builder) => builder
+    server
       ..discontinue('foo')
-      ..discontinue('transitive'));
+      ..discontinue('transitive');
     // We warn only about the direct dependency here:
     await pubUpgrade(output: '''
 Resolving dependencies...
@@ -26,8 +26,7 @@
   No dependencies changed.
   1 package is discontinued.
 ''');
-    globalPackageServer
-        .add((builder) => builder.discontinue('foo', replacementText: 'bar'));
+    server.discontinue('foo', replacementText: 'bar');
     // We warn only about the direct dependency here:
     await pubUpgrade(output: '''
 Resolving dependencies...
@@ -39,9 +38,9 @@
   });
 
   test('Warns about discontinued dev_dependencies', () async {
-    await servePackages((builder) => builder
+    final server = await servePackages()
       ..serve('foo', '1.2.3', deps: {'transitive': 'any'})
-      ..serve('transitive', '1.0.0'));
+      ..serve('transitive', '1.0.0');
 
     await d.dir(appPath, [
       d.file('pubspec.yaml', '''
@@ -56,9 +55,9 @@
     ]).create();
     await pubGet();
 
-    globalPackageServer.add((builder) => builder
+    server
       ..discontinue('foo')
-      ..discontinue('transitive'));
+      ..discontinue('transitive');
 
     // We warn only about the direct dependency here:
     await pubUpgrade(output: '''
@@ -68,8 +67,7 @@
   No dependencies changed.
   1 package is discontinued.
 ''');
-    globalPackageServer
-        .add((builder) => builder.discontinue('foo', replacementText: 'bar'));
+    server.discontinue('foo', replacementText: 'bar');
     // We warn only about the direct dependency here:
     await pubUpgrade(output: '''
 Resolving dependencies...
diff --git a/test/upgrade/renamed_package_circular_dependency.dart b/test/upgrade/renamed_package_circular_dependency.dart
index ca033bb..ec10b82 100644
--- a/test/upgrade/renamed_package_circular_dependency.dart
+++ b/test/upgrade/renamed_package_circular_dependency.dart
@@ -8,10 +8,9 @@
 
 void main() {
   test('The upgrade report handles a package becoming root', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'myapp': 'any'});
-      builder.serve('myapp', '1.0.0', deps: {'foo': 'any'});
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'myapp': 'any'})
+      ..serve('myapp', '1.0.0', deps: {'foo': 'any'});
 
     await d.dir(appPath, [
       d.pubspec({
diff --git a/test/upgrade/report/describes_change_test.dart b/test/upgrade/report/describes_change_test.dart
index dc6f3cf..96410cb 100644
--- a/test/upgrade/report/describes_change_test.dart
+++ b/test/upgrade/report/describes_change_test.dart
@@ -9,11 +9,11 @@
 
 void main() {
   test('Shows count of discontinued packages', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '2.0.0');
-    });
+    final server = await servePackages();
 
-    globalPackageServer.add((builder) => builder..discontinue('foo'));
+    server.serve('foo', '2.0.0');
+
+    server.discontinue('foo');
 
     // Create the first lockfile.
     await d.appDir({'foo': '2.0.0'}).create();
@@ -33,12 +33,11 @@
   });
 
   test('shows how package changed from previous lockfile', () async {
-    await servePackages((builder) {
-      builder.serve('unchanged', '1.0.0');
-      builder.serve('version_changed', '1.0.0');
-      builder.serve('version_changed', '2.0.0');
-      builder.serve('source_changed', '1.0.0');
-    });
+    await servePackages()
+      ..serve('unchanged', '1.0.0')
+      ..serve('version_changed', '1.0.0')
+      ..serve('version_changed', '2.0.0')
+      ..serve('source_changed', '1.0.0');
 
     await d.dir('source_changed', [
       d.libDir('source_changed'),
diff --git a/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart b/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
index 7a232d0..bcde5cb 100644
--- a/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
+++ b/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
@@ -11,14 +11,14 @@
   test(
       'Shows newer versions available for packages that are locked and not being upgraded',
       () async {
-    await servePackages((builder) {
-      builder.serve('not_upgraded', '1.0.0');
-      builder.serve('not_upgraded', '2.0.0');
-      builder.serve('not_upgraded', '3.0.0-dev');
-      builder.serve('upgraded', '1.0.0');
-      builder.serve('upgraded', '2.0.0');
-      builder.serve('upgraded', '3.0.0-dev');
-    });
+    await servePackages()
+      ..serve('not_upgraded', '1.0.0')
+      ..serve('not_upgraded', '1.0.0')
+      ..serve('not_upgraded', '2.0.0')
+      ..serve('not_upgraded', '3.0.0-dev')
+      ..serve('upgraded', '1.0.0')
+      ..serve('upgraded', '2.0.0')
+      ..serve('upgraded', '3.0.0-dev');
 
     // Constraint everything to the first version.
     await d.appDir({'not_upgraded': '1.0.0', 'upgraded': '1.0.0'}).create();
diff --git a/test/upgrade/report/highlights_overrides_test.dart b/test/upgrade/report/highlights_overrides_test.dart
index 94608d9..93f9f3b 100644
--- a/test/upgrade/report/highlights_overrides_test.dart
+++ b/test/upgrade/report/highlights_overrides_test.dart
@@ -9,7 +9,8 @@
 
 void main() {
   test('highlights overridden packages', () async {
-    await servePackages((builder) => builder.serve('overridden', '1.0.0'));
+    final server = await servePackages();
+    server.serve('overridden', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
diff --git a/test/upgrade/report/leading_character_shows_change_test.dart b/test/upgrade/report/leading_character_shows_change_test.dart
index d7f870c..ea4668b 100644
--- a/test/upgrade/report/leading_character_shows_change_test.dart
+++ b/test/upgrade/report/leading_character_shows_change_test.dart
@@ -9,17 +9,17 @@
 
 void main() {
   test('the character before each package describes the change', () async {
-    await servePackages((builder) {
-      builder.serve('added', '1.0.0');
-      builder.serve('downgraded', '1.0.0');
-      builder.serve('downgraded', '2.0.0');
-      builder.serve('overridden', '1.0.0');
-      builder.serve('removed', '1.0.0');
-      builder.serve('source_changed', '1.0.0');
-      builder.serve('upgraded', '1.0.0');
-      builder.serve('upgraded', '2.0.0');
-      builder.serve('unchanged', '1.0.0');
-    });
+    await servePackages()
+      ..serve('added', '1.0.0')
+      ..serve('added', '1.0.0')
+      ..serve('downgraded', '1.0.0')
+      ..serve('downgraded', '2.0.0')
+      ..serve('overridden', '1.0.0')
+      ..serve('removed', '1.0.0')
+      ..serve('source_changed', '1.0.0')
+      ..serve('upgraded', '1.0.0')
+      ..serve('upgraded', '2.0.0')
+      ..serve('unchanged', '1.0.0');
 
     await d.dir('description_changed_1', [
       d.libDir('description_changed'),
diff --git a/test/upgrade/report/shows_newer_available_versions_test.dart b/test/upgrade/report/shows_newer_available_versions_test.dart
index 4c1ca56..bf13aec 100644
--- a/test/upgrade/report/shows_newer_available_versions_test.dart
+++ b/test/upgrade/report/shows_newer_available_versions_test.dart
@@ -9,28 +9,28 @@
 
 void main() {
   test('shows how many newer versions are available', () async {
-    await servePackages((builder) {
-      builder.serve('multiple_newer', '1.0.0');
-      builder.serve('multiple_newer', '1.0.1-unstable.1');
-      builder.serve('multiple_newer', '1.0.1');
-      builder.serve('multiple_newer', '1.0.2-unstable.1');
-      builder.serve('multiple_newer_stable', '1.0.0');
-      builder.serve('multiple_newer_stable', '1.0.1');
-      builder.serve('multiple_newer_stable', '1.0.2');
-      builder.serve('multiple_newer_unstable', '1.0.0');
-      builder.serve('multiple_newer_unstable', '1.0.1-unstable.1');
-      builder.serve('multiple_newer_unstable', '1.0.1-unstable.2');
-      builder.serve('multiple_newer_unstable2', '1.0.1-unstable.1');
-      builder.serve('multiple_newer_unstable2', '1.0.1-unstable.2');
-      builder.serve('multiple_newer_unstable2', '1.0.1-unstable.2');
-      builder.serve('no_newer', '1.0.0');
-      builder.serve('one_newer_unstable', '1.0.0');
-      builder.serve('one_newer_unstable', '1.0.1-unstable.1');
-      builder.serve('one_newer_unstable2', '1.0.1-unstable.1');
-      builder.serve('one_newer_unstable2', '1.0.1-unstable.2');
-      builder.serve('one_newer_stable', '1.0.0');
-      builder.serve('one_newer_stable', '1.0.1');
-    });
+    await servePackages()
+      ..serve('multiple_newer', '1.0.0')
+      ..serve('multiple_newer', '1.0.0')
+      ..serve('multiple_newer', '1.0.1-unstable.1')
+      ..serve('multiple_newer', '1.0.1')
+      ..serve('multiple_newer', '1.0.2-unstable.1')
+      ..serve('multiple_newer_stable', '1.0.0')
+      ..serve('multiple_newer_stable', '1.0.1')
+      ..serve('multiple_newer_stable', '1.0.2')
+      ..serve('multiple_newer_unstable', '1.0.0')
+      ..serve('multiple_newer_unstable', '1.0.1-unstable.1')
+      ..serve('multiple_newer_unstable', '1.0.1-unstable.2')
+      ..serve('multiple_newer_unstable2', '1.0.1-unstable.1')
+      ..serve('multiple_newer_unstable2', '1.0.1-unstable.2')
+      ..serve('multiple_newer_unstable2', '1.0.1-unstable.2')
+      ..serve('no_newer', '1.0.0')
+      ..serve('one_newer_unstable', '1.0.0')
+      ..serve('one_newer_unstable', '1.0.1-unstable.1')
+      ..serve('one_newer_unstable2', '1.0.1-unstable.1')
+      ..serve('one_newer_unstable2', '1.0.1-unstable.2')
+      ..serve('one_newer_stable', '1.0.0')
+      ..serve('one_newer_stable', '1.0.1');
 
     // Constraint everything to the first version.
     await d.appDir({
diff --git a/test/upgrade/report/shows_number_of_changed_dependencies_test.dart b/test/upgrade/report/shows_number_of_changed_dependencies_test.dart
index 5ba3af6..91ba5aa 100644
--- a/test/upgrade/report/shows_number_of_changed_dependencies_test.dart
+++ b/test/upgrade/report/shows_number_of_changed_dependencies_test.dart
@@ -11,11 +11,10 @@
   test(
       'does not show how many newer versions are available for '
       'packages that are locked and not being upgraded', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('b', '1.0.0');
-      builder.serve('c', '2.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('b', '1.0.0')
+      ..serve('c', '2.0.0');
 
     await d.appDir({'a': 'any'}).create();
 
diff --git a/test/upgrade/report/shows_pub_outdated_test.dart b/test/upgrade/report/shows_pub_outdated_test.dart
index 9c0fa3d..0fdb322 100644
--- a/test/upgrade/report/shows_pub_outdated_test.dart
+++ b/test/upgrade/report/shows_pub_outdated_test.dart
@@ -9,24 +9,23 @@
 
 void main() {
   test('shows pub outdated', () async {
-    await servePackages((builder) {
-      builder.serve('multiple_newer', '1.0.0');
-      builder.serve('multiple_newer', '1.0.1-unstable.1');
-      builder.serve('multiple_newer', '1.0.1');
-      builder.serve('multiple_newer', '1.0.2-unstable.1');
-      builder.serve('multiple_newer', '1.0.2-unstable.2');
-      builder.serve('multiple_newer_stable', '1.0.0');
-      builder.serve('multiple_newer_stable', '1.0.1');
-      builder.serve('multiple_newer_stable', '1.0.2');
-      builder.serve('multiple_newer_unstable', '1.0.0');
-      builder.serve('multiple_newer_unstable', '1.0.1-unstable.1');
-      builder.serve('multiple_newer_unstable', '1.0.1-unstable.2');
-      builder.serve('no_newer', '1.0.0');
-      builder.serve('one_newer_unstable', '1.0.0');
-      builder.serve('one_newer_unstable', '1.0.1-unstable.1');
-      builder.serve('one_newer_stable', '1.0.0');
-      builder.serve('one_newer_stable', '1.0.1');
-    });
+    await servePackages()
+      ..serve('multiple_newer', '1.0.0')
+      ..serve('multiple_newer', '1.0.1-unstable.1')
+      ..serve('multiple_newer', '1.0.1')
+      ..serve('multiple_newer', '1.0.2-unstable.1')
+      ..serve('multiple_newer', '1.0.2-unstable.2')
+      ..serve('multiple_newer_stable', '1.0.0')
+      ..serve('multiple_newer_stable', '1.0.1')
+      ..serve('multiple_newer_stable', '1.0.2')
+      ..serve('multiple_newer_unstable', '1.0.0')
+      ..serve('multiple_newer_unstable', '1.0.1-unstable.1')
+      ..serve('multiple_newer_unstable', '1.0.1-unstable.2')
+      ..serve('no_newer', '1.0.0')
+      ..serve('one_newer_unstable', '1.0.0')
+      ..serve('one_newer_unstable', '1.0.1-unstable.1')
+      ..serve('one_newer_stable', '1.0.0')
+      ..serve('one_newer_stable', '1.0.1');
 
     // Constraint everything to the first version.
     await d.appDir({
diff --git a/test/upgrade/upgrade_major_versions_test.dart b/test/upgrade/upgrade_major_versions_test.dart
index c312717..8c3f40a 100644
--- a/test/upgrade/upgrade_major_versions_test.dart
+++ b/test/upgrade/upgrade_major_versions_test.dart
@@ -10,14 +10,13 @@
 void main() {
   group('pub upgrade --major-versions', () {
     test('bumps dependency constraints and shows summary report', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('foo', '2.0.0');
-        builder.serve('bar', '0.1.0');
-        builder.serve('bar', '0.2.0');
-        builder.serve('baz', '1.0.0');
-        builder.serve('baz', '1.0.1');
-      });
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('foo', '2.0.0')
+        ..serve('bar', '0.1.0')
+        ..serve('bar', '0.2.0')
+        ..serve('baz', '1.0.0')
+        ..serve('baz', '1.0.1');
 
       await d.appDir({
         'foo': '^1.0.0',
@@ -51,14 +50,13 @@
     });
 
     test('bumps dev_dependency constraints and shows summary report', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('foo', '2.0.0');
-        builder.serve('bar', '0.1.0');
-        builder.serve('bar', '0.2.0');
-        builder.serve('baz', '1.0.0');
-        builder.serve('baz', '1.0.1');
-      });
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('foo', '2.0.0')
+        ..serve('bar', '0.1.0')
+        ..serve('bar', '0.2.0')
+        ..serve('baz', '1.0.0')
+        ..serve('baz', '1.0.1');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -102,12 +100,11 @@
     });
 
     test('upgrades only the selected package', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('foo', '2.0.0');
-        builder.serve('bar', '0.1.0');
-        builder.serve('bar', '0.2.0');
-      });
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('foo', '2.0.0')
+        ..serve('bar', '0.1.0')
+        ..serve('bar', '0.2.0');
 
       await d.appDir({
         'foo': '^1.0.0',
@@ -134,11 +131,10 @@
     });
 
     test('chooses the latest version where possible', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('foo', '2.0.0');
-        builder.serve('foo', '3.0.0');
-      });
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('foo', '2.0.0')
+        ..serve('foo', '3.0.0');
 
       await d.appDir({'foo': '^1.0.0'}).create();
 
@@ -166,13 +162,11 @@
     });
 
     test('overridden dependencies - no resolution', () async {
-      await servePackages(
-        (builder) => builder
-          ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'})
-          ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
-          ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
-          ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'}),
-      );
+      await servePackages()
+        ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'})
+        ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
+        ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
+        ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'});
 
       await d.dir(appPath, [
         d.pubspec({
@@ -223,16 +217,15 @@
       /// The version solver solves the packages with the least number of
       /// versions remaining, so we add more 'bar' packages to force 'foo' to be
       /// resolved first
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('foo', '2.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('foo', '2.0.0', pubspec: {
           'dependencies': {'bar': '1.0.0'}
-        });
-        builder.serve('bar', '1.0.0');
-        builder.serve('bar', '2.0.0');
-        builder.serve('bar', '3.0.0');
-        builder.serve('bar', '4.0.0');
-      });
+        })
+        ..serve('bar', '1.0.0')
+        ..serve('bar', '2.0.0')
+        ..serve('bar', '3.0.0')
+        ..serve('bar', '4.0.0');
 
       await d.appDir({
         'foo': '^1.0.0',
diff --git a/test/upgrade/upgrade_null_safety_test.dart b/test/upgrade/upgrade_null_safety_test.dart
index 921c737..557c589 100644
--- a/test/upgrade/upgrade_null_safety_test.dart
+++ b/test/upgrade/upgrade_null_safety_test.dart
@@ -9,29 +9,28 @@
 void main() {
   group('pub upgrade --null-safety', () {
     setUp(() async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'environment': {'sdk': '>=2.10.0<3.0.0'},
-        });
-        builder.serve('foo', '2.0.0', pubspec: {
+        })
+        ..serve('foo', '2.0.0', pubspec: {
           'environment': {'sdk': '>=2.12.0<3.0.0'},
-        });
-        builder.serve('bar', '1.0.0', pubspec: {
+        })
+        ..serve('bar', '1.0.0', pubspec: {
           'environment': {'sdk': '>=2.9.0<3.0.0'},
-        });
-        builder.serve('bar', '2.0.0-nullsafety.0', pubspec: {
+        })
+        ..serve('bar', '2.0.0-nullsafety.0', pubspec: {
           'environment': {'sdk': '>=2.12.0<3.0.0'},
-        });
-        builder.serve('baz', '1.0.0', pubspec: {
+        })
+        ..serve('baz', '1.0.0', pubspec: {
           'environment': {'sdk': '>=2.9.0<3.0.0'},
-        });
-        builder.serve('has_conflict', '1.0.0', pubspec: {
+        })
+        ..serve('has_conflict', '1.0.0', pubspec: {
           'environment': {'sdk': '>=2.9.0<3.0.0'},
-        });
-        builder.serve('has_conflict', '2.0.0', pubspec: {
+        })
+        ..serve('has_conflict', '2.0.0', pubspec: {
           'environment': {'sdk': '>=2.13.0<3.0.0'},
         });
-      });
     });
 
     test('upgrades to null-safety versions', () async {
diff --git a/test/validator/null_safety_mixed_mode_test.dart b/test/validator/null_safety_mixed_mode_test.dart
index e2a8dfb..d62d051 100644
--- a/test/validator/null_safety_mixed_mode_test.dart
+++ b/test/validator/null_safety_mixed_mode_test.dart
@@ -45,14 +45,13 @@
   group('should consider a package valid if it', () {
     test('is not opting in to null-safety, but depends on package that is',
         () async {
-      await servePackages(
-        (server) => server.serve(
-          'foo',
-          '0.0.1',
-          pubspec: {
-            'environment': {'sdk': '>=2.12.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'foo',
+        '0.0.1',
+        pubspec: {
+          'environment': {'sdk': '>=2.12.0<3.0.0'}
+        },
       );
 
       await setup(
@@ -61,14 +60,13 @@
     });
     test('is opting in to null-safety and depends on package that is',
         () async {
-      await servePackages(
-        (server) => server.serve(
-          'foo',
-          '0.0.1',
-          pubspec: {
-            'environment': {'sdk': '>=2.12.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'foo',
+        '0.0.1',
+        pubspec: {
+          'environment': {'sdk': '>=2.12.0<3.0.0'}
+        },
       );
 
       await setup(
@@ -78,14 +76,13 @@
 
     test('is opting in to null-safety has dev_dependency that is not',
         () async {
-      await servePackages(
-        (server) => server.serve(
-          'foo',
-          '0.0.1',
-          pubspec: {
-            'environment': {'sdk': '>=2.9.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'foo',
+        '0.0.1',
+        pubspec: {
+          'environment': {'sdk': '>=2.9.0<3.0.0'}
+        },
       );
 
       await setup(sdkConstraint: '>=2.12.0 <3.0.0', devDependencies: {
@@ -98,14 +95,13 @@
   group('should consider a package invalid if it', () {
     test('is opting in to null-safety, but depends on package that is not',
         () async {
-      await servePackages(
-        (server) => server.serve(
-          'foo',
-          '0.0.1',
-          pubspec: {
-            'environment': {'sdk': '>=2.9.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'foo',
+        '0.0.1',
+        pubspec: {
+          'environment': {'sdk': '>=2.9.0<3.0.0'}
+        },
       );
 
       await setup(
@@ -134,17 +130,16 @@
     test(
         'is opting in to null-safety, but depends on package has file opting out',
         () async {
-      await servePackages(
-        (server) => server.serve('foo', '0.0.1', pubspec: {
-          'environment': {'sdk': '>=2.12.0<3.0.0'}
-        }, contents: [
-          d.dir('lib', [
-            d.file('foo.dart', '''
+      final server = await servePackages();
+      server.serve('foo', '0.0.1', pubspec: {
+        'environment': {'sdk': '>=2.12.0<3.0.0'}
+      }, contents: [
+        d.dir('lib', [
+          d.file('foo.dart', '''
 // @dart = 2.9
           ''')
-          ])
-        ]),
-      );
+        ])
+      ]);
 
       await setup(
           sdkConstraint: '>=2.12.0 <3.0.0', dependencies: {'foo': '^0.0.1'});
diff --git a/test/validator/relative_version_numbering_test.dart b/test/validator/relative_version_numbering_test.dart
index 73e810a..2f3da5c 100644
--- a/test/validator/relative_version_numbering_test.dart
+++ b/test/validator/relative_version_numbering_test.dart
@@ -13,7 +13,7 @@
 
 Validator validator(Entrypoint entrypoint) => RelativeVersionNumberingValidator(
       entrypoint,
-      Uri.parse(globalPackageServer.url),
+      Uri.parse(globalServer.url),
     );
 
 Future<void> setup({required String sdkConstraint}) async {
@@ -33,14 +33,13 @@
   group('should consider a package valid if it', () {
     test('is not opting in to null-safety with previous non-null-safe version',
         () async {
-      await servePackages(
-        (server) => server.serve(
-          'test_pkg',
-          '0.0.1',
-          pubspec: {
-            'environment': {'sdk': '>=2.9.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'test_pkg',
+        '0.0.1',
+        pubspec: {
+          'environment': {'sdk': '>=2.9.0<3.0.0'}
+        },
       );
 
       await setup(sdkConstraint: '>=2.9.0 <3.0.0');
@@ -50,23 +49,21 @@
     test(
         'is not opting in to null-safety with previous non-null-safe version. '
         'Even with a later null-safe version', () async {
-      await servePackages(
-        (server) => server
-          ..serve(
-            'test_pkg',
-            '0.0.1',
-            pubspec: {
-              'environment': {'sdk': '>=2.9.0<3.0.0'}
-            },
-          )
-          ..serve(
-            'test_pkg',
-            '2.0.0',
-            pubspec: {
-              'environment': {'sdk': '>=2.12.0<3.0.0'}
-            },
-          ),
-      );
+      await servePackages()
+        ..serve(
+          'test_pkg',
+          '0.0.1',
+          pubspec: {
+            'environment': {'sdk': '>=2.9.0<3.0.0'}
+          },
+        )
+        ..serve(
+          'test_pkg',
+          '2.0.0',
+          pubspec: {
+            'environment': {'sdk': '>=2.12.0<3.0.0'}
+          },
+        );
 
       await setup(sdkConstraint: '>=2.9.0 <3.0.0');
       await expectValidation(validator);
@@ -74,14 +71,13 @@
 
     test('is opting in to null-safety with previous null-safe version',
         () async {
-      await servePackages(
-        (server) => server.serve(
-          'test_pkg',
-          '0.0.1',
-          pubspec: {
-            'environment': {'sdk': '>=2.12.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'test_pkg',
+        '0.0.1',
+        pubspec: {
+          'environment': {'sdk': '>=2.12.0<3.0.0'}
+        },
       );
 
       await setup(sdkConstraint: '>=2.12.0 <3.0.0');
@@ -91,14 +87,13 @@
     test(
         'is opting in to null-safety using a pre-release of 2.12.0 '
         'with previous null-safe version', () async {
-      await servePackages(
-        (server) => server.serve(
-          'test_pkg',
-          '0.0.1',
-          pubspec: {
-            'environment': {'sdk': '>=2.12.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'test_pkg',
+        '0.0.1',
+        pubspec: {
+          'environment': {'sdk': '>=2.12.0<3.0.0'}
+        },
       );
 
       await setup(sdkConstraint: '>=2.12.0-dev <3.0.0');
@@ -108,23 +103,21 @@
     test(
         'is opting in to null-safety with previous null-safe version. '
         'Even with a later non-null-safe version', () async {
-      await servePackages(
-        (server) => server
-          ..serve(
-            'test_pkg',
-            '0.0.1',
-            pubspec: {
-              'environment': {'sdk': '>=2.12.0<3.0.0'}
-            },
-          )
-          ..serve(
-            'test_pkg',
-            '2.0.1',
-            pubspec: {
-              'environment': {'sdk': '>=2.9.0<3.0.0'}
-            },
-          ),
-      );
+      await servePackages()
+        ..serve(
+          'test_pkg',
+          '0.0.1',
+          pubspec: {
+            'environment': {'sdk': '>=2.12.0<3.0.0'}
+          },
+        )
+        ..serve(
+          'test_pkg',
+          '2.0.1',
+          pubspec: {
+            'environment': {'sdk': '>=2.9.0<3.0.0'}
+          },
+        );
 
       await setup(sdkConstraint: '>=2.12.0 <3.0.0');
       await expectValidation(validator);
@@ -132,13 +125,13 @@
 
     test('is opting in to null-safety with no existing versions', () async {
       await setup(sdkConstraint: '>=2.12.0 <3.0.0');
-      await servePackages((x) => x);
+      await servePackages();
       await expectValidation(validator);
     });
 
     test('is not opting in to null-safety with no existing versions', () async {
       await setup(sdkConstraint: '>=2.9.0 <3.0.0');
-      await servePackages((x) => x);
+      await servePackages();
 
       await expectValidation(validator);
     });
@@ -146,23 +139,21 @@
     test(
         'is not opting in to null-safety with previous null-safe stable version. '
         'With an in-between not null-safe prerelease', () async {
-      await servePackages(
-        (server) => server
-          ..serve(
-            'test_pkg',
-            '0.0.1',
-            pubspec: {
-              'environment': {'sdk': '>=2.12.0<3.0.0'}
-            },
-          )
-          ..serve(
-            'test_pkg',
-            '0.0.2-dev',
-            pubspec: {
-              'environment': {'sdk': '>=2.9.0<3.0.0'}
-            },
-          ),
-      );
+      await servePackages()
+        ..serve(
+          'test_pkg',
+          '0.0.1',
+          pubspec: {
+            'environment': {'sdk': '>=2.12.0<3.0.0'}
+          },
+        )
+        ..serve(
+          'test_pkg',
+          '0.0.2-dev',
+          pubspec: {
+            'environment': {'sdk': '>=2.9.0<3.0.0'}
+          },
+        );
 
       await setup(sdkConstraint: '>=2.9.0 <3.0.0');
       await expectValidation(validator);
@@ -171,23 +162,21 @@
     test(
         'opts in to null-safety, with previous stable version not-null-safe. '
         'With an in-between non-null-safe prerelease', () async {
-      await servePackages(
-        (server) => server
-          ..serve(
-            'test_pkg',
-            '0.0.1',
-            pubspec: {
-              'environment': {'sdk': '>=2.9.0<3.0.0'}
-            },
-          )
-          ..serve(
-            'test_pkg',
-            '0.0.2-dev',
-            pubspec: {
-              'environment': {'sdk': '>=2.12.0<3.0.0'}
-            },
-          ),
-      );
+      await servePackages()
+        ..serve(
+          'test_pkg',
+          '0.0.1',
+          pubspec: {
+            'environment': {'sdk': '>=2.9.0<3.0.0'}
+          },
+        )
+        ..serve(
+          'test_pkg',
+          '0.0.2-dev',
+          pubspec: {
+            'environment': {'sdk': '>=2.12.0<3.0.0'}
+          },
+        );
 
       await setup(sdkConstraint: '>=2.12.0 <3.0.0');
       await expectValidation(validator);
@@ -197,14 +186,13 @@
   group('should warn if ', () {
     test('opts in to null-safety, with previous version not-null-safe',
         () async {
-      await servePackages(
-        (server) => server.serve(
-          'test_pkg',
-          '0.0.1',
-          pubspec: {
-            'environment': {'sdk': '>=2.9.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'test_pkg',
+        '0.0.1',
+        pubspec: {
+          'environment': {'sdk': '>=2.9.0<3.0.0'}
+        },
       );
 
       await setup(sdkConstraint: '>=2.12.0 <3.0.0');
@@ -215,14 +203,13 @@
         'is not opting in to null-safety with no existing stable versions. '
         'With a previous in-between null-safe prerelease', () async {
       await setup(sdkConstraint: '>=2.9.0 <3.0.0');
-      await servePackages(
-        (server) => server.serve(
-          'test_pkg',
-          '0.0.2-dev',
-          pubspec: {
-            'environment': {'sdk': '>=2.12.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'test_pkg',
+        '0.0.2-dev',
+        pubspec: {
+          'environment': {'sdk': '>=2.12.0<3.0.0'}
+        },
       );
 
       await expectValidation(validator, hints: isNotEmpty);
@@ -230,23 +217,21 @@
     test(
         'is not opting in to null-safety with previous non-null-safe stable version. '
         'With an in-between null-safe prerelease', () async {
-      await servePackages(
-        (server) => server
-          ..serve(
-            'test_pkg',
-            '0.0.1',
-            pubspec: {
-              'environment': {'sdk': '>=2.9.0<3.0.0'}
-            },
-          )
-          ..serve(
-            'test_pkg',
-            '0.0.2-dev',
-            pubspec: {
-              'environment': {'sdk': '>=2.12.0<3.0.0'}
-            },
-          ),
-      );
+      await servePackages()
+        ..serve(
+          'test_pkg',
+          '0.0.1',
+          pubspec: {
+            'environment': {'sdk': '>=2.9.0<3.0.0'}
+          },
+        )
+        ..serve(
+          'test_pkg',
+          '0.0.2-dev',
+          pubspec: {
+            'environment': {'sdk': '>=2.12.0<3.0.0'}
+          },
+        );
 
       await setup(sdkConstraint: '>=2.9.0 <3.0.0');
       await expectValidation(validator, hints: isNotEmpty);
@@ -255,23 +240,21 @@
     test(
         'opts in to null-safety, with previous version not-null-safe. '
         'Even with a later null-safe version', () async {
-      await servePackages(
-        (server) => server
-          ..serve(
-            'test_pkg',
-            '0.0.1',
-            pubspec: {
-              'environment': {'sdk': '>=2.9.0<3.0.0'}
-            },
-          )
-          ..serve(
-            'test_pkg',
-            '2.0.0',
-            pubspec: {
-              'environment': {'sdk': '>=2.12.0<3.0.0'}
-            },
-          ),
-      );
+      await servePackages()
+        ..serve(
+          'test_pkg',
+          '0.0.1',
+          pubspec: {
+            'environment': {'sdk': '>=2.9.0<3.0.0'}
+          },
+        )
+        ..serve(
+          'test_pkg',
+          '2.0.0',
+          pubspec: {
+            'environment': {'sdk': '>=2.12.0<3.0.0'}
+          },
+        );
 
       await setup(sdkConstraint: '>=2.12.0 <3.0.0');
       await expectValidation(validator, hints: isNotEmpty);
@@ -279,14 +262,13 @@
 
     test('is not opting in to null-safety with previous null-safe version',
         () async {
-      await servePackages(
-        (server) => server.serve(
-          'test_pkg',
-          '0.0.1',
-          pubspec: {
-            'environment': {'sdk': '>=2.12.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'test_pkg',
+        '0.0.1',
+        pubspec: {
+          'environment': {'sdk': '>=2.12.0<3.0.0'}
+        },
       );
 
       await setup(sdkConstraint: '>=2.9.0 <3.0.0');
@@ -296,23 +278,21 @@
     test(
         'is not opting in to null-safety with previous null-safe version. '
         'Even with a later non-null-safe version', () async {
-      await servePackages(
-        (server) => server
-          ..serve(
-            'test_pkg',
-            '0.0.1',
-            pubspec: {
-              'environment': {'sdk': '>=2.12.0<3.0.0'}
-            },
-          )
-          ..serve(
-            'test_pkg',
-            '2.0.0',
-            pubspec: {
-              'environment': {'sdk': '>=2.9.0<3.0.0'}
-            },
-          ),
-      );
+      await servePackages()
+        ..serve(
+          'test_pkg',
+          '0.0.1',
+          pubspec: {
+            'environment': {'sdk': '>=2.12.0<3.0.0'}
+          },
+        )
+        ..serve(
+          'test_pkg',
+          '2.0.0',
+          pubspec: {
+            'environment': {'sdk': '>=2.9.0<3.0.0'}
+          },
+        );
 
       await setup(sdkConstraint: '>=2.9.0 <3.0.0');
       await expectValidation(validator, hints: isNotEmpty);
@@ -321,23 +301,21 @@
     test(
         'is opting in to null-safety with previous null-safe stable version. '
         'with an in-between non-null-safe prerelease', () async {
-      await servePackages(
-        (server) => server
-          ..serve(
-            'test_pkg',
-            '0.0.1',
-            pubspec: {
-              'environment': {'sdk': '>=2.12.0<3.0.0'}
-            },
-          )
-          ..serve(
-            'test_pkg',
-            '0.0.2-dev',
-            pubspec: {
-              'environment': {'sdk': '>=2.9.0<3.0.0'}
-            },
-          ),
-      );
+      await servePackages()
+        ..serve(
+          'test_pkg',
+          '0.0.1',
+          pubspec: {
+            'environment': {'sdk': '>=2.12.0<3.0.0'}
+          },
+        )
+        ..serve(
+          'test_pkg',
+          '0.0.2-dev',
+          pubspec: {
+            'environment': {'sdk': '>=2.9.0<3.0.0'}
+          },
+        );
 
       await setup(sdkConstraint: '>=2.12.0 <3.0.0');
       await expectValidation(validator, hints: isNotEmpty);
@@ -347,14 +325,13 @@
         'is opting in to null-safety with no existing stable versions. '
         'With a previous non-null-safe prerelease', () async {
       await setup(sdkConstraint: '>=2.12.0 <3.0.0');
-      await servePackages(
-        (server) => server.serve(
-          'test_pkg',
-          '0.0.2-dev',
-          pubspec: {
-            'environment': {'sdk': '>=2.9.0<3.0.0'}
-          },
-        ),
+      final server = await servePackages();
+      server.serve(
+        'test_pkg',
+        '0.0.2-dev',
+        pubspec: {
+          'environment': {'sdk': '>=2.9.0<3.0.0'}
+        },
       );
       await expectValidation(validator, hints: isNotEmpty);
     });
diff --git a/test/version_solver_test.dart b/test/version_solver_test.dart
index 40ebaaf..d36a16f 100644
--- a/test/version_solver_test.dart
+++ b/test/version_solver_test.dart
@@ -40,14 +40,13 @@
   });
 
   test('simple dependency tree', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'aa': '1.0.0', 'ab': '1.0.0'});
-      builder.serve('aa', '1.0.0');
-      builder.serve('ab', '1.0.0');
-      builder.serve('b', '1.0.0', deps: {'ba': '1.0.0', 'bb': '1.0.0'});
-      builder.serve('ba', '1.0.0');
-      builder.serve('bb', '1.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'aa': '1.0.0', 'ab': '1.0.0'})
+      ..serve('aa', '1.0.0')
+      ..serve('ab', '1.0.0')
+      ..serve('b', '1.0.0', deps: {'ba': '1.0.0', 'bb': '1.0.0'})
+      ..serve('ba', '1.0.0')
+      ..serve('bb', '1.0.0');
 
     await d.appDir({'a': '1.0.0', 'b': '1.0.0'}).create();
     await expectResolves(result: {
@@ -61,15 +60,14 @@
   });
 
   test('shared dependency with overlapping constraints', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'shared': '>=2.0.0 <4.0.0'});
-      builder.serve('b', '1.0.0', deps: {'shared': '>=3.0.0 <5.0.0'});
-      builder.serve('shared', '2.0.0');
-      builder.serve('shared', '3.0.0');
-      builder.serve('shared', '3.6.9');
-      builder.serve('shared', '4.0.0');
-      builder.serve('shared', '5.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'shared': '>=2.0.0 <4.0.0'})
+      ..serve('b', '1.0.0', deps: {'shared': '>=3.0.0 <5.0.0'})
+      ..serve('shared', '2.0.0')
+      ..serve('shared', '3.0.0')
+      ..serve('shared', '3.6.9')
+      ..serve('shared', '4.0.0')
+      ..serve('shared', '5.0.0');
 
     await d.appDir({'a': '1.0.0', 'b': '1.0.0'}).create();
     await expectResolves(
@@ -79,16 +77,15 @@
   test(
       'shared dependency where dependent version in turn affects other '
       'dependencies', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '1.0.1', deps: {'bang': '1.0.0'});
-      builder.serve('foo', '1.0.2', deps: {'whoop': '1.0.0'});
-      builder.serve('foo', '1.0.3', deps: {'zoop': '1.0.0'});
-      builder.serve('bar', '1.0.0', deps: {'foo': '<=1.0.1'});
-      builder.serve('bang', '1.0.0');
-      builder.serve('whoop', '1.0.0');
-      builder.serve('zoop', '1.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '1.0.1', deps: {'bang': '1.0.0'})
+      ..serve('foo', '1.0.2', deps: {'whoop': '1.0.0'})
+      ..serve('foo', '1.0.3', deps: {'zoop': '1.0.0'})
+      ..serve('bar', '1.0.0', deps: {'foo': '<=1.0.1'})
+      ..serve('bang', '1.0.0')
+      ..serve('whoop', '1.0.0')
+      ..serve('zoop', '1.0.0');
 
     await d.appDir({'foo': '<=1.0.2', 'bar': '1.0.0'}).create();
     await expectResolves(
@@ -96,23 +93,21 @@
   });
 
   test('circular dependency', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
-      builder.serve('bar', '1.0.0', deps: {'foo': '1.0.0'});
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
+      ..serve('bar', '1.0.0', deps: {'foo': '1.0.0'});
 
     await d.appDir({'foo': '1.0.0'}).create();
     await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'});
   });
 
   test('removed dependency', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0');
-      builder.serve('bar', '1.0.0');
-      builder.serve('bar', '2.0.0', deps: {'baz': '1.0.0'});
-      builder.serve('baz', '1.0.0', deps: {'foo': '2.0.0'});
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0')
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '2.0.0', deps: {'baz': '1.0.0'})
+      ..serve('baz', '1.0.0', deps: {'foo': '2.0.0'});
 
     await d.appDir({'foo': '1.0.0', 'bar': 'any'}).create();
     await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'}, tries: 2);
@@ -121,14 +116,13 @@
 
 void withLockFile() {
   test('with compatible locked dependency', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
-      builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
-      builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
-      builder.serve('bar', '1.0.0');
-      builder.serve('bar', '1.0.1');
-      builder.serve('bar', '1.0.2');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
+      ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
+      ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '1.0.1')
+      ..serve('bar', '1.0.2');
 
     await d.appDir({'foo': '1.0.1'}).create();
     await expectResolves(result: {'foo': '1.0.1', 'bar': '1.0.1'});
@@ -138,14 +132,13 @@
   });
 
   test('with incompatible locked dependency', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
-      builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
-      builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
-      builder.serve('bar', '1.0.0');
-      builder.serve('bar', '1.0.1');
-      builder.serve('bar', '1.0.2');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
+      ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
+      ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '1.0.1')
+      ..serve('bar', '1.0.2');
 
     await d.appDir({'foo': '1.0.1'}).create();
     await expectResolves(result: {'foo': '1.0.1', 'bar': '1.0.1'});
@@ -155,15 +148,14 @@
   });
 
   test('with unrelated locked dependency', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
-      builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
-      builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
-      builder.serve('bar', '1.0.0');
-      builder.serve('bar', '1.0.1');
-      builder.serve('bar', '1.0.2');
-      builder.serve('baz', '1.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
+      ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
+      ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '1.0.1')
+      ..serve('bar', '1.0.2')
+      ..serve('baz', '1.0.0');
 
     await d.appDir({'baz': '1.0.0'}).create();
     await expectResolves(result: {'baz': '1.0.0'});
@@ -175,17 +167,16 @@
   test(
       'unlocks dependencies if necessary to ensure that a new '
       'dependency is satisfied', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
-      builder.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
-      builder.serve('baz', '1.0.0', deps: {'qux': '<2.0.0'});
-      builder.serve('qux', '1.0.0');
-      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'});
-      builder.serve('qux', '2.0.0');
-      builder.serve('newdep', '2.0.0', deps: {'baz': '>=1.5.0'});
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '<2.0.0'})
+      ..serve('bar', '1.0.0', deps: {'baz': '<2.0.0'})
+      ..serve('baz', '1.0.0', deps: {'qux': '<2.0.0'})
+      ..serve('qux', '1.0.0')
+      ..serve('foo', '2.0.0', deps: {'bar': '<3.0.0'})
+      ..serve('bar', '2.0.0', deps: {'baz': '<3.0.0'})
+      ..serve('baz', '2.0.0', deps: {'qux': '<3.0.0'})
+      ..serve('qux', '2.0.0')
+      ..serve('newdep', '2.0.0', deps: {'baz': '>=1.5.0'});
 
     await d.appDir({'foo': '1.0.0'}).create();
     await expectResolves(result: {
@@ -209,11 +200,10 @@
   test(
       "produces a nice message for a locked dependency that's the only "
       'version of its package', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '>=2.0.0'});
-      builder.serve('bar', '1.0.0');
-      builder.serve('bar', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '>=2.0.0'})
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '2.0.0');
 
     await d.appDir({'foo': 'any'}).create();
     await expectResolves(result: {'foo': '1.0.0', 'bar': '2.0.0'});
@@ -229,30 +219,27 @@
 
 void rootDependency() {
   test('with root source', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'myapp': 'any'});
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', deps: {'myapp': 'any'});
 
     await d.appDir({'foo': '1.0.0'}).create();
     await expectResolves(result: {'foo': '1.0.0'});
   });
 
   test('with mismatched sources', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'myapp': 'any'});
-      builder.serve('bar', '1.0.0', deps: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'myapp': 'any'})
+      ..serve('bar', '1.0.0', deps: {
         'myapp': {'git': 'http://nowhere.com/'}
       });
-    });
 
     await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
     await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'});
   });
 
   test('with wrong version', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'myapp': '>0.0.0'});
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', deps: {'myapp': '>0.0.0'});
 
     await d.appDir({'foo': '1.0.0'}).create();
     await expectResolves(error: equalsIgnoringWhitespace('''
@@ -265,10 +252,9 @@
 
 void devDependency() {
   test("includes root package's dev dependencies", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('bar', '1.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('bar', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -281,10 +267,9 @@
   });
 
   test("includes dev dependency's transitive dependencies", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
-      builder.serve('bar', '1.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
+      ..serve('bar', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -297,10 +282,9 @@
   });
 
   test("ignores transitive dependency's dev dependencies", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'dev_dependencies': {'bar': '1.0.0'}
-      });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'dev_dependencies': {'bar': '1.0.0'}
     });
 
     await d.appDir({'foo': '1.0.0'}).create();
@@ -309,11 +293,10 @@
 
   group('with both a dev and regular dependency', () {
     test('succeeds when both are satisfied', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('foo', '2.0.0');
-        builder.serve('foo', '3.0.0');
-      });
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('foo', '2.0.0')
+        ..serve('foo', '3.0.0');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -327,9 +310,8 @@
     });
 
     test("fails when main dependency isn't satisfied", () async {
-      await servePackages((builder) {
-        builder.serve('foo', '3.0.0');
-      });
+      final server = await servePackages();
+      server.serve('foo', '3.0.0');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -347,9 +329,8 @@
     });
 
     test("fails when dev dependency isn't satisfied", () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -367,9 +348,8 @@
     });
 
     test('fails when dev and main constraints are incompatible', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -386,9 +366,8 @@
     });
 
     test('fails when dev and main sources are incompatible', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -407,9 +386,8 @@
     });
 
     test('fails when dev and main descriptions are incompatible', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0');
 
       await d.dir(appPath, [
         d.pubspec({
@@ -433,10 +411,9 @@
 
 void unsolvable() {
   test('no version that matches constraint', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '2.0.0');
-      builder.serve('foo', '2.1.3');
-    });
+    await servePackages()
+      ..serve('foo', '2.0.0')
+      ..serve('foo', '2.1.3');
 
     await d.appDir({'foo': '>=1.0.0 <2.0.0'}).create();
     await expectResolves(error: equalsIgnoringWhitespace("""
@@ -446,12 +423,11 @@
   });
 
   test('no version that matches combined constraint', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'shared': '>=2.0.0 <3.0.0'});
-      builder.serve('bar', '1.0.0', deps: {'shared': '>=2.9.0 <4.0.0'});
-      builder.serve('shared', '2.5.0');
-      builder.serve('shared', '3.5.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'shared': '>=2.0.0 <3.0.0'})
+      ..serve('bar', '1.0.0', deps: {'shared': '>=2.9.0 <4.0.0'})
+      ..serve('shared', '2.5.0')
+      ..serve('shared', '3.5.0');
 
     await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
     await expectResolves(error: equalsIgnoringWhitespace('''
@@ -466,12 +442,11 @@
   });
 
   test('disjoint constraints', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'shared': '<=2.0.0'});
-      builder.serve('bar', '1.0.0', deps: {'shared': '>3.0.0'});
-      builder.serve('shared', '2.0.0');
-      builder.serve('shared', '4.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'shared': '<=2.0.0'})
+      ..serve('bar', '1.0.0', deps: {'shared': '>3.0.0'})
+      ..serve('shared', '2.0.0')
+      ..serve('shared', '4.0.0');
 
     await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
     await expectResolves(error: equalsIgnoringWhitespace('''
@@ -483,20 +458,18 @@
   });
 
   test('mismatched descriptions', () async {
-    var otherServer = await PackageServer.start((builder) {
-      builder.serve('shared', '1.0.0');
-    });
+    var otherServer = await startPackageServer();
+    otherServer.serve('shared', '1.0.0');
 
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'shared': '1.0.0'});
-      builder.serve('bar', '1.0.0', deps: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'shared': '1.0.0'})
+      ..serve('bar', '1.0.0', deps: {
         'shared': {
           'hosted': {'name': 'shared', 'url': otherServer.url},
           'version': '1.0.0'
         }
-      });
-      builder.serve('shared', '1.0.0');
-    });
+      })
+      ..serve('shared', '1.0.0');
 
     await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
 
@@ -515,13 +488,12 @@
   test('mismatched sources', () async {
     await d.dir('shared', [d.libPubspec('shared', '1.0.0')]).create();
 
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'shared': '1.0.0'});
-      builder.serve('bar', '1.0.0', deps: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'shared': '1.0.0'})
+      ..serve('bar', '1.0.0', deps: {
         'shared': {'path': p.join(d.sandbox, 'shared')}
-      });
-      builder.serve('shared', '1.0.0');
-    });
+      })
+      ..serve('shared', '1.0.0');
 
     await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
     await expectResolves(error: equalsIgnoringWhitespace('''
@@ -534,12 +506,11 @@
   });
 
   test('no valid solution', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'b': '1.0.0'});
-      builder.serve('a', '2.0.0', deps: {'b': '2.0.0'});
-      builder.serve('b', '1.0.0', deps: {'a': '2.0.0'});
-      builder.serve('b', '2.0.0', deps: {'a': '1.0.0'});
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'b': '1.0.0'})
+      ..serve('a', '2.0.0', deps: {'b': '2.0.0'})
+      ..serve('b', '1.0.0', deps: {'a': '2.0.0'})
+      ..serve('b', '2.0.0', deps: {'a': '1.0.0'});
 
     await d.appDir({'a': 'any', 'b': 'any'}).create();
     await expectResolves(error: equalsIgnoringWhitespace('''
@@ -554,10 +525,9 @@
 
   // This is a regression test for #15550.
   test('no version that matches while backtracking', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('b', '1.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('b', '1.0.0');
 
     await d.appDir({'a': 'any', 'b': '>1.0.0'}).create();
     await expectResolves(error: equalsIgnoringWhitespace("""
@@ -568,19 +538,18 @@
 
   // This is a regression test for #18300.
   test('issue 18300', () async {
-    await servePackages((builder) {
-      builder.serve('analyzer', '0.12.2');
-      builder.serve('angular', '0.10.0',
-          deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'});
-      builder.serve('angular', '0.9.11',
-          deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'});
-      builder.serve('angular', '0.9.10',
-          deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'});
-      builder.serve('collection', '0.9.0');
-      builder.serve('collection', '0.9.1');
-      builder.serve('di', '0.0.37', deps: {'analyzer': '>=0.13.0 <0.14.0'});
-      builder.serve('di', '0.0.36', deps: {'analyzer': '>=0.13.0 <0.14.0'});
-    });
+    await servePackages()
+      ..serve('analyzer', '0.12.2')
+      ..serve('angular', '0.10.0',
+          deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'})
+      ..serve('angular', '0.9.11',
+          deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'})
+      ..serve('angular', '0.9.10',
+          deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'})
+      ..serve('collection', '0.9.0')
+      ..serve('collection', '0.9.1')
+      ..serve('di', '0.0.37', deps: {'analyzer': '>=0.13.0 <0.14.0'})
+      ..serve('di', '0.0.36', deps: {'analyzer': '>=0.13.0 <0.14.0'});
 
     await d.appDir({'angular': 'any', 'collection': 'any'}).create();
     await expectResolves(error: equalsIgnoringWhitespace('''
@@ -620,17 +589,16 @@
   });
 
   test('fail if all versions have bad source in dep', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {
         'bar': {'bad': 'any'}
-      });
-      builder.serve('foo', '1.0.1', deps: {
+      })
+      ..serve('foo', '1.0.1', deps: {
         'baz': {'bad': 'any'}
-      });
-      builder.serve('foo', '1.0.2', deps: {
+      })
+      ..serve('foo', '1.0.2', deps: {
         'bang': {'bad': 'any'}
       });
-    });
 
     await d.appDir({'foo': 'any'}).create();
     await expectResolves(error: equalsIgnoringWhitespace('''
@@ -646,16 +614,15 @@
   });
 
   test('ignore versions with bad source in dep', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
-      builder.serve('foo', '1.0.1', deps: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': 'any'})
+      ..serve('foo', '1.0.1', deps: {
         'bar': {'bad': 'any'}
-      });
-      builder.serve('foo', '1.0.2', deps: {
+      })
+      ..serve('foo', '1.0.2', deps: {
         'bar': {'bad': 'any'}
-      });
-      builder.serve('bar', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0');
 
     await d.appDir({'foo': 'any'}).create();
     await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'}, tries: 2);
@@ -663,11 +630,10 @@
 
   // Issue 1853
   test('reports a nice error across a collapsed cause', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
-      builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
-      builder.serve('baz', '1.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': 'any'})
+      ..serve('bar', '1.0.0', deps: {'baz': 'any'})
+      ..serve('baz', '1.0.0');
     await d.dir('baz', [d.libPubspec('baz', '1.0.0')]).create();
 
     await d.appDir({
@@ -685,28 +651,24 @@
 
 void backtracking() {
   test('circular dependency on older version', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '2.0.0', deps: {'b': '1.0.0'});
-      builder.serve('b', '1.0.0', deps: {'a': '1.0.0'});
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '2.0.0', deps: {'b': '1.0.0'})
+      ..serve('b', '1.0.0', deps: {'a': '1.0.0'});
 
     await d.appDir({'a': '>=1.0.0'}).create();
     await expectResolves(result: {'a': '1.0.0'}, tries: 2);
   });
 
   test('diamond dependency graph', () async {
-    await servePackages((builder) {
-      builder.serve('a', '2.0.0', deps: {'c': '^1.0.0'});
-      builder.serve('a', '1.0.0');
-
-      builder.serve('b', '2.0.0', deps: {'c': '^3.0.0'});
-      builder.serve('b', '1.0.0', deps: {'c': '^2.0.0'});
-
-      builder.serve('c', '3.0.0');
-      builder.serve('c', '2.0.0');
-      builder.serve('c', '1.0.0');
-    });
+    await servePackages()
+      ..serve('a', '2.0.0', deps: {'c': '^1.0.0'})
+      ..serve('a', '1.0.0')
+      ..serve('b', '2.0.0', deps: {'c': '^3.0.0'})
+      ..serve('b', '1.0.0', deps: {'c': '^2.0.0'})
+      ..serve('c', '3.0.0')
+      ..serve('c', '2.0.0')
+      ..serve('c', '1.0.0');
 
     await d.appDir({'a': 'any', 'b': 'any'}).create();
     await expectResolves(result: {'a': '1.0.0', 'b': '2.0.0', 'c': '3.0.0'});
@@ -716,20 +678,16 @@
   // requirement only exists because of both a and b. The solver should be able
   // to deduce c 2.0.0's incompatibility and select c 1.0.0 instead.
   test('backjumps after a partial satisfier', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'x': '>=1.0.0'});
-      builder.serve('b', '1.0.0', deps: {'x': '<2.0.0'});
-
-      builder.serve('c', '1.0.0');
-      builder.serve('c', '2.0.0', deps: {'a': 'any', 'b': 'any'});
-
-      builder.serve('x', '0.0.0');
-      builder.serve('x', '1.0.0', deps: {'y': '1.0.0'});
-      builder.serve('x', '2.0.0');
-
-      builder.serve('y', '1.0.0');
-      builder.serve('y', '2.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'x': '>=1.0.0'})
+      ..serve('b', '1.0.0', deps: {'x': '<2.0.0'})
+      ..serve('c', '1.0.0')
+      ..serve('c', '2.0.0', deps: {'a': 'any', 'b': 'any'})
+      ..serve('x', '0.0.0')
+      ..serve('x', '1.0.0', deps: {'y': '1.0.0'})
+      ..serve('x', '2.0.0')
+      ..serve('y', '1.0.0')
+      ..serve('y', '2.0.0');
 
     await d.appDir({'c': 'any', 'y': '^2.0.0'}).create();
     await expectResolves(result: {'c': '1.0.0', 'y': '2.0.0'}, tries: 2);
@@ -738,16 +696,15 @@
   // This matches the Branching Error Reporting example in the version solver
   // documentation, and tests that we display line numbers correctly.
   test('branching error reporting', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'a': '^1.0.0', 'b': '^1.0.0'});
-      builder.serve('foo', '1.1.0', deps: {'x': '^1.0.0', 'y': '^1.0.0'});
-      builder.serve('a', '1.0.0', deps: {'b': '^2.0.0'});
-      builder.serve('b', '1.0.0');
-      builder.serve('b', '2.0.0');
-      builder.serve('x', '1.0.0', deps: {'y': '^2.0.0'});
-      builder.serve('y', '1.0.0');
-      builder.serve('y', '2.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'a': '^1.0.0', 'b': '^1.0.0'})
+      ..serve('foo', '1.1.0', deps: {'x': '^1.0.0', 'y': '^1.0.0'})
+      ..serve('a', '1.0.0', deps: {'b': '^2.0.0'})
+      ..serve('b', '1.0.0')
+      ..serve('b', '2.0.0')
+      ..serve('x', '1.0.0', deps: {'y': '^2.0.0'})
+      ..serve('y', '1.0.0')
+      ..serve('y', '2.0.0');
 
     await d.appDir({'foo': '^1.0.0'}).create();
     await expectResolves(
@@ -772,14 +729,13 @@
   // will resolve the problem. This test validates that b, which is farther
   // in the dependency graph from myapp is downgraded first.
   test('rolls back leaf versions first', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'b': 'any'});
-      builder.serve('a', '2.0.0', deps: {'b': 'any', 'c': '2.0.0'});
-      builder.serve('b', '1.0.0');
-      builder.serve('b', '2.0.0', deps: {'c': '1.0.0'});
-      builder.serve('c', '1.0.0');
-      builder.serve('c', '2.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'b': 'any'})
+      ..serve('a', '2.0.0', deps: {'b': 'any', 'c': '2.0.0'})
+      ..serve('b', '1.0.0')
+      ..serve('b', '2.0.0', deps: {'c': '1.0.0'})
+      ..serve('c', '1.0.0')
+      ..serve('c', '2.0.0');
 
     await d.appDir({'a': 'any'}).create();
     await expectResolves(result: {'a': '2.0.0', 'b': '1.0.0', 'c': '2.0.0'});
@@ -788,15 +744,14 @@
   // Only one version of baz, so foo and bar will have to downgrade until they
   // reach it.
   test('simple transitive', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
-      builder.serve('foo', '2.0.0', deps: {'bar': '2.0.0'});
-      builder.serve('foo', '3.0.0', deps: {'bar': '3.0.0'});
-      builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
-      builder.serve('bar', '2.0.0', deps: {'baz': '2.0.0'});
-      builder.serve('bar', '3.0.0', deps: {'baz': '3.0.0'});
-      builder.serve('baz', '1.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
+      ..serve('foo', '2.0.0', deps: {'bar': '2.0.0'})
+      ..serve('foo', '3.0.0', deps: {'bar': '3.0.0'})
+      ..serve('bar', '1.0.0', deps: {'baz': 'any'})
+      ..serve('bar', '2.0.0', deps: {'baz': '2.0.0'})
+      ..serve('bar', '3.0.0', deps: {'baz': '3.0.0'})
+      ..serve('baz', '1.0.0');
 
     await d.appDir({'foo': 'any'}).create();
     await expectResolves(
@@ -808,14 +763,13 @@
   // make sure b has more versions than a so that the solver tries a first
   // since it sorts sibling dependencies by number of versions.
   test('backjump to nearer unsatisfied package', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'c': '1.0.0'});
-      builder.serve('a', '2.0.0', deps: {'c': '2.0.0-nonexistent'});
-      builder.serve('b', '1.0.0');
-      builder.serve('b', '2.0.0');
-      builder.serve('b', '3.0.0');
-      builder.serve('c', '1.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'c': '1.0.0'})
+      ..serve('a', '2.0.0', deps: {'c': '2.0.0-nonexistent'})
+      ..serve('b', '1.0.0')
+      ..serve('b', '2.0.0')
+      ..serve('b', '3.0.0')
+      ..serve('c', '1.0.0');
 
     await d.appDir({'a': 'any', 'b': 'any'}).create();
     await expectResolves(
@@ -839,18 +793,17 @@
   test('successful backjump to conflicting source', () async {
     await d.dir('a', [d.libPubspec('a', '1.0.0')]).create();
 
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('b', '1.0.0', deps: {'a': 'any'});
-      builder.serve('b', '2.0.0', deps: {
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('b', '1.0.0', deps: {'a': 'any'})
+      ..serve('b', '2.0.0', deps: {
         'a': {'path': p.join(d.sandbox, 'a')}
-      });
-      builder.serve('c', '1.0.0');
-      builder.serve('c', '2.0.0');
-      builder.serve('c', '3.0.0');
-      builder.serve('c', '4.0.0');
-      builder.serve('c', '5.0.0');
-    });
+      })
+      ..serve('c', '1.0.0')
+      ..serve('c', '2.0.0')
+      ..serve('c', '3.0.0')
+      ..serve('c', '4.0.0')
+      ..serve('c', '5.0.0');
 
     await d.appDir({'a': 'any', 'b': 'any', 'c': 'any'}).create();
     await expectResolves(result: {'a': '1.0.0', 'b': '1.0.0', 'c': '5.0.0'});
@@ -858,24 +811,22 @@
 
   // Like the above test, but for a conflicting description.
   test('successful backjump to conflicting description', () async {
-    var otherServer = await PackageServer.start((builder) {
-      builder.serve('a', '1.0.0');
-    });
+    var otherServer = await startPackageServer();
+    otherServer.serve('a', '1.0.0');
 
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('b', '1.0.0', deps: {'a': 'any'});
-      builder.serve('b', '2.0.0', deps: {
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('b', '1.0.0', deps: {'a': 'any'})
+      ..serve('b', '2.0.0', deps: {
         'a': {
           'hosted': {'name': 'a', 'url': otherServer.url}
         }
-      });
-      builder.serve('c', '1.0.0');
-      builder.serve('c', '2.0.0');
-      builder.serve('c', '3.0.0');
-      builder.serve('c', '4.0.0');
-      builder.serve('c', '5.0.0');
-    });
+      })
+      ..serve('c', '1.0.0')
+      ..serve('c', '2.0.0')
+      ..serve('c', '3.0.0')
+      ..serve('c', '4.0.0')
+      ..serve('c', '5.0.0');
 
     await d.appDir({'a': 'any', 'b': 'any', 'c': 'any'}).create();
     await expectResolves(result: {'a': '1.0.0', 'b': '1.0.0', 'c': '5.0.0'});
@@ -886,17 +837,16 @@
   test('failing backjump to conflicting source', () async {
     await d.dir('a', [d.libPubspec('a', '1.0.0')]).create();
 
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('b', '1.0.0', deps: {
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('b', '1.0.0', deps: {
         'a': {'path': p.join(d.sandbox, 'shared')}
-      });
-      builder.serve('c', '1.0.0');
-      builder.serve('c', '2.0.0');
-      builder.serve('c', '3.0.0');
-      builder.serve('c', '4.0.0');
-      builder.serve('c', '5.0.0');
-    });
+      })
+      ..serve('c', '1.0.0')
+      ..serve('c', '2.0.0')
+      ..serve('c', '3.0.0')
+      ..serve('c', '4.0.0')
+      ..serve('c', '5.0.0');
 
     await d.appDir({'a': 'any', 'b': 'any', 'c': 'any'}).create();
     await expectResolves(error: equalsIgnoringWhitespace('''
@@ -907,23 +857,21 @@
   });
 
   test('failing backjump to conflicting description', () async {
-    var otherServer = await PackageServer.start((builder) {
-      builder.serve('a', '1.0.0');
-    });
+    var otherServer = await startPackageServer();
+    otherServer.serve('a', '1.0.0');
 
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('b', '1.0.0', deps: {
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('b', '1.0.0', deps: {
         'a': {
           'hosted': {'name': 'a', 'url': otherServer.url}
         }
-      });
-      builder.serve('c', '1.0.0');
-      builder.serve('c', '2.0.0');
-      builder.serve('c', '3.0.0');
-      builder.serve('c', '4.0.0');
-      builder.serve('c', '5.0.0');
-    });
+      })
+      ..serve('c', '1.0.0')
+      ..serve('c', '2.0.0')
+      ..serve('c', '3.0.0')
+      ..serve('c', '4.0.0')
+      ..serve('c', '5.0.0');
 
     await d.appDir({'a': 'any', 'b': 'any', 'c': 'any'}).create();
     await expectResolves(
@@ -942,39 +890,37 @@
   // Since b has fewer versions, it will be traversed first, which means a will
   // come later. Since later selections are revised first, a gets downgraded.
   test('traverse into package with fewer versions first', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'c': 'any'});
-      builder.serve('a', '2.0.0', deps: {'c': 'any'});
-      builder.serve('a', '3.0.0', deps: {'c': 'any'});
-      builder.serve('a', '4.0.0', deps: {'c': 'any'});
-      builder.serve('a', '5.0.0', deps: {'c': '1.0.0'});
-      builder.serve('b', '1.0.0', deps: {'c': 'any'});
-      builder.serve('b', '2.0.0', deps: {'c': 'any'});
-      builder.serve('b', '3.0.0', deps: {'c': 'any'});
-      builder.serve('b', '4.0.0', deps: {'c': '2.0.0'});
-      builder.serve('c', '1.0.0');
-      builder.serve('c', '2.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'c': 'any'})
+      ..serve('a', '2.0.0', deps: {'c': 'any'})
+      ..serve('a', '3.0.0', deps: {'c': 'any'})
+      ..serve('a', '4.0.0', deps: {'c': 'any'})
+      ..serve('a', '5.0.0', deps: {'c': '1.0.0'})
+      ..serve('b', '1.0.0', deps: {'c': 'any'})
+      ..serve('b', '2.0.0', deps: {'c': 'any'})
+      ..serve('b', '3.0.0', deps: {'c': 'any'})
+      ..serve('b', '4.0.0', deps: {'c': '2.0.0'})
+      ..serve('c', '1.0.0')
+      ..serve('c', '2.0.0');
 
     await d.appDir({'a': 'any', 'b': 'any'}).create();
     await expectResolves(result: {'a': '4.0.0', 'b': '4.0.0', 'c': '2.0.0'});
   });
 
   test('complex backtrack', () async {
-    await servePackages((builder) {
-      // This sets up a hundred versions of foo and bar, 0.0.0 through 9.9.0. Each
-      // version of foo depends on a baz with the same major version. Each version
-      // of bar depends on a baz with the same minor version. There is only one
-      // version of baz, 0.0.0, so only older versions of foo and bar will
-      // satisfy it.
-      builder.serve('baz', '0.0.0');
-      for (var i = 0; i < 10; i++) {
-        for (var j = 0; j < 10; j++) {
-          builder.serve('foo', '$i.$j.0', deps: {'baz': '$i.0.0'});
-          builder.serve('bar', '$i.$j.0', deps: {'baz': '0.$j.0'});
-        }
+    final server = await servePackages();
+    // This sets up a hundred versions of foo and bar, 0.0.0 through 9.9.0. Each
+    // version of foo depends on a baz with the same major version. Each version
+    // of bar depends on a baz with the same minor version. There is only one
+    // version of baz, 0.0.0, so only older versions of foo and bar will
+    // satisfy it.
+    server.serve('baz', '0.0.0');
+    for (var i = 0; i < 10; i++) {
+      for (var j = 0; j < 10; j++) {
+        server.serve('foo', '$i.$j.0', deps: {'baz': '$i.0.0'});
+        server.serve('bar', '$i.$j.0', deps: {'baz': '0.$j.0'});
       }
-    });
+    }
 
     await d.appDir({'foo': 'any', 'bar': 'any'}).create();
     await expectResolves(
@@ -985,19 +931,18 @@
   // versions of it is a waste of time: no possible versions can match. We need
   // to jump past it to the most recent package that affected the constraint.
   test('backjump past failed package on disjoint constraint', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {
         'foo': 'any' // ok
-      });
-      builder.serve('a', '2.0.0', deps: {
+      })
+      ..serve('a', '2.0.0', deps: {
         'foo': '<1.0.0' // disjoint with myapp's constraint on foo
-      });
-      builder.serve('foo', '2.0.0');
-      builder.serve('foo', '2.0.1');
-      builder.serve('foo', '2.0.2');
-      builder.serve('foo', '2.0.3');
-      builder.serve('foo', '2.0.4');
-    });
+      })
+      ..serve('foo', '2.0.0')
+      ..serve('foo', '2.0.1')
+      ..serve('foo', '2.0.2')
+      ..serve('foo', '2.0.3')
+      ..serve('foo', '2.0.4');
 
     await d.appDir({'a': 'any', 'foo': '>2.0.0'}).create();
     await expectResolves(result: {'a': '1.0.0', 'foo': '2.0.4'});
@@ -1008,14 +953,13 @@
   // would backtrack over the failed package instead of trying different
   // versions of it.
   test('finds solution with less strict constraint', () async {
-    await servePackages((builder) {
-      builder.serve('a', '2.0.0');
-      builder.serve('a', '1.0.0');
-      builder.serve('b', '1.0.0', deps: {'a': '1.0.0'});
-      builder.serve('c', '1.0.0', deps: {'b': 'any'});
-      builder.serve('d', '2.0.0', deps: {'myapp': 'any'});
-      builder.serve('d', '1.0.0', deps: {'myapp': '<1.0.0'});
-    });
+    await servePackages()
+      ..serve('a', '2.0.0')
+      ..serve('a', '1.0.0')
+      ..serve('b', '1.0.0', deps: {'a': '1.0.0'})
+      ..serve('c', '1.0.0', deps: {'b': 'any'})
+      ..serve('d', '2.0.0', deps: {'myapp': 'any'})
+      ..serve('d', '1.0.0', deps: {'myapp': '<1.0.0'});
 
     await d.appDir({'a': 'any', 'c': 'any', 'd': 'any'}).create();
     await expectResolves(
@@ -1051,10 +995,9 @@
   });
 
   test('dependency does not match SDK', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
-        'environment': {'sdk': '0.0.0'}
-      });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'environment': {'sdk': '0.0.0'}
     });
 
     await d.appDir({'foo': 'any'}).create();
@@ -1067,12 +1010,11 @@
   });
 
   test('transitive dependency does not match SDK', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
-      builder.serve('bar', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': 'any'})
+      ..serve('bar', '1.0.0', pubspec: {
         'environment': {'sdk': '0.0.0'}
       });
-    });
 
     await d.appDir({'foo': 'any'}).create();
     await expectResolves(error: equalsIgnoringWhitespace('''
@@ -1085,41 +1027,39 @@
   });
 
   test('selects a dependency version that allows the SDK', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'environment': {'sdk': '0.1.2+3'}
-      });
-      builder.serve('foo', '2.0.0', pubspec: {
+      })
+      ..serve('foo', '2.0.0', pubspec: {
         'environment': {'sdk': '0.1.2+3'}
-      });
-      builder.serve('foo', '3.0.0', pubspec: {
+      })
+      ..serve('foo', '3.0.0', pubspec: {
+        'environment': {'sdk': '0.0.0'}
+      })
+      ..serve('foo', '4.0.0', pubspec: {
         'environment': {'sdk': '0.0.0'}
       });
-      builder.serve('foo', '4.0.0', pubspec: {
-        'environment': {'sdk': '0.0.0'}
-      });
-    });
 
     await d.appDir({'foo': 'any'}).create();
     await expectResolves(result: {'foo': '2.0.0'});
   });
 
   test('selects a transitive dependency version that allows the SDK', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
-      builder.serve('bar', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': 'any'})
+      ..serve('bar', '1.0.0', pubspec: {
         'environment': {'sdk': '0.1.2+3'}
-      });
-      builder.serve('bar', '2.0.0', pubspec: {
+      })
+      ..serve('bar', '2.0.0', pubspec: {
         'environment': {'sdk': '0.1.2+3'}
-      });
-      builder.serve('bar', '3.0.0', pubspec: {
+      })
+      ..serve('bar', '3.0.0', pubspec: {
+        'environment': {'sdk': '0.0.0'}
+      })
+      ..serve('bar', '4.0.0', pubspec: {
         'environment': {'sdk': '0.0.0'}
       });
-      builder.serve('bar', '4.0.0', pubspec: {
-        'environment': {'sdk': '0.0.0'}
-      });
-    });
 
     await d.appDir({'foo': 'any'}).create();
     await expectResolves(result: {'foo': '1.0.0', 'bar': '2.0.0'});
@@ -1128,24 +1068,23 @@
   test(
       'selects a dependency version that allows a transitive '
       'dependency that allows the SDK', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
-      builder.serve('foo', '2.0.0', deps: {'bar': '2.0.0'});
-      builder.serve('foo', '3.0.0', deps: {'bar': '3.0.0'});
-      builder.serve('foo', '4.0.0', deps: {'bar': '4.0.0'});
-      builder.serve('bar', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
+      ..serve('foo', '2.0.0', deps: {'bar': '2.0.0'})
+      ..serve('foo', '3.0.0', deps: {'bar': '3.0.0'})
+      ..serve('foo', '4.0.0', deps: {'bar': '4.0.0'})
+      ..serve('bar', '1.0.0', pubspec: {
         'environment': {'sdk': '0.1.2+3'}
-      });
-      builder.serve('bar', '2.0.0', pubspec: {
+      })
+      ..serve('bar', '2.0.0', pubspec: {
         'environment': {'sdk': '0.1.2+3'}
-      });
-      builder.serve('bar', '3.0.0', pubspec: {
+      })
+      ..serve('bar', '3.0.0', pubspec: {
+        'environment': {'sdk': '0.0.0'}
+      })
+      ..serve('bar', '4.0.0', pubspec: {
         'environment': {'sdk': '0.0.0'}
       });
-      builder.serve('bar', '4.0.0', pubspec: {
-        'environment': {'sdk': '0.0.0'}
-      });
-    });
 
     await d.appDir({'foo': 'any'}).create();
     await expectResolves(result: {'foo': '2.0.0', 'bar': '2.0.0'}, tries: 2);
@@ -1463,10 +1402,9 @@
     });
 
     test('fails for a dependency', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
-          'environment': {'flutter': '0.0.0'}
-        });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0', pubspec: {
+        'environment': {'flutter': '0.0.0'}
       });
 
       await d.appDir({'foo': 'any'}).create();
@@ -1479,13 +1417,12 @@
     });
 
     test("chooses a version that doesn't need Flutter", () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-        builder.serve('foo', '2.0.0');
-        builder.serve('foo', '3.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0')
+        ..serve('foo', '2.0.0')
+        ..serve('foo', '3.0.0', pubspec: {
           'environment': {'flutter': '0.0.0'}
         });
-      });
 
       await d.appDir({'foo': 'any'}).create();
       await expectResolves(result: {'foo': '2.0.0'});
@@ -1612,17 +1549,16 @@
     });
 
     test('selects the latest dependency with a matching constraint', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'environment': {'flutter': '^0.0.0'}
-        });
-        builder.serve('foo', '2.0.0', pubspec: {
+        })
+        ..serve('foo', '2.0.0', pubspec: {
           'environment': {'flutter': '^1.0.0'}
-        });
-        builder.serve('foo', '3.0.0', pubspec: {
+        })
+        ..serve('foo', '3.0.0', pubspec: {
           'environment': {'flutter': '^2.0.0'}
         });
-      });
 
       await d.appDir({'foo': 'any'}).create();
       await expectResolves(
@@ -1634,36 +1570,33 @@
 
 void prerelease() {
   test('prefer stable versions over unstable', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '1.1.0-dev');
-      builder.serve('a', '2.0.0-dev');
-      builder.serve('a', '3.0.0-dev');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '1.1.0-dev')
+      ..serve('a', '2.0.0-dev')
+      ..serve('a', '3.0.0-dev');
 
     await d.appDir({'a': 'any'}).create();
     await expectResolves(result: {'a': '1.0.0'});
   });
 
   test('use latest allowed prerelease if no stable versions match', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0-dev');
-      builder.serve('a', '1.1.0-dev');
-      builder.serve('a', '1.9.0-dev');
-      builder.serve('a', '3.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0-dev')
+      ..serve('a', '1.1.0-dev')
+      ..serve('a', '1.9.0-dev')
+      ..serve('a', '3.0.0');
 
     await d.appDir({'a': '<2.0.0'}).create();
     await expectResolves(result: {'a': '1.9.0-dev'});
   });
 
   test('use an earlier stable version on a < constraint', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '1.1.0');
-      builder.serve('a', '2.0.0-dev');
-      builder.serve('a', '2.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '1.1.0')
+      ..serve('a', '2.0.0-dev')
+      ..serve('a', '2.0.0');
 
     await d.appDir({'a': '<2.0.0'}).create();
     await expectResolves(result: {'a': '1.1.0'});
@@ -1671,33 +1604,30 @@
 
   test('prefer a stable version even if constraint mentions unstable',
       () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '1.1.0');
-      builder.serve('a', '2.0.0-dev');
-      builder.serve('a', '2.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '1.1.0')
+      ..serve('a', '2.0.0-dev')
+      ..serve('a', '2.0.0');
 
     await d.appDir({'a': '<=2.0.0-dev'}).create();
     await expectResolves(result: {'a': '1.1.0'});
   });
 
   test('use pre-release when desired', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '1.1.0-dev');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '1.1.0-dev');
 
     await d.appDir({'a': '^1.1.0-dev'}).create();
     await expectResolves(result: {'a': '1.1.0-dev'});
   });
 
   test('can upgrade from pre-release', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '1.1.0-dev');
-      builder.serve('a', '1.1.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '1.1.0-dev')
+      ..serve('a', '1.1.0');
 
     await d.appDir({'a': '^1.1.0-dev'}).create();
     await expectResolves(result: {'a': '1.1.0'});
@@ -1706,12 +1636,11 @@
   test('will use pre-release if depended on in stable release', () async {
     // This behavior is desired because a stable package has dependency on a
     // pre-release.
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'b': '^1.0.0'});
-      builder.serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'});
-      builder.serve('b', '1.0.0');
-      builder.serve('b', '1.1.0-dev');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'b': '^1.0.0'})
+      ..serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'})
+      ..serve('b', '1.0.0')
+      ..serve('b', '1.1.0-dev');
 
     await d.appDir({'a': '^1.0.0'}).create();
     await expectResolves(result: {
@@ -1721,12 +1650,11 @@
   });
 
   test('backtracks pre-release choice with direct dependency', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'b': '^1.0.0'});
-      builder.serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'});
-      builder.serve('b', '1.0.0');
-      builder.serve('b', '1.1.0-dev');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'b': '^1.0.0'})
+      ..serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'})
+      ..serve('b', '1.0.0')
+      ..serve('b', '1.1.0-dev');
 
     await d.appDir({
       'a': '^1.0.0',
@@ -1741,13 +1669,12 @@
   test('backtracking pre-release fails with indirect dependency', () async {
     // NOTE: This behavior is not necessarily desired.
     //       If feasible it might worth changing this behavior in the future.
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'b': '^1.0.0'});
-      builder.serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'});
-      builder.serve('b', '1.0.0');
-      builder.serve('b', '1.1.0-dev');
-      builder.serve('c', '1.0.0', deps: {'b': '^1.0.0'});
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'b': '^1.0.0'})
+      ..serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'})
+      ..serve('b', '1.0.0')
+      ..serve('b', '1.1.0-dev')
+      ..serve('c', '1.0.0', deps: {'b': '^1.0.0'});
 
     await d.appDir({
       'a': '^1.0.0',
@@ -1762,14 +1689,13 @@
 
   test('https://github.com/dart-lang/pub/issues/3057 regression', () async {
     // This used to cause an infinite loop.
-    await servePackages((builder) {
-      builder.serve('a', '0.12.0', deps: {});
-      builder.serve('b', '0.1.0', deps: {'c': '2.0.0'});
-      builder.serve('b', '0.9.0-1', deps: {'c': '^1.6.0'});
-      builder.serve('b', '0.10.0', deps: {'a': '1.0.0'});
-      builder.serve('b', '0.17.0', deps: {'a': '1.0.0'});
-      builder.serve('c', '2.0.1', deps: {});
-    });
+    await servePackages()
+      ..serve('a', '0.12.0', deps: {})
+      ..serve('b', '0.1.0', deps: {'c': '2.0.0'})
+      ..serve('b', '0.9.0-1', deps: {'c': '^1.6.0'})
+      ..serve('b', '0.10.0', deps: {'a': '1.0.0'})
+      ..serve('b', '0.17.0', deps: {'a': '1.0.0'})
+      ..serve('c', '2.0.1', deps: {});
 
     await d.appDir(
       {
@@ -1784,13 +1710,12 @@
   });
 
   test('https://github.com/dart-lang/pub/pull/3038 regression', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.1.0', deps: {'b': '^1.0.0'});
-      builder.serve('b', '1.0.0', deps: {'c': '^1.0.0'});
-      builder.serve('c', '0.9.0');
-      builder.serve('b', '1.1.0-alpha');
-      builder.serve('a', '1.0.0', deps: {'b': '^1.1.0-alpha'});
-    });
+    await servePackages()
+      ..serve('a', '1.1.0', deps: {'b': '^1.0.0'})
+      ..serve('b', '1.0.0', deps: {'c': '^1.0.0'})
+      ..serve('c', '0.9.0')
+      ..serve('b', '1.1.0-alpha')
+      ..serve('a', '1.0.0', deps: {'b': '^1.1.0-alpha'});
 
     await d.appDir({
       'a': '^1.0.0',
@@ -1801,11 +1726,10 @@
 
 void override() {
   test('chooses best version matching override constraint', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '2.0.0');
-      builder.serve('a', '3.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '2.0.0')
+      ..serve('a', '3.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -1819,11 +1743,10 @@
   });
 
   test('uses override as dependency', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '2.0.0');
-      builder.serve('a', '3.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '2.0.0')
+      ..serve('a', '3.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -1836,13 +1759,12 @@
   });
 
   test('ignores other constraints on overridden package', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '2.0.0');
-      builder.serve('a', '3.0.0');
-      builder.serve('b', '1.0.0', deps: {'a': '1.0.0'});
-      builder.serve('c', '1.0.0', deps: {'a': '3.0.0'});
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '2.0.0')
+      ..serve('a', '3.0.0')
+      ..serve('b', '1.0.0', deps: {'a': '1.0.0'})
+      ..serve('c', '1.0.0', deps: {'a': '3.0.0'});
 
     await d.dir(appPath, [
       d.pubspec({
@@ -1856,12 +1778,11 @@
   });
 
   test('backtracks on overidden package for its constraints', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0', deps: {'shared': 'any'});
-      builder.serve('a', '2.0.0', deps: {'shared': '1.0.0'});
-      builder.serve('shared', '1.0.0');
-      builder.serve('shared', '2.0.0');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0', deps: {'shared': 'any'})
+      ..serve('a', '2.0.0', deps: {'shared': '1.0.0'})
+      ..serve('shared', '1.0.0')
+      ..serve('shared', '2.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -1875,14 +1796,13 @@
   });
 
   test('override compatible with locked dependency', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
-      builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
-      builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
-      builder.serve('bar', '1.0.0');
-      builder.serve('bar', '1.0.1');
-      builder.serve('bar', '1.0.2');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
+      ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
+      ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '1.0.1')
+      ..serve('bar', '1.0.2');
 
     await d.appDir({'foo': '1.0.1'}).create();
     await expectResolves(result: {'foo': '1.0.1', 'bar': '1.0.1'});
@@ -1898,14 +1818,13 @@
   });
 
   test('override incompatible with locked dependency', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
-      builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
-      builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
-      builder.serve('bar', '1.0.0');
-      builder.serve('bar', '1.0.1');
-      builder.serve('bar', '1.0.2');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
+      ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
+      ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '1.0.1')
+      ..serve('bar', '1.0.2');
 
     await d.appDir({'foo': '1.0.1'}).create();
     await expectResolves(result: {'foo': '1.0.1', 'bar': '1.0.1'});
@@ -1921,10 +1840,9 @@
   });
 
   test('no version that matches override', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '2.0.0');
-      builder.serve('foo', '2.1.3');
-    });
+    await servePackages()
+      ..serve('foo', '2.0.0')
+      ..serve('foo', '2.1.3');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -1940,9 +1858,8 @@
   });
 
   test('overrides a bad source without error', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '0.0.0');
-    });
+    final server = await servePackages();
+    server.serve('foo', '0.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -1958,10 +1875,9 @@
   });
 
   test('overrides an unmatched SDK constraint', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '0.0.0', pubspec: {
-        'environment': {'sdk': '0.0.0'}
-      });
+    final server = await servePackages();
+    server.serve('foo', '0.0.0', pubspec: {
+      'environment': {'sdk': '0.0.0'}
     });
 
     await d.dir(appPath, [
@@ -1975,9 +1891,8 @@
   });
 
   test('overrides an unmatched root dependency', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '0.0.0', deps: {'myapp': '1.0.0'});
-    });
+    final server = await servePackages();
+    server.serve('foo', '0.0.0', deps: {'myapp': '1.0.0'});
 
     await d.dir(appPath, [
       d.pubspec({
@@ -1992,11 +1907,10 @@
 
   // Regression test for #1853
   test("overrides a locked package's dependency", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.2.3', deps: {'bar': '1.2.3'});
-      builder.serve('bar', '1.2.3');
-      builder.serve('bar', '0.0.1');
-    });
+    await servePackages()
+      ..serve('foo', '1.2.3', deps: {'bar': '1.2.3'})
+      ..serve('bar', '1.2.3')
+      ..serve('bar', '0.0.1');
 
     await d.appDir({'foo': 'any'}).create();
 
@@ -2016,12 +1930,11 @@
 
 void downgrade() {
   test('downgrades a dependency to the lowest matching version', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('foo', '2.0.0-dev');
-      builder.serve('foo', '2.0.0');
-      builder.serve('foo', '2.1.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0-dev')
+      ..serve('foo', '2.0.0')
+      ..serve('foo', '2.1.0');
 
     await d.appDir({'foo': '2.1.0'}).create();
     await expectResolves(result: {'foo': '2.1.0'});
@@ -2033,12 +1946,11 @@
   test(
       'use earliest allowed prerelease if no stable versions match '
       'while downgrading', () async {
-    await servePackages((builder) {
-      builder.serve('a', '1.0.0');
-      builder.serve('a', '2.0.0-dev.1');
-      builder.serve('a', '2.0.0-dev.2');
-      builder.serve('a', '2.0.0-dev.3');
-    });
+    await servePackages()
+      ..serve('a', '1.0.0')
+      ..serve('a', '2.0.0-dev.1')
+      ..serve('a', '2.0.0-dev.2')
+      ..serve('a', '2.0.0-dev.3');
 
     await d.appDir({'a': '>=2.0.0-dev.1 <3.0.0'}).create();
     await expectResolves(result: {'a': '2.0.0-dev.1'}, downgrade: true);
@@ -2047,67 +1959,63 @@
 
 void features() {
   test("doesn't enable an opt-in feature by default", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('bar', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0');
 
     await d.appDir({'foo': '1.0.0'}).create();
     await expectResolves(result: {'foo': '1.0.0'});
   });
 
   test('enables an opt-out feature by default', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'default': true,
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('bar', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0');
 
     await d.appDir({'foo': '1.0.0'}).create();
     await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'});
   });
 
   test('features are opt-out by default', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('bar', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0');
 
     await d.appDir({'foo': '1.0.0'}).create();
     await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'});
   });
 
   test("enables an opt-in feature if it's required", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('bar', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0');
 
     await d.appDir({
       'foo': {
@@ -2119,16 +2027,15 @@
   });
 
   test("doesn't enable an opt-out feature if it's disabled", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('bar', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0');
 
     await d.appDir({
       'foo': {
@@ -2140,22 +2047,21 @@
   });
 
   test('opting in takes precedence over opting out', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('bar', '1.0.0');
-      builder.serve('baz', '1.0.0', deps: {
+      })
+      ..serve('bar', '1.0.0')
+      ..serve('baz', '1.0.0', deps: {
         'foo': {
           'version': '1.0.0',
           'features': {'stuff': true}
         }
       });
-    });
 
     await d.appDir({
       'foo': {
@@ -2169,21 +2075,20 @@
   });
 
   test('implicitly opting in takes precedence over opting out', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('bar', '1.0.0');
-      builder.serve('baz', '1.0.0', deps: {
+      })
+      ..serve('bar', '1.0.0')
+      ..serve('baz', '1.0.0', deps: {
         'foo': {
           'version': '1.0.0',
         }
       });
-    });
 
     await d.appDir({
       'foo': {
@@ -2197,18 +2102,17 @@
   });
 
   test("doesn't select a version with an unavailable feature", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('foo', '1.1.0');
-      builder.serve('bar', '1.0.0');
-    });
+      })
+      ..serve('foo', '1.1.0')
+      ..serve('bar', '1.0.0');
 
     await d.appDir({
       'foo': {
@@ -2220,26 +2124,25 @@
   });
 
   test("doesn't select a version with an incompatible feature", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('foo', '1.1.0', pubspec: {
+      })
+      ..serve('foo', '1.1.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
             'dependencies': {'bar': '2.0.0'}
           }
         }
-      });
-      builder.serve('bar', '1.0.0');
-      builder.serve('bar', '2.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0')
+      ..serve('bar', '2.0.0');
 
     await d.appDir({
       'foo': {
@@ -2254,8 +2157,8 @@
   test(
       'backtracks if a feature is transitively incompatible with another '
       'feature', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
@@ -2267,27 +2170,24 @@
             }
           }
         }
-      });
-      builder.serve('foo', '1.1.0', pubspec: {
+      })
+      ..serve('foo', '1.1.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-
-      builder.serve('bar', '1.0.0', pubspec: {
+      })
+      ..serve('bar', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'dependencies': {'baz': '1.0.0'}
           }
         }
-      });
-
-      builder.serve('baz', '1.0.0');
-      builder.serve('baz', '2.0.0');
-    });
+      })
+      ..serve('baz', '1.0.0')
+      ..serve('baz', '2.0.0');
 
     await d.appDir({
       'foo': {
@@ -2302,30 +2202,27 @@
 
   test("backtracks if a feature's dependencies are transitively incompatible",
       () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', pubspec: {
+    await servePackages()
+      ..serve('foo', '1.0.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
             'dependencies': {'bar': '1.0.0'}
           }
         }
-      });
-      builder.serve('foo', '1.1.0', pubspec: {
+      })
+      ..serve('foo', '1.1.0', pubspec: {
         'features': {
           'stuff': {
             'default': false,
             'dependencies': {'bar': '2.0.0'}
           }
         }
-      });
-
-      builder.serve('bar', '1.0.0', deps: {'baz': '1.0.0'});
-      builder.serve('bar', '2.0.0', deps: {'baz': '2.0.0'});
-
-      builder.serve('baz', '1.0.0');
-      builder.serve('baz', '2.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0', deps: {'baz': '1.0.0'})
+      ..serve('bar', '2.0.0', deps: {'baz': '2.0.0'})
+      ..serve('baz', '1.0.0')
+      ..serve('baz', '2.0.0');
 
     await d.appDir({
       'foo': {
@@ -2339,9 +2236,9 @@
   });
 
   test('disables a feature when it backtracks', () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {'myapp': '0.0.0'});
-      builder.serve('foo', '1.1.0', deps: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {'myapp': '0.0.0'})
+      ..serve('foo', '1.1.0', deps: {
         // This is a transitively incompatible dependency with myapp, which will
         // force the solver to backtrack and unselect foo 1.1.0.
         'bar': '1.0.0',
@@ -2349,15 +2246,11 @@
           'version': '0.0.0',
           'features': {'stuff': true}
         }
-      });
-
-      builder.serve('bar', '1.0.0', deps: {'baz': '2.0.0'});
-
-      builder.serve('baz', '1.0.0');
-      builder.serve('baz', '2.0.0');
-
-      builder.serve('qux', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0', deps: {'baz': '2.0.0'})
+      ..serve('baz', '1.0.0')
+      ..serve('baz', '2.0.0')
+      ..serve('qux', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -2375,10 +2268,9 @@
   });
 
   test("the root package's features are opt-out by default", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('bar', '1.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('bar', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -2395,10 +2287,9 @@
   });
 
   test("the root package's features can be made opt-in", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-      builder.serve('bar', '1.0.0');
-    });
+    await servePackages()
+      ..serve('foo', '1.0.0')
+      ..serve('bar', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -2421,14 +2312,13 @@
   // increases the total number of dependencies.
   test("the root package's features can't be disabled by dependencies",
       () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {
         'myapp': {
           'features': {'stuff': false}
         }
-      });
-      builder.serve('bar', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -2445,14 +2335,13 @@
   });
 
   test("the root package's features can be enabled by dependencies", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0', deps: {
+    await servePackages()
+      ..serve('foo', '1.0.0', deps: {
         'myapp': {
           'features': {'stuff': true}
         }
-      });
-      builder.serve('bar', '1.0.0');
-    });
+      })
+      ..serve('bar', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -2470,9 +2359,8 @@
   });
 
   test("resolution fails because a feature doesn't exist", () async {
-    await servePackages((builder) {
-      builder.serve('foo', '1.0.0');
-    });
+    final server = await servePackages();
+    server.serve('foo', '1.0.0');
 
     await d.dir(appPath, [
       d.pubspec({
@@ -2492,17 +2380,16 @@
 
   group('an "if available" dependency', () {
     test('enables an opt-in feature', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'features': {
             'stuff': {
               'default': false,
               'dependencies': {'bar': '1.0.0'}
             }
           }
-        });
-        builder.serve('bar', '1.0.0');
-      });
+        })
+        ..serve('bar', '1.0.0');
 
       await d.appDir({
         'foo': {
@@ -2514,9 +2401,8 @@
     });
 
     test("is compatible with a feature that doesn't exist", () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0');
-      });
+      final server = await servePackages();
+      server.serve('foo', '1.0.0');
 
       await d.appDir({
         'foo': {
@@ -2535,14 +2421,13 @@
 
     group('succeeds when', () {
       test('a Dart SDK constraint is matched', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.0.0', pubspec: {
-            'features': {
-              'stuff': {
-                'environment': {'sdk': '^0.1.0'}
-              }
+        final server = await servePackages();
+        server.serve('foo', '1.0.0', pubspec: {
+          'features': {
+            'stuff': {
+              'environment': {'sdk': '^0.1.0'}
             }
-          });
+          }
         });
 
         await d.dir(appPath, [
@@ -2556,14 +2441,13 @@
       });
 
       test('a Flutter SDK constraint is matched', () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.0.0', pubspec: {
-            'features': {
-              'stuff': {
-                'environment': {'flutter': '^1.0.0'}
-              }
+        final server = await servePackages();
+        server.serve('foo', '1.0.0', pubspec: {
+          'features': {
+            'stuff': {
+              'environment': {'flutter': '^1.0.0'}
             }
-          });
+          }
         });
 
         await d.dir(appPath, [
@@ -2581,16 +2465,15 @@
 
     group("doesn't choose a version because", () {
       test("a Dart SDK constraint isn't matched", () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.0.0');
-          builder.serve('foo', '1.1.0', pubspec: {
+        await servePackages()
+          ..serve('foo', '1.0.0')
+          ..serve('foo', '1.1.0', pubspec: {
             'features': {
               'stuff': {
                 'environment': {'sdk': '0.0.1'}
               }
             }
           });
-        });
 
         await d.dir(appPath, [
           d.pubspec({
@@ -2603,16 +2486,15 @@
       });
 
       test("Flutter isn't available", () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.0.0');
-          builder.serve('foo', '1.1.0', pubspec: {
+        await servePackages()
+          ..serve('foo', '1.0.0')
+          ..serve('foo', '1.1.0', pubspec: {
             'features': {
               'stuff': {
                 'environment': {'flutter': '1.0.0'}
               }
             }
           });
-        });
 
         await d.dir(appPath, [
           d.pubspec({
@@ -2625,16 +2507,15 @@
       });
 
       test("a Flutter SDK constraint isn't matched", () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.0.0');
-          builder.serve('foo', '1.1.0', pubspec: {
+        await servePackages()
+          ..serve('foo', '1.0.0')
+          ..serve('foo', '1.1.0', pubspec: {
             'features': {
               'stuff': {
                 'environment': {'flutter': '^2.0.0'}
               }
             }
           });
-        });
 
         await d.dir(appPath, [
           d.pubspec({
@@ -2651,14 +2532,13 @@
 
     group('resolution fails because', () {
       test("a Dart SDK constraint isn't matched", () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.0.0', pubspec: {
-            'features': {
-              'stuff': {
-                'environment': {'sdk': '0.0.1'}
-              }
+        final server = await servePackages();
+        server.serve('foo', '1.0.0', pubspec: {
+          'features': {
+            'stuff': {
+              'environment': {'sdk': '0.0.1'}
             }
-          });
+          }
         });
 
         await d.dir(appPath, [
@@ -2675,14 +2555,13 @@
       });
 
       test("Flutter isn't available", () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.0.0', pubspec: {
-            'features': {
-              'stuff': {
-                'environment': {'flutter': '1.0.0'}
-              }
+        final server = await servePackages();
+        server.serve('foo', '1.0.0', pubspec: {
+          'features': {
+            'stuff': {
+              'environment': {'flutter': '1.0.0'}
             }
-          });
+          }
         });
 
         await d.dir(appPath, [
@@ -2698,14 +2577,13 @@
       });
 
       test("a Flutter SDK constraint isn't matched", () async {
-        await servePackages((builder) {
-          builder.serve('foo', '1.0.0', pubspec: {
-            'features': {
-              'stuff': {
-                'environment': {'flutter': '^2.0.0'}
-              }
+        final server = await servePackages();
+        server.serve('foo', '1.0.0', pubspec: {
+          'features': {
+            'stuff': {
+              'environment': {'flutter': '^2.0.0'}
             }
-          });
+          }
         });
 
         await d.dir(appPath, [
@@ -2725,8 +2603,8 @@
 
   group('with overlapping dependencies', () {
     test('can enable extra features', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'dependencies': {'bar': '1.0.0'},
           'features': {
             'stuff': {
@@ -2738,19 +2616,16 @@
               }
             }
           }
-        });
-
-        builder.serve('bar', '1.0.0', pubspec: {
+        })
+        ..serve('bar', '1.0.0', pubspec: {
           'features': {
             'stuff': {
               'default': false,
               'dependencies': {'baz': '1.0.0'}
             }
           }
-        });
-
-        builder.serve('baz', '1.0.0');
-      });
+        })
+        ..serve('baz', '1.0.0');
 
       await d.appDir({
         'foo': {'version': '1.0.0'}
@@ -2768,8 +2643,8 @@
     });
 
     test("can't disable features", () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'dependencies': {
             'bar': {
               'version': '1.0.0',
@@ -2786,19 +2661,16 @@
               }
             }
           }
-        });
-
-        builder.serve('bar', '1.0.0', pubspec: {
+        })
+        ..serve('bar', '1.0.0', pubspec: {
           'features': {
             'stuff': {
               'default': true,
               'dependencies': {'baz': '1.0.0'}
             }
           }
-        });
-
-        builder.serve('baz', '1.0.0');
-      });
+        })
+        ..serve('baz', '1.0.0');
 
       await d.appDir({
         'foo': {
@@ -2813,8 +2685,8 @@
 
   group('with required features', () {
     test('enables those features', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'features': {
             'main': {
               'default': false,
@@ -2829,10 +2701,9 @@
               'dependencies': {'baz': '1.0.0'}
             }
           }
-        });
-        builder.serve('bar', '1.0.0');
-        builder.serve('baz', '1.0.0');
-      });
+        })
+        ..serve('bar', '1.0.0')
+        ..serve('baz', '1.0.0');
 
       await d.appDir({
         'foo': {
@@ -2845,8 +2716,8 @@
     });
 
     test('enables those features by default', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'features': {
             'main': {
               'requires': ['required1', 'required2']
@@ -2860,10 +2731,9 @@
               'dependencies': {'baz': '1.0.0'}
             }
           }
-        });
-        builder.serve('bar', '1.0.0');
-        builder.serve('baz', '1.0.0');
-      });
+        })
+        ..serve('bar', '1.0.0')
+        ..serve('baz', '1.0.0');
 
       await d.appDir({'foo': '1.0.0'}).create();
       await expectResolves(
@@ -2871,8 +2741,8 @@
     });
 
     test("doesn't enable those features if it's disabled", () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'features': {
             'main': {
               'requires': ['required']
@@ -2882,9 +2752,8 @@
               'dependencies': {'bar': '1.0.0'}
             }
           }
-        });
-        builder.serve('bar', '1.0.0');
-      });
+        })
+        ..serve('bar', '1.0.0');
 
       await d.appDir({
         'foo': {
@@ -2897,8 +2766,8 @@
 
     test("enables those features even if they'd otherwise be disabled",
         () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'features': {
             'main': {
               'requires': ['required']
@@ -2908,9 +2777,8 @@
               'dependencies': {'bar': '1.0.0'}
             }
           }
-        });
-        builder.serve('bar', '1.0.0');
-      });
+        })
+        ..serve('bar', '1.0.0');
 
       await d.appDir({
         'foo': {
@@ -2922,8 +2790,8 @@
     });
 
     test('enables features transitively', () async {
-      await servePackages((builder) {
-        builder.serve('foo', '1.0.0', pubspec: {
+      await servePackages()
+        ..serve('foo', '1.0.0', pubspec: {
           'features': {
             'main': {
               'requires': ['required1']
@@ -2937,9 +2805,8 @@
               'dependencies': {'bar': '1.0.0'}
             }
           }
-        });
-        builder.serve('bar', '1.0.0');
-      });
+        })
+        ..serve('bar', '1.0.0');
 
       await d.appDir({
         'foo': {
@@ -3007,7 +2874,7 @@
       // If the dep uses the default hosted source, grab it from the test
       // package server rather than pub.dartlang.org.
       dep = registry.hosted
-          .refFor(dep.name, url: Uri.parse(globalPackageServer.url))
+          .refFor(dep.name, url: Uri.parse(globalServer.url))
           .withConstraint(dep.constraint);
     }
     expect(dep.allows(id), isTrue, reason: 'Expected $id to match $dep.');
@@ -3018,14 +2885,12 @@
 
 void regressions() {
   test('reformatRanges with a build', () async {
-    await servePackages((b) {
-      b.serve('integration_test', '1.0.1',
-          deps: {'vm_service': '>= 4.2.0 <6.0.0'});
-      b.serve('integration_test', '1.0.2+2',
-          deps: {'vm_service': '>= 4.2.0 <7.0.0'});
-
-      b.serve('vm_service', '7.3.0');
-    });
+    await servePackages()
+      ..serve('integration_test', '1.0.1',
+          deps: {'vm_service': '>= 4.2.0 <6.0.0'})
+      ..serve('integration_test', '1.0.2+2',
+          deps: {'vm_service': '>= 4.2.0 <7.0.0'})
+      ..serve('vm_service', '7.3.0');
     await d.appDir({'integration_test': '^1.0.2'}).create();
     await expectResolves(
       error: contains(