Drop package resolver from test_core and test, use package_config from test (#1181)

Also updates to the latest stack_trace_mapper
diff --git a/.travis.yml b/.travis.yml
index 2880345..eb82324 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,8 +13,8 @@
 jobs:
   include:
     - stage: analyze_and_format
-      name: "SDK: 2.4.0; PKGS: pkgs/test, pkgs/test_api, pkgs/test_core; TASKS: `dartanalyzer --fatal-warnings .`"
-      dart: "2.4.0"
+      name: "SDK: 2.7.0; PKGS: pkgs/test, pkgs/test_api, pkgs/test_core; TASKS: `dartanalyzer --fatal-warnings .`"
+      dart: "2.7.0"
       os: linux
       env: PKGS="pkgs/test pkgs/test_api pkgs/test_core"
       script: ./tool/travis.sh dartanalyzer_1
diff --git a/pkgs/test/CHANGELOG.md b/pkgs/test/CHANGELOG.md
index 8483e77..4bd7b5f 100644
--- a/pkgs/test/CHANGELOG.md
+++ b/pkgs/test/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 1.14.0
+
+* Drop the `package_resolver` dependency for the `package_config` dependency
+  which is lower level.
+
 ## 1.13.0
 
 * Enable asserts in code running through `spawnHybrid` APIs.
diff --git a/pkgs/test/lib/src/runner/browser/platform.dart b/pkgs/test/lib/src/runner/browser/platform.dart
index 0fff1ed..75c8eb0 100644
--- a/pkgs/test/lib/src/runner/browser/platform.dart
+++ b/pkgs/test/lib/src/runner/browser/platform.dart
@@ -9,7 +9,6 @@
 
 import 'package:async/async.dart';
 import 'package:http_multi_server/http_multi_server.dart';
-import 'package:package_resolver/package_resolver.dart';
 import 'package:path/path.dart' as p;
 import 'package:pool/pool.dart';
 import 'package:shelf/shelf.dart' as shelf;
@@ -37,6 +36,7 @@
 import 'package:test_core/src/runner/plugin/customizable_platform.dart'; // ignore: implementation_imports
 
 import '../executable_settings.dart';
+import '../../util/package_map.dart';
 import '../../util/path_handler.dart';
 import '../../util/one_off_handler.dart';
 import 'browser_manager.dart';
@@ -348,8 +348,9 @@
         if (getSourceMap && !suiteConfig.jsTrace) {
           _mappers[path] = JSStackTraceMapper(await utf8.decodeStream(response),
               mapUrl: url,
-              packageResolver: SyncPackageResolver.root('packages'),
-              sdkRoot: p.toUri('packages/\$sdk'));
+              sdkRoot: p.toUri('packages/\$sdk'),
+              packageMap:
+                  (await currentPackageConfig).toPackagesDirPackageMap());
           return;
         }
 
@@ -410,8 +411,8 @@
       var mapPath = jsPath + '.map';
       _mappers[dartPath] = JSStackTraceMapper(File(mapPath).readAsStringSync(),
           mapUrl: p.toUri(mapPath),
-          packageResolver: await PackageResolver.current.asSync,
-          sdkRoot: Uri.parse('org-dartlang-sdk:///sdk'));
+          sdkRoot: Uri.parse('org-dartlang-sdk:///sdk'),
+          packageMap: (await currentPackageConfig).toPackageMap());
     });
   }
 
diff --git a/pkgs/test/lib/src/runner/node/platform.dart b/pkgs/test/lib/src/runner/node/platform.dart
index e8ba74c..bea9aa9 100644
--- a/pkgs/test/lib/src/runner/node/platform.dart
+++ b/pkgs/test/lib/src/runner/node/platform.dart
@@ -7,9 +7,9 @@
 import 'dart:convert';
 
 import 'package:async/async.dart';
+import 'package:package_config/package_config.dart';
 import 'package:multi_server_socket/multi_server_socket.dart';
 import 'package:node_preamble/preamble.dart' as preamble;
-import 'package:package_resolver/package_resolver.dart';
 import 'package:path/path.dart' as p;
 import 'package:stream_channel/stream_channel.dart';
 import 'package:yaml/yaml.dart';
@@ -32,6 +32,7 @@
 import 'package:test_core/src/runner/plugin/platform_helpers.dart'; // ignore: implementation_imports
 
 import '../executable_settings.dart';
+import '../../util/package_map.dart';
 
 /// A platform that loads tests in Node.js processes.
 class NodePlatform extends PlatformPlugin
