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

Unified Diff: pkg/analyzer/test/src/summary/pub_summary_test.dart

Issue 2227393002: Add support for package cycles linking, more tests. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Add TODOs Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/lib/src/summary/pub_summary.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/test/src/summary/pub_summary_test.dart
diff --git a/pkg/analyzer/test/src/summary/pub_summary_test.dart b/pkg/analyzer/test/src/summary/pub_summary_test.dart
index 1363fa325376fe430365d778e17128ec3b4fe80b..42432b92a012e2258717f21fcff84f86f6c87a36 100644
--- a/pkg/analyzer/test/src/summary/pub_summary_test.dart
+++ b/pkg/analyzer/test/src/summary/pub_summary_test.dart
@@ -35,7 +35,286 @@ class PubSummaryManagerTest extends AbstractContextTest {
manager = new PubSummaryManager(resourceProvider, '_.temp');
}
- test_getLinkedBundles_noCycles() async {
+ test_getLinkedBundles_hasCycle() async {
+ resourceProvider.newFile(
+ '$CACHE/aaa/lib/a.dart',
+ '''
+import 'package:bbb/b.dart';
+class A {}
+int a1;
+B a2;
+''');
+ resourceProvider.newFile(
+ '$CACHE/bbb/lib/b.dart',
+ '''
+import 'package:ccc/c.dart';
+class B {}
+C b;
+''');
+ resourceProvider.newFile(
+ '$CACHE/ccc/lib/c.dart',
+ '''
+import 'package:aaa/a.dart';
+import 'package:ddd/d.dart';
+class C {}
+A c1;
+D c2;
+''');
+ resourceProvider.newFile(
+ '$CACHE/ddd/lib/d.dart',
+ '''
+class D {}
+String d;
+''');
+
+ // Configure packages resolution.
+ Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
+ Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
+ Folder libFolderC = resourceProvider.newFolder('$CACHE/ccc/lib');
+ Folder libFolderD = resourceProvider.newFolder('$CACHE/ddd/lib');
+ context.sourceFactory = new SourceFactory(<UriResolver>[
+ sdkResolver,
+ resourceResolver,
+ new PackageMapUriResolver(resourceProvider, {
+ 'aaa': [libFolderA],
+ 'bbb': [libFolderB],
+ 'ccc': [libFolderC],
+ 'ddd': [libFolderD],
+ })
+ ]);
+
+ // Ensure unlinked bundles.
+ manager.getUnlinkedBundles(context);
+ await manager.onUnlinkedComplete;
+
+ // Now we should be able to get linked bundles.
+ PackageBundle sdkBundle = getSdkBundle(sdk);
+ List<LinkedPubPackage> linkedPackages =
+ manager.getLinkedBundles(context, sdkBundle);
+ expect(linkedPackages, hasLength(4));
+
+ // package:aaa
+ {
+ LinkedPubPackage linkedPackage = linkedPackages
+ .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
+ expect(linkedPackage.linked.linkedLibraryUris, ['package:aaa/a.dart']);
+ _assertHasLinkedVariable(linkedPackage, 'a1', 'int', 'dart:core');
+ _assertHasLinkedVariable(linkedPackage, 'a2', 'B', 'package:bbb/b.dart');
+ }
+
+ // package:bbb
+ {
+ LinkedPubPackage linkedPackage = linkedPackages
+ .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
+ expect(linkedPackage.linked.linkedLibraryUris, ['package:bbb/b.dart']);
+ _assertHasLinkedVariable(linkedPackage, 'b', 'C', 'package:ccc/c.dart');
+ }
+
+ // package:ccc
+ {
+ LinkedPubPackage linkedPackage = linkedPackages
+ .singleWhere((linkedPackage) => linkedPackage.package.name == 'ccc');
+ expect(linkedPackage.linked.linkedLibraryUris, ['package:ccc/c.dart']);
+ _assertHasLinkedVariable(linkedPackage, 'c1', 'A', 'package:aaa/a.dart');
+ _assertHasLinkedVariable(linkedPackage, 'c2', 'D', 'package:ddd/d.dart');
+ }
+
+ // package:ddd
+ {
+ LinkedPubPackage linkedPackage = linkedPackages
+ .singleWhere((linkedPackage) => linkedPackage.package.name == 'ddd');
+ expect(linkedPackage.linked.linkedLibraryUris, ['package:ddd/d.dart']);
+ _assertHasLinkedVariable(linkedPackage, 'd', 'String', 'dart:core');
+ }
+ }
+
+ test_getLinkedBundles_missingBundle() async {
+ resourceProvider.newFile(
+ '$CACHE/aaa/lib/a.dart',
+ '''
+int a;
+''');
+ resourceProvider.newFile(
+ '$CACHE/bbb/lib/b.dart',
+ '''
+import 'package:ccc/c.dart';
+C b;
+''');
+
+ // Configure packages resolution.
+ Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
+ Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
+ context.sourceFactory = new SourceFactory(<UriResolver>[
+ sdkResolver,
+ resourceResolver,
+ new PackageMapUriResolver(resourceProvider, {
+ 'aaa': [libFolderA],
+ 'bbb': [libFolderB],
+ })
+ ]);
+
+ // Ensure unlinked bundles.
+ manager.getUnlinkedBundles(context);
+ await manager.onUnlinkedComplete;
+
+ // Try to link.
+ // Only 'aaa' can be linked, because 'bbb' references not available 'ccc'.
+ PackageBundle sdkBundle = getSdkBundle(sdk);
+ List<LinkedPubPackage> linkedPackages =
+ manager.getLinkedBundles(context, sdkBundle);
+ expect(linkedPackages, hasLength(1));
+
+ // package:aaa
+ {
+ LinkedPubPackage linkedPackage = linkedPackages
+ .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
+ _assertHasLinkedVariable(linkedPackage, 'a', 'int', 'dart:core');
+ }
+ }
+
+ test_getLinkedBundles_missingBundle_chained() async {
+ resourceProvider.newFile(
+ '$CACHE/aaa/lib/a.dart',
+ '''
+import 'package:bbb/b.dart';
+int a;
+''');
+ resourceProvider.newFile(
+ '$CACHE/bbb/lib/b.dart',
+ '''
+import 'package:ccc/c.dart';
+int b;
+''');
+
+ // Configure packages resolution.
+ Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
+ Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
+ context.sourceFactory = new SourceFactory(<UriResolver>[
+ sdkResolver,
+ resourceResolver,
+ new PackageMapUriResolver(resourceProvider, {
+ 'aaa': [libFolderA],
+ 'bbb': [libFolderB],
+ })
+ ]);
+
+ // Ensure unlinked bundles.
+ manager.getUnlinkedBundles(context);
+ await manager.onUnlinkedComplete;
+
+ // Try to link.
+ // No linked libraries, because 'aaa' needs 'bbb', and 'bbb' needs 'ccc'.
+ // But 'ccc' is not available, so the whole chain cannot be linked.
+ PackageBundle sdkBundle = getSdkBundle(sdk);
+ List<LinkedPubPackage> linkedPackages =
+ manager.getLinkedBundles(context, sdkBundle);
+ expect(linkedPackages, isEmpty);
+ }
+
+ test_getLinkedBundles_missingLibrary() async {
+ resourceProvider.newFile(
+ '$CACHE/aaa/lib/a.dart',
+ '''
+import 'package:bbb/b2.dart';
+int a;
+''');
+ resourceProvider.newFile(
+ '$CACHE/bbb/lib/b.dart',
+ '''
+class B {}
+int b = 42;
+''');
+
+ // Configure packages resolution.
+ Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
+ Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
+ context.sourceFactory = new SourceFactory(<UriResolver>[
+ sdkResolver,
+ resourceResolver,
+ new PackageMapUriResolver(resourceProvider, {
+ 'aaa': [libFolderA],
+ 'bbb': [libFolderB],
+ })
+ ]);
+
+ // Ensure unlinked bundles.
+ manager.getUnlinkedBundles(context);
+ await manager.onUnlinkedComplete;
+
+ // Try to link.
+ // Only 'bbb', because 'aaa' references 'package:bbb/b2.dart', which does
+ // not exist in the bundle 'bbb'.
+ PackageBundle sdkBundle = getSdkBundle(sdk);
+ List<LinkedPubPackage> linkedPackages =
+ manager.getLinkedBundles(context, sdkBundle);
+ expect(linkedPackages, hasLength(1));
+
+ // package:bbb
+ {
+ LinkedPubPackage linkedPackage = linkedPackages
+ .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
+ _assertHasLinkedVariable(linkedPackage, 'b', 'int', 'dart:core');
+ }
+ }
+
+ test_getLinkedBundles_missingLibrary_hasCycle() async {
+ resourceProvider.newFile(
+ '$CACHE/aaa/lib/a.dart',
+ '''
+import 'package:bbb/b.dart';
+int a;
+''');
+ resourceProvider.newFile(
+ '$CACHE/bbb/lib/b.dart',
+ '''
+import 'package:aaa/a.dart';
+import 'package:ccc/c2.dart';
+class B {}
+int b;
+''');
+ resourceProvider.newFile(
+ '$CACHE/ccc/lib/c.dart',
+ '''
+class C {}
+int c;
+''');
+
+ // Configure packages resolution.
+ Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
+ Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
+ Folder libFolderC = resourceProvider.newFolder('$CACHE/ccc/lib');
+ context.sourceFactory = new SourceFactory(<UriResolver>[
+ sdkResolver,
+ resourceResolver,
+ new PackageMapUriResolver(resourceProvider, {
+ 'aaa': [libFolderA],
+ 'bbb': [libFolderB],
+ 'ccc': [libFolderC],
+ })
+ ]);
+
+ // Ensure unlinked bundles.
+ manager.getUnlinkedBundles(context);
+ await manager.onUnlinkedComplete;
+
+ // Try to link.
+ // Only 'ccc' is linked.
+ // The 'aaa' + 'bbb' cycle cannot be linked because 'bbb' references
+ // 'package:ccc/c2.dart', which does not exist in the bundle 'ccc'.
+ PackageBundle sdkBundle = getSdkBundle(sdk);
+ List<LinkedPubPackage> linkedPackages =
+ manager.getLinkedBundles(context, sdkBundle);
+ expect(linkedPackages, hasLength(1));
+
+ // package:ccc
+ {
+ LinkedPubPackage linkedPackage = linkedPackages
+ .singleWhere((linkedPackage) => linkedPackage.package.name == 'ccc');
+ _assertHasLinkedVariable(linkedPackage, 'c', 'int', 'dart:core');
+ }
+ }
+
+ test_getLinkedBundles_noCycle() async {
resourceProvider.newFile(
'$CACHE/aaa/lib/a.dart',
'''
@@ -75,47 +354,97 @@ A b;
{
LinkedPubPackage linkedPackage = linkedPackages
.singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
- PackageBundle unlinked = linkedPackage.unlinked;
- PackageBundle linked = linkedPackage.linked;
- expect(unlinked, isNotNull);
- expect(linked, isNotNull);
- expect(unlinked.unlinkedUnitUris, ['package:aaa/a.dart']);
- expect(linked.linkedLibraryUris, ['package:aaa/a.dart']);
- // Prepare linked `package:aaa/a.dart`.
- UnlinkedUnit unlinkedUnitA = unlinked.unlinkedUnits[0];
- LinkedLibrary linkedLibraryA = linked.linkedLibraries[0];
- LinkedUnit linkedUnitA = linkedLibraryA.units[0];
- // int a;
- {
- UnlinkedVariable a = unlinkedUnitA.variables[0];
- expect(a.name, 'a');
- _assertLinkedNameReference(unlinkedUnitA, linkedLibraryA, linkedUnitA,
- a.type.reference, 'int', 'dart:core');
- }
+ _assertHasLinkedVariable(linkedPackage, 'a', 'int', 'dart:core');
}
// package:bbb
{
LinkedPubPackage linkedPackage = linkedPackages
.singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
- PackageBundle unlinked = linkedPackage.unlinked;
- PackageBundle linked = linkedPackage.linked;
- expect(unlinked, isNotNull);
- expect(linked, isNotNull);
- expect(unlinked.unlinkedUnitUris, ['package:bbb/b.dart']);
- expect(linked.linkedLibraryUris, ['package:bbb/b.dart']);
- // Prepare linked `package:bbb/b.dart`.
- UnlinkedUnit unlinkedUnit = unlinked.unlinkedUnits[0];
- LinkedLibrary linkedLibrary = linked.linkedLibraries[0];
- LinkedUnit linkedUnit = linkedLibrary.units[0];
- // A b;
- {
- UnlinkedVariable b = unlinkedUnit.variables[0];
- expect(b.name, 'b');
- _assertLinkedNameReference(unlinkedUnit, linkedLibrary, linkedUnit,
- b.type.reference, 'A', 'package:aaa/a.dart');
- }
+ _assertHasLinkedVariable(linkedPackage, 'b', 'A', 'package:aaa/a.dart');
+ }
+ }
+
+ test_getLinkedBundles_noCycle_relativeUri() async {
+ resourceProvider.newFile(
+ '$CACHE/aaa/lib/a.dart',
+ '''
+import 'src/a2.dart';
+A a;
+''');
+ resourceProvider.newFile(
+ '$CACHE/aaa/lib/src/a2.dart',
+ '''
+class A {}
+''');
+
+ // Configure packages resolution.
+ Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
+ context.sourceFactory = new SourceFactory(<UriResolver>[
+ sdkResolver,
+ resourceResolver,
+ new PackageMapUriResolver(resourceProvider, {
+ 'aaa': [libFolderA],
+ })
+ ]);
+
+ // Ensure unlinked bundles.
+ manager.getUnlinkedBundles(context);
+ await manager.onUnlinkedComplete;
+
+ // Link.
+ PackageBundle sdkBundle = getSdkBundle(sdk);
+ List<LinkedPubPackage> linkedPackages =
+ manager.getLinkedBundles(context, sdkBundle);
+ expect(linkedPackages, hasLength(1));
+
+ // package:aaa
+ {
+ LinkedPubPackage linkedPackage = linkedPackages
+ .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
+ _assertHasLinkedVariable(linkedPackage, 'a', 'A', 'src/a2.dart');
+ }
+ }
+
+ test_getLinkedBundles_wrongScheme() async {
+ resourceProvider.newFile(
+ '$CACHE/aaa/lib/a.dart',
+ '''
+import 'xxx:yyy/zzz.dart';
+Z a;
+''');
+
+ // Configure packages resolution.
+ Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
+ context.sourceFactory = new SourceFactory(<UriResolver>[
+ sdkResolver,
+ resourceResolver,
+ new PackageMapUriResolver(resourceProvider, {
+ 'aaa': [libFolderA],
+ })
+ ]);
+
+ // Ensure unlinked bundles.
+ manager.getUnlinkedBundles(context);
+ await manager.onUnlinkedComplete;
+
+ // Try to link.
+ // The package 'aaa' cannot be linked because it uses not 'dart' or
+ // 'package' import URI scheme.
+ PackageBundle sdkBundle = getSdkBundle(sdk);
+ List<LinkedPubPackage> linkedPackages =
+ manager.getLinkedBundles(context, sdkBundle);
+ expect(linkedPackages, hasLength(0));
+ }
+
+ test_getPackageName() {
+ String getPackageName(String uriStr) {
+ return PubSummaryManager.getPackageName(uriStr);
}
+ expect(getPackageName('package:foo/bar.dart'), 'foo');
+ expect(getPackageName('package:foo/bar/baz.dart'), 'foo');
+ expect(getPackageName('wrong:foo/bar.dart'), isNull);
+ expect(getPackageName('package:foo'), isNull);
}
test_getUnlinkedBundles() async {
@@ -224,18 +553,40 @@ class B {}
expect(folder.getChildAssumingFile(fileName).exists, isTrue);
}
- void _assertLinkedNameReference(
- UnlinkedUnit unlinkedUnit,
- LinkedLibrary linkedLibrary,
- LinkedUnit linkedUnit,
- int typeNameReference,
- String expectedName,
- String expectedDependencyUri) {
- expect(unlinkedUnit.references[typeNameReference].name, expectedName);
- int typeNameDependency =
- linkedUnit.references[typeNameReference].dependency;
- expect(linkedLibrary.dependencies[typeNameDependency].uri,
- expectedDependencyUri);
+ void _assertHasLinkedVariable(
+ LinkedPubPackage linkedPackage,
+ String variableName,
+ String expectedTypeName,
+ String expectedTypeNameUri) {
+ PackageBundle unlinked = linkedPackage.unlinked;
+ PackageBundle linked = linkedPackage.linked;
+ expect(unlinked, isNotNull);
+ expect(linked, isNotNull);
+ for (int i = 0; i < unlinked.unlinkedUnitUris.length; i++) {
+ String unlinkedUnitUri = unlinked.unlinkedUnitUris[i];
+ UnlinkedUnit unlinkedUnit = unlinked.unlinkedUnits[i];
+ for (UnlinkedVariable v in unlinkedUnit.variables) {
+ if (v.name == variableName) {
+ int typeNameReference = v.type.reference;
+ expect(unlinkedUnit.references[typeNameReference].name,
+ expectedTypeName);
+ for (int j = 0; j < linked.linkedLibraryUris.length; j++) {
+ String linkedLibraryUri = linked.linkedLibraryUris[j];
+ if (linkedLibraryUri == unlinkedUnitUri) {
+ LinkedLibrary linkedLibrary = linked.linkedLibraries[j];
+ LinkedUnit linkedUnit = linkedLibrary.units.single;
+ int typeNameDependency =
+ linkedUnit.references[typeNameReference].dependency;
+ expect(linkedLibrary.dependencies[typeNameDependency].uri,
+ expectedTypeNameUri);
+ return;
+ }
+ }
+ fail('Cannot find linked unit for $variableName in $linkedPackage');
+ }
+ }
+ }
+ fail('Cannot find variable $variableName in $linkedPackage');
}
/**
« no previous file with comments | « pkg/analyzer/lib/src/summary/pub_summary.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698