Improve documentation of `pub token` and subcommands (#3778)

diff --git a/lib/src/authentication/token_store.dart b/lib/src/authentication/token_store.dart
index a5ceba0..14a3d16 100644
--- a/lib/src/authentication/token_store.dart
+++ b/lib/src/authentication/token_store.dart
@@ -29,7 +29,7 @@
   /// [Credential].
   List<Credential> _loadCredentials() {
     final result = <Credential>[];
-    final path = _tokensFile;
+    final path = tokensFile;
     if (path == null || !fileExists(path)) {
       return result;
     }
@@ -97,7 +97,7 @@
 
   /// Writes [credentials] into "pub-tokens.json".
   void _saveCredentials(List<Credential> credentials) {
-    final tokensFile = _tokensFile;
+    final tokensFile = this.tokensFile;
     if (tokensFile == null) {
       missingConfigDir();
     }
@@ -171,7 +171,7 @@
 
   /// Deletes pub-tokens.json file from the disk.
   void deleteTokensFile() {
-    final tokensFile = _tokensFile;
+    final tokensFile = this.tokensFile;
     if (tokensFile == null) {
       missingConfigDir();
     } else if (!fileExists(tokensFile)) {
@@ -185,7 +185,7 @@
   /// Full path to the "pub-tokens.json" file.
   ///
   /// `null` if no config directory could be found.
-  String? get _tokensFile {
+  String? get tokensFile {
     var dir = configDir;
     return dir == null ? null : path.join(dir, 'pub-tokens.json');
   }
diff --git a/lib/src/command.dart b/lib/src/command.dart
index a0e4ebf..b7ee191 100644
--- a/lib/src/command.dart
+++ b/lib/src/command.dart
@@ -37,7 +37,17 @@
   'upgrade': ['update'],
 };
 
-final lineLength = stdout.hasTerminal ? stdout.terminalColumns : 80;
+final lineLength = _lineLength();
+
+int _lineLength() {
+  final fromEnv = Platform.environment['_PUB_TEST_TERMINAL_COLUMNS'];
+  if (fromEnv != null) {
+    final parsed = int.tryParse(fromEnv);
+    if (parsed != null && parsed > 0) return parsed;
+  }
+  if (stdout.hasTerminal) return stdout.terminalColumns;
+  return 80;
+}
 
 /// The base class for commands for the pub executable.
 ///
diff --git a/lib/src/command/token.dart b/lib/src/command/token.dart
index 9886dcf..f1f15f1 100644
--- a/lib/src/command/token.dart
+++ b/lib/src/command/token.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../command.dart';
+import '../command_runner.dart';
 import 'token_add.dart';
 import 'token_list.dart';
 import 'token_remove.dart';
@@ -12,8 +13,17 @@
   @override
   String get name => 'token';
   @override
-  String get description =>
-      'Manage authentication tokens for hosted pub repositories.';
+  String get description => '''
+Manage authentication tokens for hosted pub repositories.
+
+The tokens will be used for authorizing both when retrieving dependencies and
+for publishing.
+
+Tokens are stored in `${tokenStore.tokensFile}`.
+
+For interactive authorization against pub.dev, use `$topLevelProgram pub login`.''';
+  @override
+  String get docUrl => 'https://dart.dev/tools/pub/cmd/pub-token';
 
   TokenCommand() {
     addSubcommand(TokenListCommand());
diff --git a/lib/src/command/token_add.dart b/lib/src/command/token_add.dart
index 90805cb..5ade7ba 100644
--- a/lib/src/command/token_add.dart
+++ b/lib/src/command/token_add.dart
@@ -7,6 +7,7 @@
 
 import '../authentication/credential.dart';
 import '../command.dart';
+import '../command_runner.dart';
 import '../exceptions.dart';
 import '../io.dart';
 import '../log.dart' as log;
@@ -18,12 +19,23 @@
   @override
   String get name => 'add';
   @override
-  String get description =>
-      'Add authentication tokens for a package repository.';
+  String get description => '''
+Add an authentication token for a package repository.
+
+The token will be used for authorizing against <hosted-url> both when
+retrieving dependencies and for publishing.
+
+Tokens are stored in ${tokenStore.tokensFile}.
+
+This command will prompt for the secret token over stdin.
+(Unless `--env-var` is used).
+
+For interactive authorization against pub.dev, use `$topLevelProgram pub login`.''';
   @override
-  String get invocation => 'pub token add';
+  String get argumentsDescription => '[options] <hosted-url>';
+
   @override
-  String get argumentsDescription => '[hosted-url]';
+  String get docUrl => 'https://dart.dev/tools/pub/cmd/pub-token';
 
   String? get envVar => argResults['env-var'];
 
@@ -32,6 +44,7 @@
       'env-var',
       help: 'Read the secret token from this environment variable when '
           'making requests.',
+      valueHelp: 'VARIABLE',
     );
   }
 
diff --git a/lib/src/command/token_list.dart b/lib/src/command/token_list.dart
index 3cf73ee..178d0a4 100644
--- a/lib/src/command/token_list.dart
+++ b/lib/src/command/token_list.dart
@@ -12,7 +12,7 @@
   @override
   String get description => 'List servers for which a token exists.';
   @override
-  String get invocation => 'pub token list';
+  String get docUrl => 'https://dart.dev/tools/pub/cmd/pub-token';
 
   @override
   Future<void> runProtected() async {
diff --git a/lib/src/command/token_remove.dart b/lib/src/command/token_remove.dart
index 1af2e18..b4a9a77 100644
--- a/lib/src/command/token_remove.dart
+++ b/lib/src/command/token_remove.dart
@@ -12,11 +12,12 @@
   @override
   String get name => 'remove';
   @override
-  String get description => 'Remove secret token for package repository.';
+  String get description => '''
+Remove secret token for package repository at <hosted-url>.''';
   @override
-  String get invocation => 'pub token remove';
+  String get argumentsDescription => '<hosted-url> | --all';
   @override
-  String get argumentsDescription => '[hosted-url]';
+  String get docUrl => 'https://dart.dev/tools/pub/cmd/pub-token';
 
   bool get isAll => argResults['all'];
 
diff --git a/lib/src/io.dart b/lib/src/io.dart
index c9230ca..54736c9 100644
--- a/lib/src/io.dart
+++ b/lib/src/io.dart
@@ -1156,7 +1156,7 @@
 final String? dartConfigDir = () {
   if (runningFromTest &&
       Platform.environment.containsKey('_PUB_TEST_CONFIG_DIR')) {
-    return Platform.environment['_PUB_TEST_CONFIG_DIR'];
+    return path.join(Platform.environment['_PUB_TEST_CONFIG_DIR']!, 'dart');
   }
   try {
     return applicationConfigHome('dart');
diff --git a/lib/src/oauth2.dart b/lib/src/oauth2.dart
index b51fdfb..c729d4c 100644
--- a/lib/src/oauth2.dart
+++ b/lib/src/oauth2.dart
@@ -30,8 +30,8 @@
 );
 
 /// The pub client's OAuth2 identifier.
-const _identifier = '818368855108-8grd2eg9tj9f38os6f1urbcvsq399u8n.apps.'
-    'googleusercontent.com';
+const _identifier =
+    '818368855108-8grd2eg9tj9f38os6f1urbcvsq399u8n.apps.googleusercontent.com';
 
 /// The pub client's OAuth2 secret.
 ///
diff --git a/test/descriptor.dart b/test/descriptor.dart
index be962c1..7f414cc 100644
--- a/test/descriptor.dart
+++ b/test/descriptor.dart
@@ -226,8 +226,7 @@
   String? refreshToken,
   DateTime? expiration,
 }) {
-  return dir(
-    configPath,
+  return configDir(
     [
       file(
         'pub-credentials.json',
@@ -284,7 +283,7 @@
 /// Describes the file in the system cache that contains credentials for
 /// third party hosted pub servers.
 Descriptor tokensFile([Map<String, dynamic> contents = const {}]) {
-  return dir(configPath, [file('pub-tokens.json', jsonEncode(contents))]);
+  return configDir([file('pub-tokens.json', jsonEncode(contents))]);
 }
 
 /// Describes the application directory, containing only a pubspec specifying
diff --git a/test/help_test.dart b/test/help_test.dart
index 110ab84..767aad9 100644
--- a/test/help_test.dart
+++ b/test/help_test.dart
@@ -42,7 +42,13 @@
   final cmds = _extractCommands([], PubCommandRunner().commands.values);
   for (final c in cmds) {
     testWithGolden('pub ${c.join(' ')} --help', (ctx) async {
-      await ctx.run([...c, '--help']);
+      await ctx.run(
+        [...c, '--help'],
+        environment: {
+          // Use more columns to avoid unintended line breaking.
+          '_PUB_TEST_TERMINAL_COLUMNS': '200'
+        },
+      );
     });
   }
 }
diff --git a/test/oauth2/logout_test.dart b/test/oauth2/logout_test.dart
index 6c835a9..db083ac 100644
--- a/test/oauth2/logout_test.dart
+++ b/test/oauth2/logout_test.dart
@@ -21,7 +21,7 @@
 
     await runPub(args: ['logout'], output: contains('Logging out of pub.dev.'));
 
-    await d.dir(configPath, [d.nothing('pub-credentials.json')]).validate();
+    await configDir([d.nothing('pub-credentials.json')]).validate();
   });
 
   test(
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 31c68a8..cb5280f 100644
--- a/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
+++ b/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
@@ -16,10 +16,7 @@
     await d.validPackage.create();
 
     await servePackages();
-    await d.dir(
-      configPath,
-      [d.file('pub-credentials.json', '{bad json')],
-    ).create();
+    await configDir([d.file('pub-credentials.json', '{bad json')]).create();
 
     var pub = await startPublish(globalServer);
     await confirmPublish(pub);
diff --git a/test/test_pub.dart b/test/test_pub.dart
index e6aa8cc..e389f29 100644
--- a/test/test_pub.dart
+++ b/test/test_pub.dart
@@ -61,6 +61,9 @@
 /// sandbox directory.
 const String configPath = '.config';
 
+d.DirectoryDescriptor configDir(Iterable<d.Descriptor> contents) =>
+    d.dir(configPath, [d.dir('dart', contents)]);
+
 /// The path of the mock app directory used for tests, relative to the sandbox
 /// directory.
 const String appPath = 'myapp';
@@ -952,7 +955,8 @@
   // Any paths in output should be relative to the sandbox and with forward
   // slashes to be stable across platforms.
   input = input.replaceAll(d.sandbox, r'$SANDBOX');
-  input = input.replaceAllMapped(RegExp(r'\\(\S)'), (match) => '/${match[1]}');
+  input =
+      input.replaceAllMapped(RegExp(r'\\(\S|\.)'), (match) => '/${match[1]}');
   var port = _globalServer?.port;
   if (port != null) {
     input = input.replaceAll(port.toString(), '\$PORT');
diff --git a/test/testdata/goldens/help_test/pub add --help.txt b/test/testdata/goldens/help_test/pub add --help.txt
index cc734f1..dfed108 100644
--- a/test/testdata/goldens/help_test/pub add --help.txt
+++ b/test/testdata/goldens/help_test/pub add --help.txt
@@ -33,12 +33,10 @@
     `dart pub add \
       'foo:{"git":{"url":"../foo.git","ref":"branch","path":"subdir"}}'`
 
-Usage: pub add [options] [dev:]<package>[:descriptor] [[dev:]<package>[:descriptor]
-       ...]
+Usage: pub add [options] [dev:]<package>[:descriptor] [[dev:]<package>[:descriptor] ...]
 -h, --help               Print this usage information.
     --[no-]offline       Use cached packages instead of accessing the network.
--n, --dry-run            Report what dependencies would change but don't change
-                         any.
+-n, --dry-run            Report what dependencies would change but don't change any.
     --[no-]precompile    Build executables in immediate dependencies.
 -C, --directory=<dir>    Run this in the directory <dir>.
 
diff --git a/test/testdata/goldens/help_test/pub downgrade --help.txt b/test/testdata/goldens/help_test/pub downgrade --help.txt
index 8e3a24f..483e764 100644
--- a/test/testdata/goldens/help_test/pub downgrade --help.txt
+++ b/test/testdata/goldens/help_test/pub downgrade --help.txt
@@ -9,8 +9,7 @@
 Usage: pub downgrade [dependencies...]
 -h, --help               Print this usage information.
     --[no-]offline       Use cached packages instead of accessing the network.
--n, --dry-run            Report what dependencies would change but don't change
-                         any.
+-n, --dry-run            Report what dependencies would change but don't change any.
 -C, --directory=<dir>    Run this in the directory <dir>.
 
 Run "pub help" to see global options.
diff --git a/test/testdata/goldens/help_test/pub get --help.txt b/test/testdata/goldens/help_test/pub get --help.txt
index 80a482b..afd27d5 100644
--- a/test/testdata/goldens/help_test/pub get --help.txt
+++ b/test/testdata/goldens/help_test/pub get --help.txt
@@ -7,10 +7,8 @@
 Usage: pub get <subcommand> [arguments...]
 -h, --help                Print this usage information.
     --[no-]offline        Use cached packages instead of accessing the network.
--n, --dry-run             Report what dependencies would change but don't change
-                          any.
-    --enforce-lockfile    Enforce pubspec.lock. Fail resolution if pubspec.lock
-                          does not satisfy pubspec.yaml
+-n, --dry-run             Report what dependencies would change but don't change any.
+    --enforce-lockfile    Enforce pubspec.lock. Fail resolution if pubspec.lock does not satisfy pubspec.yaml
     --[no-]precompile     Build executables in immediate dependencies.
 -C, --directory=<dir>     Run this in the directory <dir>.
 
diff --git a/test/testdata/goldens/help_test/pub global activate --help.txt b/test/testdata/goldens/help_test/pub global activate --help.txt
index 29aab49..75fbc3d 100644
--- a/test/testdata/goldens/help_test/pub global activate --help.txt
+++ b/test/testdata/goldens/help_test/pub global activate --help.txt
@@ -12,10 +12,8 @@
     --git-ref           Git branch or commit to be retrieved
     --no-executables    Do not put executables on PATH.
 -x, --executable        Executable(s) to place on PATH.
-    --overwrite         Overwrite executables from other packages with the same
-                        name.
--u, --hosted-url        A custom pub server URL for the package. Only applies
-                        when using the `hosted` source.
+    --overwrite         Overwrite executables from other packages with the same name.
+-u, --hosted-url        A custom pub server URL for the package. Only applies when using the `hosted` source.
 
 Run "pub help" to see global options.
 
diff --git a/test/testdata/goldens/help_test/pub global run --help.txt b/test/testdata/goldens/help_test/pub global run --help.txt
index b2d4cf1..df01700 100644
--- a/test/testdata/goldens/help_test/pub global run --help.txt
+++ b/test/testdata/goldens/help_test/pub global run --help.txt
@@ -7,10 +7,7 @@
 Usage: pub global run <package>:<executable> [args...]
 -h, --help                              Print this usage information.
     --[no-]enable-asserts               Enable assert statements.
-    --enable-experiment=<experiment>    Runs the executable in a VM with the
-                                        given experiments enabled. (Will disable
-                                        snapshotting, resulting in slower
-                                        startup).
+    --enable-experiment=<experiment>    Runs the executable in a VM with the given experiments enabled. (Will disable snapshotting, resulting in slower startup).
 
 Run "pub help" to see global options.
 
diff --git a/test/testdata/goldens/help_test/pub outdated --help.txt b/test/testdata/goldens/help_test/pub outdated --help.txt
index dc050f6..14e8323 100644
--- a/test/testdata/goldens/help_test/pub outdated --help.txt
+++ b/test/testdata/goldens/help_test/pub outdated --help.txt
@@ -12,8 +12,7 @@
                                    (defaults to on)
     --json                         Output the results using a json format.
     --[no-]prereleases             Include prereleases in latest version.
-    --[no-]show-all                Include dependencies that are already
-                                   fullfilling --mode.
+    --[no-]show-all                Include dependencies that are already fullfilling --mode.
     --[no-]transitive              Show transitive dependencies.
 -C, --directory=<dir>              Run this in the directory <dir>.
 
diff --git a/test/testdata/goldens/help_test/pub remove --help.txt b/test/testdata/goldens/help_test/pub remove --help.txt
index 3d9e6c1..f8da56e 100644
--- a/test/testdata/goldens/help_test/pub remove --help.txt
+++ b/test/testdata/goldens/help_test/pub remove --help.txt
@@ -7,8 +7,7 @@
 Usage: pub remove <package>
 -h, --help               Print this usage information.
     --[no-]offline       Use cached packages instead of accessing the network.
--n, --dry-run            Report what dependencies would change but don't change
-                         any.
+-n, --dry-run            Report what dependencies would change but don't change any.
     --[no-]precompile    Precompile executables in immediate dependencies.
 -C, --directory=<dir>    Run this in the directory <dir>.
 
diff --git a/test/testdata/goldens/help_test/pub run --help.txt b/test/testdata/goldens/help_test/pub run --help.txt
index 0808247..7e81314 100644
--- a/test/testdata/goldens/help_test/pub run --help.txt
+++ b/test/testdata/goldens/help_test/pub run --help.txt
@@ -7,10 +7,8 @@
 Usage: pub run <executable> [arguments...]
 -h, --help                              Print this usage information.
     --[no-]enable-asserts               Enable assert statements.
-    --enable-experiment=<experiment>    Runs the executable in a VM with the
-                                        given experiments enabled.
-                                        (Will disable snapshotting, resulting in
-                                        slower startup).
+    --enable-experiment=<experiment>    Runs the executable in a VM with the given experiments enabled.
+                                        (Will disable snapshotting, resulting in slower startup).
 -C, --directory=<dir>                   Run this in the directory <dir>.
 
 Run "pub help" to see global options.
diff --git a/test/testdata/goldens/help_test/pub token --help.txt b/test/testdata/goldens/help_test/pub token --help.txt
index fa164c5..9f29282 100644
--- a/test/testdata/goldens/help_test/pub token --help.txt
+++ b/test/testdata/goldens/help_test/pub token --help.txt
@@ -4,13 +4,21 @@
 $ pub token --help
 Manage authentication tokens for hosted pub repositories.
 
+The tokens will be used for authorizing both when retrieving dependencies and
+for publishing.
+
+Tokens are stored in `$SANDBOX/.config/dart/pub-tokens.json`.
+
+For interactive authorization against pub.dev, use `dart pub login`.
+
 Usage: pub token [arguments...]
 -h, --help    Print this usage information.
 
 Available subcommands:
-  add      Add authentication tokens for a package repository.
+  add      Add an authentication token for a package repository.
   list     List servers for which a token exists.
-  remove   Remove secret token for package repository.
+  remove   Remove secret token for package repository at <hosted-url>.
 
 Run "pub help" to see global options.
+See https://dart.dev/tools/pub/cmd/pub-token for detailed documentation.
 
diff --git a/test/testdata/goldens/help_test/pub token add --help.txt b/test/testdata/goldens/help_test/pub token add --help.txt
index 7068a5c..d3e611d 100644
--- a/test/testdata/goldens/help_test/pub token add --help.txt
+++ b/test/testdata/goldens/help_test/pub token add --help.txt
@@ -2,12 +2,22 @@
 
 ## Section 0
 $ pub token add --help
-Add authentication tokens for a package repository.
+Add an authentication token for a package repository.
 
-Usage: pub token add
--h, --help       Print this usage information.
-    --env-var    Read the secret token from this environment variable when
-                 making requests.
+The token will be used for authorizing against <hosted-url> both when
+retrieving dependencies and for publishing.
+
+Tokens are stored in $SANDBOX/.config/dart/pub-tokens.json.
+
+This command will prompt for the secret token over stdin.
+(Unless `--env-var` is used).
+
+For interactive authorization against pub.dev, use `dart pub login`.
+
+Usage: pub token add [options] <hosted-url>
+-h, --help                  Print this usage information.
+    --env-var=<VARIABLE>    Read the secret token from this environment variable when making requests.
 
 Run "pub help" to see global options.
+See https://dart.dev/tools/pub/cmd/pub-token for detailed documentation.
 
diff --git a/test/testdata/goldens/help_test/pub token list --help.txt b/test/testdata/goldens/help_test/pub token list --help.txt
index 5c333b5..d2ed712 100644
--- a/test/testdata/goldens/help_test/pub token list --help.txt
+++ b/test/testdata/goldens/help_test/pub token list --help.txt
@@ -4,8 +4,9 @@
 $ pub token list --help
 List servers for which a token exists.
 
-Usage: pub token list
+Usage: pub token list <subcommand> [arguments...]
 -h, --help    Print this usage information.
 
 Run "pub help" to see global options.
+See https://dart.dev/tools/pub/cmd/pub-token for detailed documentation.
 
diff --git a/test/testdata/goldens/help_test/pub token remove --help.txt b/test/testdata/goldens/help_test/pub token remove --help.txt
index 1f79f81..ba06dbe 100644
--- a/test/testdata/goldens/help_test/pub token remove --help.txt
+++ b/test/testdata/goldens/help_test/pub token remove --help.txt
@@ -2,11 +2,12 @@
 
 ## Section 0
 $ pub token remove --help
-Remove secret token for package repository.
+Remove secret token for package repository at <hosted-url>.
 
-Usage: pub token remove
+Usage: pub token remove <hosted-url> | --all
 -h, --help    Print this usage information.
     --all     Remove all secret tokens.
 
 Run "pub help" to see global options.
+See https://dart.dev/tools/pub/cmd/pub-token for detailed documentation.
 
diff --git a/test/testdata/goldens/help_test/pub upgrade --help.txt b/test/testdata/goldens/help_test/pub upgrade --help.txt
index af583b8..32b7eea 100644
--- a/test/testdata/goldens/help_test/pub upgrade --help.txt
+++ b/test/testdata/goldens/help_test/pub upgrade --help.txt
@@ -7,11 +7,9 @@
 Usage: pub upgrade [dependencies...]
 -h, --help               Print this usage information.
     --[no-]offline       Use cached packages instead of accessing the network.
--n, --dry-run            Report what dependencies would change but don't change
-                         any.
+-n, --dry-run            Report what dependencies would change but don't change any.
     --[no-]precompile    Precompile executables in immediate dependencies.
-    --major-versions     Upgrades packages to their latest resolvable versions,
-                         and updates pubspec.yaml.
+    --major-versions     Upgrades packages to their latest resolvable versions, and updates pubspec.yaml.
 -C, --directory=<dir>    Run this in the directory <dir>.
 
 Run "pub help" to see global options.
diff --git a/test/token/add_token_test.dart b/test/token/add_token_test.dart
index bb61bf3..80b9223 100644
--- a/test/token/add_token_test.dart
+++ b/test/token/add_token_test.dart
@@ -119,18 +119,18 @@
   });
 
   test('with invalid server url returns error', () async {
-    await d.dir(configPath).create();
+    await configDir([]).create();
     await runPub(
       args: ['token', 'add', 'http:;://invalid-url,.com'],
       error: contains('Invalid [hosted-url]'),
       exitCode: exit_codes.USAGE,
     );
 
-    await d.dir(configPath, [d.nothing('pub-tokens.json')]).validate();
+    await configDir([d.nothing('pub-tokens.json')]).validate();
   });
 
   test('with invalid token returns error', () async {
-    await d.dir(configPath).create();
+    await configDir([]).create();
 
     await runPub(
       args: ['token', 'add', 'https://pub.dev'],
@@ -139,18 +139,18 @@
       exitCode: exit_codes.DATA,
     );
 
-    await d.dir(configPath, [d.nothing('pub-tokens.json')]).validate();
+    await configDir([d.nothing('pub-tokens.json')]).validate();
   });
 
   test('with non-secure server url returns error', () async {
-    await d.dir(configPath).create();
+    await configDir([]).create();
     await runPub(
       args: ['token', 'add', 'http://mypub.com'],
       error: contains('insecure repositories cannot use authentication'),
       exitCode: exit_codes.USAGE,
     );
 
-    await d.dir(configPath, [d.nothing('pub-tokens.json')]).validate();
+    await configDir([d.nothing('pub-tokens.json')]).validate();
   });
 
   test(
diff --git a/test/token/remove_token_test.dart b/test/token/remove_token_test.dart
index df880a4..06ec38e 100644
--- a/test/token/remove_token_test.dart
+++ b/test/token/remove_token_test.dart
@@ -57,7 +57,7 @@
 
     await runPub(args: ['token', 'remove', '--all']);
 
-    await d.dir(configPath, [d.nothing('pub-tokens.json')]).validate();
+    await configDir([d.nothing('pub-tokens.json')]).validate();
   });
 
   test('with empty environment gives error message', () async {