@@ -172,8 +173,8 @@
       var mapPath = jsPath + '.map';
       mapper = JSStackTraceMapper(await File(mapPath).readAsString(),
           mapUrl: p.toUri(mapPath),
-          packageResolver: await PackageResolver.current.asSync,
-          sdkRoot: Uri.parse('org-dartlang-sdk:///sdk'));
+          sdkRoot: Uri.parse('org-dartlang-sdk:///sdk'),
+          packageMap: (await currentPackageConfig).toPackageMap());
     }
 
     return Pair(await _startProcess(runtime, jsPath, socketPort), mapper);
@@ -191,12 +192,11 @@
     var jsPath = p.join(precompiledPath, '$testPath.node_test.dart.js');
     if (!suiteConfig.jsTrace) {
       var mapPath = jsPath + '.map';
-      var resolver = await SyncPackageResolver.loadConfig(
-          p.toUri(p.join(precompiledPath, '.packages')));
       mapper = JSStackTraceMapper(await File(mapPath).readAsString(),
           mapUrl: p.toUri(mapPath),
-          packageResolver: resolver,
-          sdkRoot: Uri.parse('org-dartlang-sdk:///sdk'));
+          sdkRoot: Uri.parse('org-dartlang-sdk:///sdk'),
+          packageMap: (await findPackageConfig(Directory(precompiledPath)))
+              .toPackageMap());
     }
 
     return Pair(await _startProcess(runtime, jsPath, socketPort), mapper);
@@ -220,8 +220,8 @@
       var mapUrl = url.replace(path: url.path + '.map');
       mapper = JSStackTraceMapper(await _get(mapUrl, testPath),
           mapUrl: mapUrl,
-          packageResolver: SyncPackageResolver.root('packages'),
-          sdkRoot: p.toUri('packages/\$sdk'));
+          sdkRoot: p.toUri('packages/\$sdk'),
+          packageMap: (await currentPackageConfig).toPackagesDirPackageMap());
     }
 
     return Pair(await _startProcess(runtime, jsPath, socketPort), mapper);
diff --git a/pkgs/test/lib/src/util/package_map.dart b/pkgs/test/lib/src/util/package_map.dart
new file mode 100644
index 0000000..948b6a6
--- /dev/null
+++ b/pkgs/test/lib/src/util/package_map.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2020, 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:isolate';
+
+import 'package:package_config/package_config.dart';
+
+/// The [PackageConfig] parsed from the current isolates package config file.
+final Future<PackageConfig> currentPackageConfig = () async {
+  return loadPackageConfigUri(await Isolate.packageConfig);
+}();
+
+/// Adds methods to convert to a package map on [PackageConfig].
+extension PackageMap on PackageConfig {
+  /// A package map exactly matching the current package config
+  Map<String, Uri> toPackageMap() =>
+      {for (var package in packages) package.name: package.packageUriRoot};
+
+  /// A package map with all the current packages but where the uris are all
+  /// of the form 'packages/${package.name}'.
+  Map<String, Uri> toPackagesDirPackageMap() => {
+        for (var package in packages)
+          package.name: Uri.parse('packages/${package.name}')
+      };
+}
diff --git a/pkgs/test/mono_pkg.yaml b/pkgs/test/mono_pkg.yaml
index 1848903..ef401af 100644
--- a/pkgs/test/mono_pkg.yaml
+++ b/pkgs/test/mono_pkg.yaml
@@ -9,7 +9,7 @@
         dart: dev
       - group:
         - dartanalyzer: --fatal-warnings .
-        dart: 2.4.0
+        dart: 2.7.0
     - unit_test:
       - command: xvfb-run -s "-screen 0 1024x768x24" pub run test --preset travis -x phantomjs --total-shards 5 --shard-index 0
       - command: xvfb-run -s "-screen 0 1024x768x24" pub run test --preset travis -x phantomjs --total-shards 5 --shard-index 1
diff --git a/pkgs/test/pubspec.yaml b/pkgs/test/pubspec.yaml
index 9ae588e..548edca 100644
--- a/pkgs/test/pubspec.yaml
+++ b/pkgs/test/pubspec.yaml
@@ -1,15 +1,15 @@
 name: test
-version: 1.13.0
+version: 1.14.0
 description: A full featured library for writing and running Dart tests.
 homepage: https://github.com/dart-lang/test/blob/master/pkgs/test
 
 environment:
-  sdk: '>=2.4.0 <3.0.0'
+  sdk: '>=2.7.0 <3.0.0'
 
 dependencies:
