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

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

Issue 2226973005: Basic linking in PubSummaryManager. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: 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
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];
+ }
}

Powered by Google App Engine
This is Rietveld 408576698