OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'package:analyzer/file_system/file_system.dart'; | 5 import 'package:analyzer/file_system/file_system.dart'; |
6 import 'package:analyzer/source/package_map_resolver.dart'; | 6 import 'package:analyzer/source/package_map_resolver.dart'; |
7 import 'package:analyzer/src/generated/source.dart'; | 7 import 'package:analyzer/src/generated/source.dart'; |
8 import 'package:analyzer/src/summary/format.dart'; | 8 import 'package:analyzer/src/summary/format.dart'; |
9 import 'package:analyzer/src/summary/idl.dart'; | 9 import 'package:analyzer/src/summary/idl.dart'; |
10 import 'package:analyzer/src/summary/pub_summary.dart'; | 10 import 'package:analyzer/src/summary/pub_summary.dart'; |
(...skipping 16 matching lines...) Expand all Loading... |
27 class PubSummaryManagerTest extends AbstractContextTest { | 27 class PubSummaryManagerTest extends AbstractContextTest { |
28 static const String CACHE = '/home/.pub-cache/hosted/pub.dartlang.org'; | 28 static const String CACHE = '/home/.pub-cache/hosted/pub.dartlang.org'; |
29 | 29 |
30 PubSummaryManager manager; | 30 PubSummaryManager manager; |
31 | 31 |
32 void setUp() { | 32 void setUp() { |
33 super.setUp(); | 33 super.setUp(); |
34 _createManager(); | 34 _createManager(); |
35 } | 35 } |
36 | 36 |
37 test_computeSdkExtension() async { | |
38 // Create package files. | |
39 resourceProvider.newFile( | |
40 '$CACHE/aaa/lib/a.dart', | |
41 ''' | |
42 class A {} | |
43 '''); | |
44 resourceProvider.newFile( | |
45 '$CACHE/aaa/sdk_ext/extA.dart', | |
46 ''' | |
47 library test.a; | |
48 import 'dart:async'; | |
49 part 'src/p1.dart'; | |
50 part 'src/p2.dart'; | |
51 class ExtA {} | |
52 int V0; | |
53 '''); | |
54 resourceProvider.newFile( | |
55 '$CACHE/aaa/sdk_ext/src/p1.dart', | |
56 ''' | |
57 part of test.a; | |
58 class ExtAA {} | |
59 double V1; | |
60 '''); | |
61 resourceProvider.newFile( | |
62 '$CACHE/aaa/sdk_ext/src/p2.dart', | |
63 ''' | |
64 part of test.a; | |
65 class ExtAB {} | |
66 Future V2; | |
67 '''); | |
68 resourceProvider.newFile( | |
69 '$CACHE/aaa/lib/_sdkext', | |
70 ''' | |
71 { | |
72 "dart:aaa.internal": "../sdk_ext/extA.dart" | |
73 } | |
74 '''); | |
75 resourceProvider.newFile( | |
76 '$CACHE/bbb/lib/b.dart', | |
77 ''' | |
78 class B {} | |
79 '''); | |
80 | |
81 // Configure packages resolution. | |
82 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); | |
83 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); | |
84 context.sourceFactory = new SourceFactory(<UriResolver>[ | |
85 sdkResolver, | |
86 resourceResolver, | |
87 new PackageMapUriResolver(resourceProvider, { | |
88 'aaa': [libFolderA], | |
89 'bbb': [libFolderB], | |
90 }) | |
91 ]); | |
92 | |
93 PackageBundle sdkBundle = sdk.getLinkedBundle(); | |
94 PackageBundle bundle = manager.computeSdkExtension(context, sdkBundle); | |
95 expect(bundle, isNotNull); | |
96 expect(bundle.linkedLibraryUris, ['dart:aaa.internal']); | |
97 expect(bundle.unlinkedUnitUris, [ | |
98 'dart:aaa.internal', | |
99 'dart:aaa.internal/src/p1.dart', | |
100 'dart:aaa.internal/src/p2.dart' | |
101 ]); | |
102 expect(bundle.unlinkedUnits, hasLength(3)); | |
103 expect(bundle.unlinkedUnits[0].classes.map((c) => c.name), ['ExtA']); | |
104 expect(bundle.unlinkedUnits[1].classes.map((c) => c.name), ['ExtAA']); | |
105 expect(bundle.unlinkedUnits[2].classes.map((c) => c.name), ['ExtAB']); | |
106 // The library is linked. | |
107 expect(bundle.linkedLibraries, hasLength(1)); | |
108 LinkedLibrary linkedLibrary = bundle.linkedLibraries[0]; | |
109 // V0 is linked | |
110 { | |
111 UnlinkedUnit unlinkedUnit = bundle.unlinkedUnits[0]; | |
112 LinkedUnit linkedUnit = linkedLibrary.units[0]; | |
113 expect(unlinkedUnit.variables, hasLength(1)); | |
114 UnlinkedVariable variable = unlinkedUnit.variables[0]; | |
115 expect(variable.name, 'V0'); | |
116 int typeRef = variable.type.reference; | |
117 expect(unlinkedUnit.references[typeRef].name, 'int'); | |
118 LinkedReference linkedReference = linkedUnit.references[typeRef]; | |
119 expect(linkedLibrary.dependencies[linkedReference.dependency].uri, | |
120 'dart:core'); | |
121 } | |
122 // V1 is linked | |
123 { | |
124 UnlinkedUnit unlinkedUnit = bundle.unlinkedUnits[1]; | |
125 LinkedUnit linkedUnit = linkedLibrary.units[1]; | |
126 expect(unlinkedUnit.variables, hasLength(1)); | |
127 UnlinkedVariable variable = unlinkedUnit.variables[0]; | |
128 expect(variable.name, 'V1'); | |
129 int typeRef = variable.type.reference; | |
130 expect(unlinkedUnit.references[typeRef].name, 'double'); | |
131 LinkedReference linkedReference = linkedUnit.references[typeRef]; | |
132 expect(linkedLibrary.dependencies[linkedReference.dependency].uri, | |
133 'dart:core'); | |
134 } | |
135 // V2 is linked | |
136 { | |
137 UnlinkedUnit unlinkedUnit = bundle.unlinkedUnits[2]; | |
138 LinkedUnit linkedUnit = linkedLibrary.units[2]; | |
139 expect(unlinkedUnit.variables, hasLength(1)); | |
140 UnlinkedVariable variable = unlinkedUnit.variables[0]; | |
141 expect(variable.name, 'V2'); | |
142 int typeRef = variable.type.reference; | |
143 expect(unlinkedUnit.references[typeRef].name, 'Future'); | |
144 LinkedReference linkedReference = linkedUnit.references[typeRef]; | |
145 expect(linkedLibrary.dependencies[linkedReference.dependency].uri, | |
146 'dart:async'); | |
147 } | |
148 } | |
149 | |
150 test_computeUnlinkedForFolder() async { | 37 test_computeUnlinkedForFolder() async { |
151 // Create package files. | 38 // Create package files. |
152 resourceProvider.newFile( | 39 resourceProvider.newFile( |
153 '/flutter/aaa/lib/a.dart', | 40 '/flutter/aaa/lib/a.dart', |
154 ''' | 41 ''' |
155 class A {} | 42 class A {} |
156 '''); | 43 '''); |
157 resourceProvider.newFile( | 44 resourceProvider.newFile( |
158 '/flutter/bbb/lib/b.dart', | 45 '/flutter/bbb/lib/b.dart', |
159 ''' | 46 ''' |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 // Verify that new files with linked bundles were created. | 253 // Verify that new files with linked bundles were created. |
367 LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa'); | 254 LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa'); |
368 LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb'); | 255 LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb'); |
369 expect(packageA.linkedHash, isNot(linkedHashA)); | 256 expect(packageA.linkedHash, isNot(linkedHashA)); |
370 expect(packageB.linkedHash, isNot(linkedHashB)); | 257 expect(packageB.linkedHash, isNot(linkedHashB)); |
371 _assertFileExists(folderA, 'linked_spec_${packageA.linkedHash}.ds'); | 258 _assertFileExists(folderA, 'linked_spec_${packageA.linkedHash}.ds'); |
372 _assertFileExists(folderB, 'linked_spec_${packageB.linkedHash}.ds'); | 259 _assertFileExists(folderB, 'linked_spec_${packageB.linkedHash}.ds'); |
373 } | 260 } |
374 } | 261 } |
375 | 262 |
376 test_getLinkedBundles_cached_useSdkExtension() async { | |
377 String pathA1 = '$CACHE/aaa-1.0.0'; | |
378 String pathA2 = '$CACHE/aaa-2.0.0'; | |
379 // aaa-1.0.0 | |
380 resourceProvider.newFile( | |
381 '$pathA1/lib/a.dart', | |
382 ''' | |
383 class A {} | |
384 int a; | |
385 '''); | |
386 resourceProvider.newFile( | |
387 '$pathA1/sdk_ext/extA.dart', | |
388 ''' | |
389 class ExtA1 {} | |
390 '''); | |
391 resourceProvider.newFile( | |
392 '$pathA1/lib/_sdkext', | |
393 ''' | |
394 { | |
395 "dart:aaa": "../sdk_ext/extA.dart" | |
396 } | |
397 '''); | |
398 // aaa-2.0.0 | |
399 resourceProvider.newFile( | |
400 '$pathA2/lib/a.dart', | |
401 ''' | |
402 class A {} | |
403 int a; | |
404 '''); | |
405 resourceProvider.newFile( | |
406 '$pathA2/sdk_ext/extA.dart', | |
407 ''' | |
408 class ExtA2 {} | |
409 '''); | |
410 resourceProvider.newFile( | |
411 '$pathA2/lib/_sdkext', | |
412 ''' | |
413 { | |
414 "dart:aaa": "../sdk_ext/extA.dart" | |
415 } | |
416 '''); | |
417 // bbb | |
418 resourceProvider.newFile( | |
419 '$CACHE/bbb/lib/b.dart', | |
420 ''' | |
421 import 'package:aaa/a.dart'; | |
422 A b; | |
423 '''); | |
424 Folder folderA1 = resourceProvider.getFolder(pathA1); | |
425 Folder folderA2 = resourceProvider.getFolder(pathA2); | |
426 Folder folderB = resourceProvider.getFolder('$CACHE/bbb'); | |
427 | |
428 // Configure packages resolution. | |
429 Folder libFolderA1 = resourceProvider.newFolder('$pathA1/lib'); | |
430 Folder libFolderA2 = resourceProvider.newFolder('$pathA2/lib'); | |
431 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); | |
432 context.sourceFactory = new SourceFactory(<UriResolver>[ | |
433 sdkResolver, | |
434 resourceResolver, | |
435 new PackageMapUriResolver(resourceProvider, { | |
436 'aaa': [libFolderA1], | |
437 'bbb': [libFolderB], | |
438 }) | |
439 ]); | |
440 | |
441 // Session 1. | |
442 // Create linked bundles and store them in files. | |
443 String linkedHashA; | |
444 String linkedHashB; | |
445 { | |
446 // Ensure unlinked bundles. | |
447 manager.getUnlinkedBundles(context); | |
448 await manager.onUnlinkedComplete; | |
449 | |
450 // Now we should be able to get linked bundles. | |
451 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); | |
452 expect(linkedPackages, hasLength(2)); | |
453 | |
454 // Verify that files with linked bundles were created. | |
455 LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa'); | |
456 LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb'); | |
457 linkedHashA = packageA.linkedHash; | |
458 linkedHashB = packageB.linkedHash; | |
459 _assertFileExists(folderA1, 'linked_spec_$linkedHashA.ds'); | |
460 _assertFileExists(folderB, 'linked_spec_$linkedHashB.ds'); | |
461 } | |
462 | |
463 // Session 2. | |
464 // Use 'aaa-2.0.0', with a different SDK extension. | |
465 { | |
466 context.sourceFactory = new SourceFactory(<UriResolver>[ | |
467 sdkResolver, | |
468 resourceResolver, | |
469 new PackageMapUriResolver(resourceProvider, { | |
470 'aaa': [libFolderA2], | |
471 'bbb': [libFolderB], | |
472 }) | |
473 ]); | |
474 | |
475 // Ensure unlinked bundles. | |
476 manager.getUnlinkedBundles(context); | |
477 await manager.onUnlinkedComplete; | |
478 | |
479 // Now we should be able to get linked bundles. | |
480 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); | |
481 expect(linkedPackages, hasLength(2)); | |
482 | |
483 // Verify that new files with linked bundles were created. | |
484 LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa'); | |
485 LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb'); | |
486 expect(packageA.linkedHash, isNot(linkedHashA)); | |
487 expect(packageB.linkedHash, isNot(linkedHashB)); | |
488 _assertFileExists(folderA2, 'linked_spec_${packageA.linkedHash}.ds'); | |
489 _assertFileExists(folderB, 'linked_spec_${packageB.linkedHash}.ds'); | |
490 } | |
491 } | |
492 | |
493 test_getLinkedBundles_hasCycle() async { | 263 test_getLinkedBundles_hasCycle() async { |
494 resourceProvider.newFile( | 264 resourceProvider.newFile( |
495 '$CACHE/aaa/lib/a.dart', | 265 '$CACHE/aaa/lib/a.dart', |
496 ''' | 266 ''' |
497 import 'package:bbb/b.dart'; | 267 import 'package:bbb/b.dart'; |
498 class A {} | 268 class A {} |
499 int a1; | 269 int a1; |
500 B a2; | 270 B a2; |
501 '''); | 271 '''); |
502 resourceProvider.newFile( | 272 resourceProvider.newFile( |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1038 | 808 |
1039 // package:aaa | 809 // package:aaa |
1040 { | 810 { |
1041 LinkedPubPackage linkedPackage = linkedPackages | 811 LinkedPubPackage linkedPackage = linkedPackages |
1042 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); | 812 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); |
1043 _assertHasLinkedVariable(linkedPackage, 'a', 'C', | 813 _assertHasLinkedVariable(linkedPackage, 'a', 'C', |
1044 expectedTypeNameUri: 'package:ccc/c.dart'); | 814 expectedTypeNameUri: 'package:ccc/c.dart'); |
1045 } | 815 } |
1046 } | 816 } |
1047 | 817 |
1048 test_getLinkedBundles_useSdkExtension() async { | |
1049 resourceProvider.newFile( | |
1050 '$CACHE/aaa/lib/a.dart', | |
1051 ''' | |
1052 import 'dart:bbb'; | |
1053 ExtB a; | |
1054 '''); | |
1055 resourceProvider.newFile( | |
1056 '$CACHE/bbb/lib/b.dart', | |
1057 ''' | |
1058 import 'dart:bbb'; | |
1059 ExtB b; | |
1060 '''); | |
1061 resourceProvider.newFile( | |
1062 '$CACHE/bbb/sdk_ext/extB.dart', | |
1063 ''' | |
1064 class ExtB {} | |
1065 '''); | |
1066 resourceProvider.newFile( | |
1067 '$CACHE/bbb/lib/_sdkext', | |
1068 ''' | |
1069 { | |
1070 "dart:bbb": "../sdk_ext/extB.dart" | |
1071 } | |
1072 '''); | |
1073 | |
1074 // Configure packages resolution. | |
1075 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); | |
1076 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); | |
1077 context.sourceFactory = new SourceFactory(<UriResolver>[ | |
1078 sdkResolver, | |
1079 resourceResolver, | |
1080 new PackageMapUriResolver(resourceProvider, { | |
1081 'aaa': [libFolderA], | |
1082 'bbb': [libFolderB], | |
1083 }) | |
1084 ]); | |
1085 | |
1086 // Ensure unlinked bundles. | |
1087 manager.getUnlinkedBundles(context); | |
1088 await manager.onUnlinkedComplete; | |
1089 | |
1090 // Now we should be able to get linked bundles. | |
1091 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); | |
1092 expect(linkedPackages, hasLength(2)); | |
1093 | |
1094 // package:aaa | |
1095 { | |
1096 LinkedPubPackage linkedPackage = linkedPackages | |
1097 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); | |
1098 _assertHasLinkedVariable(linkedPackage, 'a', 'ExtB', | |
1099 expectedTypeNameUri: 'dart:bbb'); | |
1100 } | |
1101 | |
1102 // package:bbb | |
1103 { | |
1104 LinkedPubPackage linkedPackage = linkedPackages | |
1105 .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb'); | |
1106 _assertHasLinkedVariable(linkedPackage, 'b', 'ExtB', | |
1107 expectedTypeNameUri: 'dart:bbb'); | |
1108 } | |
1109 } | |
1110 | |
1111 test_getLinkedBundles_wrongScheme() async { | 818 test_getLinkedBundles_wrongScheme() async { |
1112 resourceProvider.newFile( | 819 resourceProvider.newFile( |
1113 '$CACHE/aaa/lib/a.dart', | 820 '$CACHE/aaa/lib/a.dart', |
1114 ''' | 821 ''' |
1115 import 'xxx:yyy/zzz.dart'; | 822 import 'xxx:yyy/zzz.dart'; |
1116 int a1; | 823 int a1; |
1117 Z a2; | 824 Z a2; |
1118 '''); | 825 '''); |
1119 | 826 |
1120 // Configure packages resolution. | 827 // Configure packages resolution. |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1428 .singleWhere((linkedPackage) => linkedPackage.package.name == name); | 1135 .singleWhere((linkedPackage) => linkedPackage.package.name == name); |
1429 } | 1136 } |
1430 | 1137 |
1431 static PackageBundle _getBundleByPackageName( | 1138 static PackageBundle _getBundleByPackageName( |
1432 Map<PubPackage, PackageBundle> bundles, String name) { | 1139 Map<PubPackage, PackageBundle> bundles, String name) { |
1433 PubPackage package = | 1140 PubPackage package = |
1434 bundles.keys.singleWhere((package) => package.name == name); | 1141 bundles.keys.singleWhere((package) => package.name == name); |
1435 return bundles[package]; | 1142 return bundles[package]; |
1436 } | 1143 } |
1437 } | 1144 } |
OLD | NEW |