Fix crash on missing libraries.json (#1472)
* Fix crash on missing libraries.json
* Addressed CR comments
diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md
index 8941f9e..843f73a 100644
--- a/dwds/CHANGELOG.md
+++ b/dwds/CHANGELOG.md
@@ -7,6 +7,7 @@
- Show an alert in the Dart Debug Extension for a multi-app scenario.
- Fix a bug where `dartEmitDebugEvents` was set as a `String` instead of `bool`
in the injected client.
+- Emit a warning instead of crashing on missing `libraries.json`.
**Breaking changes:**
diff --git a/dwds/lib/src/utilities/dart_uri.dart b/dwds/lib/src/utilities/dart_uri.dart
index b9a3ab3..ecc839c 100644
--- a/dwds/lib/src/utilities/dart_uri.dart
+++ b/dwds/lib/src/utilities/dart_uri.dart
@@ -160,6 +160,7 @@
librariesPath ??=
p.toUri(p.join(_sdkDir.toFilePath(), 'lib', 'libraries.json'));
+
var packagesUri = p.toUri(p.join(currentDirectory, '.packages'));
clear();
@@ -169,6 +170,8 @@
/// Clear the uri resolution tables.
static void clear() {
+ _librariesSpec = null;
+ _packageConfig = null;
_resolvedUriToUri.clear();
_uriToResolvedUri.clear();
}
@@ -198,8 +201,10 @@
var json = File.fromUri(uri).readAsStringSync();
_librariesSpec =
LibrariesSpecification.parse(uri, json).specificationFor('dartdevc');
- } on LibrariesSpecificationException catch (e, s) {
- _logger.warning('Cannot read libraries spec: $uri', e, s);
+ } on LibrariesSpecificationException catch (e) {
+ _logger.warning('Cannot parse libraries spec: $uri', e);
+ } on FileSystemException catch (e) {
+ _logger.warning('Cannot read libraries spec: $uri', e);
}
}
diff --git a/dwds/test/dart_uri_test.dart b/dwds/test/dart_uri_test.dart
index 1dbd2a5..f5209bf 100644
--- a/dwds/test/dart_uri_test.dart
+++ b/dwds/test/dart_uri_test.dart
@@ -13,6 +13,7 @@
import 'package:test/test.dart';
import 'fixtures/fakes.dart';
+import 'fixtures/logging.dart';
class TestStrategy extends FakeStrategy {
@override
@@ -109,5 +110,58 @@
expect(unresolved, 'dart:io');
});
});
+
+ group('initialized with other SDK directory with no libraries spec', () {
+ Directory outputDir;
+ var logs = <String>[];
+
+ void logWriter(level, message,
+ {String error, String loggerName, String stackTrace}) {
+ var errorMessage = error == null ? '' : ':\n$error';
+ var stackMessage = stackTrace == null ? '' : ':\n$stackTrace';
+ logs.add('[$level] $loggerName: $message'
+ '$errorMessage'
+ '$stackMessage');
+ }
+
+ setUpAll(() async {
+ configureLogWriter(customLogWriter: logWriter);
+ var systemTempDir = Directory.systemTemp;
+ outputDir = systemTempDir.createTempSync('foo bar');
+
+ var fakeSdkDir = outputDir.path;
+ var fakeLibrariesDir = p.join(fakeSdkDir, 'lib');
+ var fakeLibrariesPath = p.join(fakeLibrariesDir, 'libraries.json');
+
+ await DartUri.initialize(
+ sdkDir: Uri.file(fakeSdkDir),
+ librariesPath: Uri.file(fakeLibrariesPath));
+ await DartUri.recordAbsoluteUris(['dart:io', 'dart:html']);
+
+ expect(
+ logs,
+ containsAll([
+ contains('[WARNING] DartUri: Cannot read libraries spec:'),
+ contains('[WARNING] DartUri: Unresolved uri: dart:io'),
+ contains('[WARNING] DartUri: Unresolved uri: dart:html'),
+ ]));
+ });
+
+ tearDownAll(() async {
+ DartUri.clear();
+ await outputDir?.delete(recursive: true);
+ });
+
+ test('cannot resolve uris', () {
+ var resolved = DartUri.toResolvedUri('dart:io');
+ expect(resolved, null);
+ });
+
+ test('cannot unresolve uris', () {
+ var unresolved =
+ DartUri.toPackageUri('org-dartlang-sdk:///sdk/lib/io/io.dart');
+ expect(unresolved, null);
+ });
+ });
});
}