-  analyzer: ">=0.36.0 <0.40.0"
+  analyzer: '>=0.36.0 <0.40.0'
   async: ^2.0.0
-  boolean_selector: ">=1.0.0 <3.0.0"
+  boolean_selector: '>=1.0.0 <3.0.0'
   coverage: ^0.13.4
   http: ^0.12.0
   http_multi_server: ^2.0.0
@@ -17,7 +17,7 @@
   js: ^0.6.0
   multi_server_socket: ^1.0.0
   node_preamble: ^1.3.0
-  package_resolver: ^1.0.0
+  package_config: ^1.9.0
   path: ^1.2.0
   pedantic: ^1.1.0
   pool: ^1.3.0
@@ -27,14 +27,14 @@
   shelf_web_socket: ^0.2.0
   source_span: ^1.4.0
   stack_trace: ^1.9.0
-  stream_channel: ">=1.7.0 <3.0.0"
+  stream_channel: '>=1.7.0 <3.0.0'
   typed_data: ^1.0.0
   web_socket_channel: ^1.0.0
   webkit_inspection_protocol: ^0.5.0
   yaml: ^2.0.0
   # Use an exact version until the test_api and test_core package are stable.
   test_api: 0.2.15
-  test_core: 0.3.1
+  test_core: 0.3.2
 
 dev_dependencies:
   fake_async: ^1.0.0
diff --git a/pkgs/test/test/io.dart b/pkgs/test/test/io.dart
index 0d92192..abbb690 100644
--- a/pkgs/test/test/io.dart
+++ b/pkgs/test/test/io.dart
@@ -4,8 +4,8 @@
 
 import 'dart:async';
 import 'dart:io';
+import 'dart:isolate';
 
-import 'package:package_resolver/package_resolver.dart';
 import 'package:path/path.dart' as p;
 import 'package:test_descriptor/test_descriptor.dart' as d;
 import 'package:test_process/test_process.dart';
@@ -13,7 +13,9 @@
 import 'package:test/test.dart';
 
 /// The path to the root directory of the `test` package.
