| 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 |