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 3040515731bd3a662d52b2dddaae60d26110f702..acc22cce95dc8fd6ed09f2f3c41f2797105ecdd4 100644 |
--- a/pkg/analyzer/test/src/summary/pub_summary_test.dart |
+++ b/pkg/analyzer/test/src/summary/pub_summary_test.dart |
@@ -2,11 +2,14 @@ |
// 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:analyzer/dart/element/element.dart'; |
import 'package:analyzer/file_system/file_system.dart'; |
import 'package:analyzer/source/package_map_resolver.dart'; |
+import 'package:analyzer/src/generated/sdk.dart'; |
import 'package:analyzer/src/generated/source.dart'; |
import 'package:analyzer/src/summary/idl.dart'; |
import 'package:analyzer/src/summary/pub_summary.dart'; |
+import 'package:analyzer/src/summary/summarize_elements.dart'; |
import 'package:path/path.dart' as pathos; |
import 'package:unittest/unittest.dart' hide ERROR; |
@@ -21,6 +24,10 @@ main() { |
@reflectiveTest |
class PubSummaryManagerTest extends AbstractContextTest { |
+ static const String CACHE = '/home/.pub-cache/hosted/pub.dartlang.org'; |
+ |
+ static Map<DartSdk, PackageBundle> sdkBundleMap = <DartSdk, PackageBundle>{}; |
+ |
PubSummaryManager manager; |
void setUp() { |
@@ -28,28 +35,110 @@ class PubSummaryManagerTest extends AbstractContextTest { |
manager = new PubSummaryManager(resourceProvider, '_.temp'); |
} |
+ test_getLinkedBundles_noCycles() async { |
+ resourceProvider.newFile( |
+ '$CACHE/aaa/lib/a.dart', |
+ ''' |
+class A {} |
+int a; |
+'''); |
+ resourceProvider.newFile( |
+ '$CACHE/bbb/lib/b.dart', |
+ ''' |
+import 'package:aaa/a.dart'; |
+A 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; |
+ |
+ // Now we should be able to get linked bundles. |
+ PackageBundle sdkBundle = getSdkBundle(sdk); |
+ List<LinkedPubPackage> linkedPackages = |
+ manager.getLinkedBundles(context, sdkBundle); |
+ expect(linkedPackages, hasLength(2)); |
+ |
+ // package:aaa |
+ { |
+ 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'); |
+ } |
+ } |
+ |
+ // 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'); |
+ } |
+ } |
+ } |
+ |
test_getUnlinkedBundles() async { |
// Create package files. |
- String cachePath = '/home/.pub-cache/hosted/pub.dartlang.org'; |
resourceProvider.newFile( |
- '$cachePath/aaa/lib/a.dart', |
+ '$CACHE/aaa/lib/a.dart', |
''' |
class A {} |
'''); |
resourceProvider.newFile( |
- '$cachePath/aaa/lib/src/a2.dart', |
+ '$CACHE/aaa/lib/src/a2.dart', |
''' |
class A2 {} |
'''); |
resourceProvider.newFile( |
- '$cachePath/bbb/lib/b.dart', |
+ '$CACHE/bbb/lib/b.dart', |
''' |
class B {} |
'''); |
// Configure packages resolution. |
- Folder libFolderA = resourceProvider.newFolder('$cachePath/aaa/lib'); |
- Folder libFolderB = resourceProvider.newFolder('$cachePath/bbb/lib'); |
+ Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
+ Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
context.sourceFactory = new SourceFactory(<UriResolver>[ |
sdkResolver, |
resourceResolver, |
@@ -61,17 +150,19 @@ class B {} |
// No unlinked bundles yet. |
{ |
- Map<String, PackageBundle> bundles = manager.getUnlinkedBundles(context); |
+ Map<PubPackage, PackageBundle> bundles = |
+ manager.getUnlinkedBundles(context); |
expect(bundles, isEmpty); |
} |
// The requested unlinked bundles must be available after the wait. |
await manager.onUnlinkedComplete; |
{ |
- Map<String, PackageBundle> bundles = manager.getUnlinkedBundles(context); |
+ Map<PubPackage, PackageBundle> bundles = |
+ manager.getUnlinkedBundles(context); |
expect(bundles, hasLength(2)); |
{ |
- PackageBundle bundle = bundles['aaa']; |
+ PackageBundle bundle = _getBundleByPackageName(bundles, 'aaa'); |
expect(bundle.linkedLibraryUris, isEmpty); |
expect(bundle.unlinkedUnitUris, |
['package:aaa/a.dart', 'package:aaa/src/a2.dart']); |
@@ -80,7 +171,7 @@ class B {} |
expect(bundle.unlinkedUnits[1].classes.map((c) => c.name), ['A2']); |
} |
{ |
- PackageBundle bundle = bundles['bbb']; |
+ PackageBundle bundle = _getBundleByPackageName(bundles, 'bbb'); |
expect(bundle.linkedLibraryUris, isEmpty); |
expect(bundle.unlinkedUnitUris, ['package:bbb/b.dart']); |
expect(bundle.unlinkedUnits, hasLength(1)); |
@@ -98,7 +189,8 @@ class B {} |
test_getUnlinkedBundles_nullPackageMap() async { |
context.sourceFactory = |
new SourceFactory(<UriResolver>[sdkResolver, resourceResolver]); |
- Map<String, PackageBundle> bundles = manager.getUnlinkedBundles(context); |
+ Map<PubPackage, PackageBundle> bundles = |
+ manager.getUnlinkedBundles(context); |
expect(bundles, isEmpty); |
} |
@@ -127,4 +219,43 @@ class B {} |
pathos.windows, r'C:\Users\user\Sources\Dart\foo\lib\bar.dart'), |
isFalse); |
} |
+ |
+ 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); |
+ } |
+ |
+ /** |
+ * Compute element based summary bundle for the given [sdk]. |
+ */ |
+ static PackageBundle getSdkBundle(DartSdk sdk) { |
+ return sdkBundleMap.putIfAbsent(sdk, () { |
+ PackageBundleAssembler assembler = new PackageBundleAssembler(); |
+ for (SdkLibrary sdkLibrary in sdk.sdkLibraries) { |
+ String uriStr = sdkLibrary.shortName; |
+ Source source = sdk.mapDartUri(uriStr); |
+ LibraryElement libraryElement = |
+ sdk.context.computeLibraryElement(source); |
+ assembler.serializeLibraryElement(libraryElement); |
+ } |
+ List<int> bytes = assembler.assemble().toBuffer(); |
+ return new PackageBundle.fromBuffer(bytes); |
+ }); |
+ } |
+ |
+ static PackageBundle _getBundleByPackageName( |
+ Map<PubPackage, PackageBundle> bundles, String name) { |
+ PubPackage package = |
+ bundles.keys.singleWhere((package) => package.name == name); |
+ return bundles[package]; |
+ } |
} |