-final Future<String> packageDir = PackageResolver.current.packagePath('test');
+final Future<String> packageDir =
+    Isolate.resolvePackageUri(Uri(scheme: 'package', path: 'test/'))
+        .then((uri) => p.dirname(uri.path));
 
 /// The path to the `pub` executable in the current Dart SDK.
 final _pubPath = p.absolute(p.join(p.dirname(Platform.resolvedExecutable),
@@ -95,7 +97,7 @@
   var allArgs = <String>[
     ...Platform.executableArguments.where((arg) =>
         !arg.startsWith('--package-root=') && !arg.startsWith('--packages=')),
-    await PackageResolver.current.processArgument,
+    '--packages=${await Isolate.packageConfig}',
     ...args
   ];
 
diff --git a/pkgs/test/test/runner/precompiled_test.dart b/pkgs/test/test/runner/precompiled_test.dart
index 6401195..b324e2d 100644
--- a/pkgs/test/test/runner/precompiled_test.dart
+++ b/pkgs/test/test/runner/precompiled_test.dart
@@ -5,15 +5,17 @@
 @TestOn('vm')
 import 'dart:async';
 import 'dart:io';
+import 'dart:isolate';
 
 import 'package:node_preamble/preamble.dart' as preamble;
-import 'package:package_resolver/package_resolver.dart';
+import 'package:package_config/package_config.dart';
 import 'package:path/path.dart' as p;
 import 'package:test_descriptor/test_descriptor.dart' as d;
 import 'package:test_process/test_process.dart';
 
 import 'package:test_core/src/util/io.dart';
 import 'package:test/test.dart';
+import 'package:test/src/util/package_map.dart';
 
 import '../io.dart';
 
@@ -50,7 +52,7 @@
       var dart2js = await TestProcess.start(
           p.join(sdkDir, 'bin', 'dart2js'),
           [
-            await PackageResolver.current.processArgument,
+            '--packages=${await Isolate.packageConfig}',
             'to_precompile.dart',
             '--out=precompiled/test.dart.browser_test.dart.js'
           ],
@@ -107,7 +109,7 @@
       var dart2js = await TestProcess.start(
           p.join(sdkDir, 'bin', 'dart2js'),
           [
-            await PackageResolver.current.processArgument,
+            '--packages=${await Isolate.packageConfig}',
             p.join('test', 'test.dart'),
             '--out=$jsPath',
           ],
@@ -232,10 +234,18 @@
 }
 
 Future<Null> _writePackagesFile() async {
-  var currentPackages = await PackageResolver.current.packageConfigMap;
-  var packagesFileContent = StringBuffer();
-  currentPackages.forEach((package, location) {
-    packagesFileContent.writeln('$package:$location');
-  });
-  await d.file('.packages', packagesFileContent.toString()).create();
+  var config = await findPackageConfig(Directory.current);
+  // TODO: remove try/catch when this issue is resolved:
+  // https://github.com/dart-lang/package_config/issues/66
+  try {
+    await savePackageConfig(config, Directory(d.sandbox));
+  } catch (_) {
+    // If it fails, just write a `.packages` file.
+    var packageMap = config.toPackageMap();
+    var packagesFileContent = StringBuffer();
+    packageMap.forEach((package, location) {
+      packagesFileContent.writeln('$package:$location');
+    });
+    await d.file('.packages', '$packagesFileContent').create();
+  }
 }
diff --git a/pkgs/test_api/mono_pkg.yaml b/pkgs/test_api/mono_pkg.yaml
index 5f08191..4a2bb76 100644
--- a/pkgs/test_api/mono_pkg.yaml
+++ b/pkgs/test_api/mono_pkg.yaml
@@ -1,13 +1,13 @@
 stages:
-    - analyze_and_format:
-      - group:
-        - dartfmt: sdk
-        - dartanalyzer: --fatal-infos --fatal-warnings .
-        dart: dev
-      - group:
-        - dartanalyzer: --fatal-warnings .
-        dart: 2.4.0
-    - unit_test:
-      - group:
-        - test: --preset travis
-        dart: dev
+  - analyze_and_format:
+    - group:
+      - dartfmt: sdk
+      - dartanalyzer: --fatal-infos --fatal-warnings .
+      dart: dev
+    - group:
+      - dartanalyzer: --fatal-warnings .
+      dart: 2.7.0
+  - unit_test:
+    - group:
+      - test: --preset travis
+      dart: dev
diff --git a/pkgs/test_api/pubspec.yaml b/pkgs/test_api/pubspec.yaml
index 8b34a9c..bd724e7 100644
--- a/pkgs/test_api/pubspec.yaml
+++ b/pkgs/test_api/pubspec.yaml
@@ -4,7 +4,7 @@
 homepage: https://github.com/dart-lang/test/blob/master/pkgs/test_api
 
 environment:
-  sdk: ">=2.4.0 <3.0.0"
+  sdk: ">=2.7.0 <3.0.0"
 
 dependencies:
   async: ^2.0.0
diff --git a/pkgs/test_core/CHANGELOG.md b/pkgs/test_core/CHANGELOG.md
index 8bff6c2..dcb572a 100644
--- a/pkgs/test_core/CHANGELOG.md
+++ b/pkgs/test_core/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.3.2
+
+* Drop the `package_resolver` dependency.
+
 ## 0.3.1
 
 * Support latest `package:vm_service`.
diff --git a/pkgs/test_core/lib/src/runner/compiler_pool.dart b/pkgs/test_core/lib/src/runner/compiler_pool.dart
index 7da937a..7556ab5 100644
--- a/pkgs/test_core/lib/src/runner/compiler_pool.dart
+++ b/pkgs/test_core/lib/src/runner/compiler_pool.dart
@@ -5,9 +5,9 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
+import 'dart:isolate';
 
 import 'package:async/async.dart';
-import 'package:package_resolver/package_resolver.dart';
 import 'package:path/path.dart' as p;
 import 'package:pool/pool.dart';
 
@@ -67,7 +67,7 @@
           '--enable-asserts',
           wrapperPath,
           '--out=$jsPath',
-          await PackageResolver.current.processArgument,
+          '--packages=${await Isolate.packageConfig}',
           ..._extraArgs,
           ...suiteConfig.dart2jsArgs
         ];
diff --git a/pkgs/test_core/lib/src/util/stack_trace_mapper.dart b/pkgs/test_core/lib/src/util/stack_trace_mapper.dart
index 2d2b0bf..4f4a821 100644
--- a/pkgs/test_core/lib/src/util/stack_trace_mapper.dart
+++ b/pkgs/test_core/lib/src/util/stack_trace_mapper.dart
@@ -2,7 +2,6 @@
 // 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 'package:package_resolver/package_resolver.dart';
 import 'package:source_map_stack_trace/source_map_stack_trace.dart' as mapper;
 import 'package:source_maps/source_maps.dart';
 import 'package:test_api/src/util/stack_trace_mapper.dart'; // ignore: implementation_imports
@@ -14,8 +13,8 @@
   /// This is initialized lazily in `mapStackTrace()`.
   Mapping _mapping;
 
-  /// The package resolution information passed to dart2js.
-  final SyncPackageResolver _packageResolver;
+  /// The same package resolution information as was passed to dart2js.
+  final Map<String, Uri> _packageMap;
 
   /// The URL of the SDK root from which dart2js loaded its sources.
   final Uri _sdkRoot;
@@ -27,9 +26,9 @@
   final Uri _mapUrl;
 
   JSStackTraceMapper(this._mapContents,
-      {Uri mapUrl, SyncPackageResolver packageResolver, Uri sdkRoot})
+      {Uri mapUrl, Map<String, Uri> packageMap, Uri sdkRoot})
       : _mapUrl = mapUrl,
-        _packageResolver = packageResolver,
+        _packageMap = packageMap,
         _sdkRoot = sdkRoot;
 
   /// Converts [trace] into a Dart stack trace.
@@ -37,7 +36,7 @@
   StackTrace mapStackTrace(StackTrace trace) {
     _mapping ??= parseExtended(_mapContents, mapUrl: _mapUrl);
     return mapper.mapStackTrace(_mapping, trace,
-        packageResolver: _packageResolver, sdkRoot: _sdkRoot);
+        packageMap: _packageMap, sdkRoot: _sdkRoot);
   }
 
   /// Returns a Map representation which is suitable for JSON serialization.
@@ -46,9 +45,7 @@
     return {
       'mapContents': _mapContents,
       'sdkRoot': _sdkRoot?.toString(),
-      'packageConfigMap':
-          _serializePackageConfigMap(_packageResolver.packageConfigMap),
-      'packageRoot': _packageResolver.packageRoot?.toString(),
+      'packageConfigMap': _serializePackageConfigMap(_packageMap),
       'mapUrl': _mapUrl?.toString(),
     };
   }
@@ -57,15 +54,12 @@
   /// representation.
   static StackTraceMapper deserialize(Map serialized) {
     if (serialized == null) return null;
-    var packageRoot = serialized['packageRoot'] as String ?? '';
+    var deserialized = _deserializePackageConfigMap(
+        (serialized['packageConfigMap'] as Map).cast<String, String>());
+
     return JSStackTraceMapper(serialized['mapContents'] as String,
         sdkRoot: Uri.parse(serialized['sdkRoot'] as String),
-        packageResolver: packageRoot.isNotEmpty
-            ? SyncPackageResolver.root(
-                Uri.parse(serialized['packageRoot'] as String))
-            : SyncPackageResolver.config(_deserializePackageConfigMap(
-                (serialized['packageConfigMap'] as Map)
-                    .cast<String, String>())),
+        packageMap: deserialized,
         mapUrl: Uri.parse(serialized['mapUrl'] as String));
   }
 
diff --git a/pkgs/test_core/mono_pkg.yaml b/pkgs/test_core/mono_pkg.yaml
index 203675b..f6da98d 100644
--- a/pkgs/test_core/mono_pkg.yaml
+++ b/pkgs/test_core/mono_pkg.yaml
@@ -6,4 +6,4 @@
       dart: dev
     - group:
       - dartanalyzer: --fatal-warnings .
-      dart: 2.4.0
+      dart: 2.7.0
diff --git a/pkgs/test_core/pubspec.yaml b/pkgs/test_core/pubspec.yaml
index f98905f..6646ea8 100644
--- a/pkgs/test_core/pubspec.yaml
+++ b/pkgs/test_core/pubspec.yaml
@@ -1,10 +1,10 @@
 name: test_core
-version: 0.3.1
+version: 0.3.2
 description: A basic library for writing tests and running them on the VM.
 homepage: https://github.com/dart-lang/test/blob/master/pkgs/test_core
 
 environment:
-  sdk: ">=2.4.0 <3.0.0"
+  sdk: ">=2.7.0 <3.0.0"
 
 dependencies:
   analyzer: ">=0.36.0 <0.40.0"
@@ -16,11 +16,10 @@
   glob: ^1.0.0
   io: ^0.3.0
   meta: ^1.1.5
-  package_resolver: ^1.0.0
   path: ^1.2.0
   pedantic: ^1.0.0
   pool: ^1.3.0
-  source_map_stack_trace: ^1.1.4
+  source_map_stack_trace: ^2.0.0
   source_maps: ^0.10.2
   source_span: ^1.4.0
   stack_trace: ^1.9.0