| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 import 'package:analyzer/file_system/file_system.dart'; |
| 6 import 'package:analyzer/source/package_map_resolver.dart'; |
| 7 import 'package:analyzer/src/generated/source.dart'; |
| 8 import 'package:analyzer/src/summary/format.dart'; |
| 9 import 'package:analyzer/src/summary/idl.dart'; |
| 10 import 'package:analyzer/src/summary/pub_summary.dart'; |
| 11 import 'package:analyzer/src/summary/summarize_elements.dart'; |
| 12 import 'package:analyzer/src/util/fast_uri.dart'; |
| 13 import 'package:path/path.dart' as pathos; |
| 14 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 15 import 'package:unittest/unittest.dart' hide ERROR; |
| 16 |
| 17 import '../../utils.dart'; |
| 18 import '../context/abstract_context.dart'; |
| 19 import '../context/mock_sdk.dart'; |
| 20 |
| 21 main() { |
| 22 initializeTestEnvironment(); |
| 23 defineReflectiveTests(PubSummaryManagerTest); |
| 24 } |
| 25 |
| 26 @reflectiveTest |
| 27 class PubSummaryManagerTest extends AbstractContextTest { |
| 28 static const String CACHE = '/home/.pub-cache/hosted/pub.dartlang.org'; |
| 29 |
| 30 PubSummaryManager manager; |
| 31 |
| 32 void setUp() { |
| 33 super.setUp(); |
| 34 _createManager(); |
| 35 } |
| 36 |
| 37 test_computeUnlinkedForFolder() async { |
| 38 // Create package files. |
| 39 resourceProvider.newFile( |
| 40 '/flutter/aaa/lib/a.dart', |
| 41 ''' |
| 42 class A {} |
| 43 '''); |
| 44 resourceProvider.newFile( |
| 45 '/flutter/bbb/lib/b.dart', |
| 46 ''' |
| 47 class B {} |
| 48 '''); |
| 49 |
| 50 // Configure packages resolution. |
| 51 Folder libFolderA = resourceProvider.newFolder('/flutter/aaa/lib'); |
| 52 Folder libFolderB = resourceProvider.newFolder('/flutter/bbb/lib'); |
| 53 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 54 sdkResolver, |
| 55 resourceResolver, |
| 56 new PackageMapUriResolver(resourceProvider, { |
| 57 'aaa': [libFolderA], |
| 58 'bbb': [libFolderB], |
| 59 }) |
| 60 ]); |
| 61 |
| 62 await manager.computeUnlinkedForFolder('aaa', libFolderA); |
| 63 await manager.computeUnlinkedForFolder('bbb', libFolderB); |
| 64 |
| 65 // The files must be created. |
| 66 _assertFileExists(libFolderA.parent, PubSummaryManager.UNLINKED_NAME); |
| 67 _assertFileExists(libFolderA.parent, PubSummaryManager.UNLINKED_SPEC_NAME); |
| 68 _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_NAME); |
| 69 _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_SPEC_NAME); |
| 70 } |
| 71 |
| 72 test_getLinkedBundles_cached() async { |
| 73 String pathA1 = '$CACHE/aaa-1.0.0'; |
| 74 String pathA2 = '$CACHE/aaa-2.0.0'; |
| 75 resourceProvider.newFile( |
| 76 '$pathA1/lib/a.dart', |
| 77 ''' |
| 78 class A {} |
| 79 int a; |
| 80 '''); |
| 81 resourceProvider.newFile( |
| 82 '$pathA2/lib/a.dart', |
| 83 ''' |
| 84 class A2 {} |
| 85 int a; |
| 86 '''); |
| 87 resourceProvider.newFile( |
| 88 '$CACHE/bbb/lib/b.dart', |
| 89 ''' |
| 90 import 'package:aaa/a.dart'; |
| 91 A b; |
| 92 '''); |
| 93 Folder folderA1 = resourceProvider.getFolder(pathA1); |
| 94 Folder folderA2 = resourceProvider.getFolder(pathA2); |
| 95 Folder folderB = resourceProvider.getFolder('$CACHE/bbb'); |
| 96 |
| 97 // Configure packages resolution. |
| 98 Folder libFolderA1 = resourceProvider.newFolder('$pathA1/lib'); |
| 99 Folder libFolderA2 = resourceProvider.newFolder('$pathA2/lib'); |
| 100 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 101 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 102 sdkResolver, |
| 103 resourceResolver, |
| 104 new PackageMapUriResolver(resourceProvider, { |
| 105 'aaa': [libFolderA1], |
| 106 'bbb': [libFolderB], |
| 107 }) |
| 108 ]); |
| 109 |
| 110 // Session 1. |
| 111 // Create linked bundles and store them in files. |
| 112 String linkedHashA; |
| 113 String linkedHashB; |
| 114 { |
| 115 // Ensure unlinked bundles. |
| 116 manager.getUnlinkedBundles(context); |
| 117 await manager.onUnlinkedComplete; |
| 118 |
| 119 // Now we should be able to get linked bundles. |
| 120 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 121 expect(linkedPackages, hasLength(2)); |
| 122 |
| 123 // Verify that files with linked bundles were created. |
| 124 LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa'); |
| 125 LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb'); |
| 126 linkedHashA = packageA.linkedHash; |
| 127 linkedHashB = packageB.linkedHash; |
| 128 _assertFileExists(folderA1, 'linked_spec_$linkedHashA.ds'); |
| 129 _assertFileExists(folderB, 'linked_spec_$linkedHashB.ds'); |
| 130 } |
| 131 |
| 132 // Session 2. |
| 133 // Recreate manager and ask again. |
| 134 { |
| 135 _createManager(); |
| 136 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 137 expect(linkedPackages, hasLength(2)); |
| 138 |
| 139 // Verify that linked packages have the same hashes, so they must |
| 140 // be have been read from the previously created files. |
| 141 LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa'); |
| 142 LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb'); |
| 143 expect(packageA.linkedHash, linkedHashA); |
| 144 expect(packageB.linkedHash, linkedHashB); |
| 145 } |
| 146 |
| 147 // Session 2 with different 'aaa' version. |
| 148 // Different linked bundles. |
| 149 { |
| 150 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 151 sdkResolver, |
| 152 resourceResolver, |
| 153 new PackageMapUriResolver(resourceProvider, { |
| 154 'aaa': [libFolderA2], |
| 155 'bbb': [libFolderB], |
| 156 }) |
| 157 ]); |
| 158 |
| 159 // Ensure unlinked bundles. |
| 160 manager.getUnlinkedBundles(context); |
| 161 await manager.onUnlinkedComplete; |
| 162 |
| 163 // Now we should be able to get linked bundles. |
| 164 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 165 expect(linkedPackages, hasLength(2)); |
| 166 |
| 167 // Verify that new files with linked bundles were created. |
| 168 LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa'); |
| 169 LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb'); |
| 170 expect(packageA.linkedHash, isNot(linkedHashA)); |
| 171 expect(packageB.linkedHash, isNot(linkedHashB)); |
| 172 _assertFileExists(folderA2, 'linked_spec_${packageA.linkedHash}.ds'); |
| 173 _assertFileExists(folderB, 'linked_spec_${packageB.linkedHash}.ds'); |
| 174 } |
| 175 } |
| 176 |
| 177 test_getLinkedBundles_cached_declaredVariables_export() async { |
| 178 await _testImpl_getLinkedBundles_cached_declaredVariables('export'); |
| 179 } |
| 180 |
| 181 test_getLinkedBundles_cached_declaredVariables_import() async { |
| 182 await _testImpl_getLinkedBundles_cached_declaredVariables('import'); |
| 183 } |
| 184 |
| 185 test_getLinkedBundles_cached_differentSdk() async { |
| 186 String pathA = '$CACHE/aaa'; |
| 187 resourceProvider.newFile( |
| 188 '$pathA/lib/a.dart', |
| 189 ''' |
| 190 class A {} |
| 191 int a; |
| 192 '''); |
| 193 resourceProvider.newFile( |
| 194 '$CACHE/bbb/lib/b.dart', |
| 195 ''' |
| 196 import 'package:aaa/a.dart'; |
| 197 A b; |
| 198 '''); |
| 199 Folder folderA = resourceProvider.getFolder(pathA); |
| 200 Folder folderB = resourceProvider.getFolder('$CACHE/bbb'); |
| 201 |
| 202 // Configure packages resolution. |
| 203 Folder libFolderA = resourceProvider.newFolder('$pathA/lib'); |
| 204 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 205 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 206 sdkResolver, |
| 207 resourceResolver, |
| 208 new PackageMapUriResolver(resourceProvider, { |
| 209 'aaa': [libFolderA], |
| 210 'bbb': [libFolderB], |
| 211 }) |
| 212 ]); |
| 213 |
| 214 // Session 1. |
| 215 // Create linked bundles and store them in files. |
| 216 String linkedHashA; |
| 217 String linkedHashB; |
| 218 { |
| 219 // Ensure unlinked bundles. |
| 220 manager.getUnlinkedBundles(context); |
| 221 await manager.onUnlinkedComplete; |
| 222 |
| 223 // Now we should be able to get linked bundles. |
| 224 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 225 expect(linkedPackages, hasLength(2)); |
| 226 |
| 227 // Verify that files with linked bundles were created. |
| 228 LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa'); |
| 229 LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb'); |
| 230 linkedHashA = packageA.linkedHash; |
| 231 linkedHashB = packageB.linkedHash; |
| 232 _assertFileExists(folderA, 'linked_spec_$linkedHashA.ds'); |
| 233 _assertFileExists(folderB, 'linked_spec_$linkedHashB.ds'); |
| 234 } |
| 235 |
| 236 // Session 2. |
| 237 // Use DartSdk with a different API signature. |
| 238 // Different linked bundles should be created. |
| 239 { |
| 240 MockSdk sdk = new MockSdk(); |
| 241 sdk.updateUriFile('dart:math', (String content) { |
| 242 return content + ' class NewMathClass {}'; |
| 243 }); |
| 244 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 245 new DartUriResolver(sdk), |
| 246 resourceResolver, |
| 247 new PackageMapUriResolver(resourceProvider, { |
| 248 'aaa': [libFolderA], |
| 249 'bbb': [libFolderB], |
| 250 }) |
| 251 ]); |
| 252 |
| 253 // Ensure unlinked bundles. |
| 254 manager.getUnlinkedBundles(context); |
| 255 await manager.onUnlinkedComplete; |
| 256 |
| 257 // Now we should be able to get linked bundles. |
| 258 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 259 expect(linkedPackages, hasLength(2)); |
| 260 |
| 261 // Verify that new files with linked bundles were created. |
| 262 LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa'); |
| 263 LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb'); |
| 264 expect(packageA.linkedHash, isNot(linkedHashA)); |
| 265 expect(packageB.linkedHash, isNot(linkedHashB)); |
| 266 _assertFileExists(folderA, 'linked_spec_${packageA.linkedHash}.ds'); |
| 267 _assertFileExists(folderB, 'linked_spec_${packageB.linkedHash}.ds'); |
| 268 } |
| 269 } |
| 270 |
| 271 test_getLinkedBundles_cached_inconsistent_majorVersion() async { |
| 272 String pathA = '$CACHE/aaa'; |
| 273 resourceProvider.newFile( |
| 274 '$pathA/lib/a.dart', |
| 275 ''' |
| 276 class A {} |
| 277 int a; |
| 278 '''); |
| 279 // Configure packages resolution. |
| 280 Folder libFolderA = resourceProvider.newFolder('$pathA/lib'); |
| 281 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 282 sdkResolver, |
| 283 resourceResolver, |
| 284 new PackageMapUriResolver(resourceProvider, { |
| 285 'aaa': [libFolderA], |
| 286 }) |
| 287 ]); |
| 288 |
| 289 // Session 1. |
| 290 // Create the linked bundle and cache it in a file. |
| 291 { |
| 292 // Ensure unlinked bundles. |
| 293 manager.getUnlinkedBundles(context); |
| 294 await manager.onUnlinkedComplete; |
| 295 |
| 296 // Now we should be able to get the linked bundle. |
| 297 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 298 expect(linkedPackages, hasLength(1)); |
| 299 } |
| 300 |
| 301 // Session 2. |
| 302 // Recreate manager with a different major version. |
| 303 // It cannot use the previously cache linked bundle. |
| 304 // The reason is that we cannot use the cached unlinked bundle. |
| 305 { |
| 306 _createManager(majorVersion: 12345); |
| 307 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 308 expect(linkedPackages, isEmpty); |
| 309 } |
| 310 } |
| 311 |
| 312 test_getLinkedBundles_hasCycle() async { |
| 313 resourceProvider.newFile( |
| 314 '$CACHE/aaa/lib/a.dart', |
| 315 ''' |
| 316 import 'package:bbb/b.dart'; |
| 317 class A {} |
| 318 int a1; |
| 319 B a2; |
| 320 '''); |
| 321 resourceProvider.newFile( |
| 322 '$CACHE/bbb/lib/b.dart', |
| 323 ''' |
| 324 import 'package:ccc/c.dart'; |
| 325 class B {} |
| 326 C b; |
| 327 '''); |
| 328 resourceProvider.newFile( |
| 329 '$CACHE/ccc/lib/c.dart', |
| 330 ''' |
| 331 import 'package:aaa/a.dart'; |
| 332 import 'package:ddd/d.dart'; |
| 333 class C {} |
| 334 A c1; |
| 335 D c2; |
| 336 '''); |
| 337 resourceProvider.newFile( |
| 338 '$CACHE/ddd/lib/d.dart', |
| 339 ''' |
| 340 class D {} |
| 341 String d; |
| 342 '''); |
| 343 |
| 344 // Configure packages resolution. |
| 345 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 346 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 347 Folder libFolderC = resourceProvider.newFolder('$CACHE/ccc/lib'); |
| 348 Folder libFolderD = resourceProvider.newFolder('$CACHE/ddd/lib'); |
| 349 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 350 sdkResolver, |
| 351 resourceResolver, |
| 352 new PackageMapUriResolver(resourceProvider, { |
| 353 'aaa': [libFolderA], |
| 354 'bbb': [libFolderB], |
| 355 'ccc': [libFolderC], |
| 356 'ddd': [libFolderD], |
| 357 }) |
| 358 ]); |
| 359 |
| 360 // Ensure unlinked bundles. |
| 361 manager.getUnlinkedBundles(context); |
| 362 await manager.onUnlinkedComplete; |
| 363 |
| 364 // Now we should be able to get linked bundles. |
| 365 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 366 expect(linkedPackages, hasLength(4)); |
| 367 |
| 368 // package:aaa |
| 369 { |
| 370 LinkedPubPackage linkedPackage = linkedPackages |
| 371 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); |
| 372 expect(linkedPackage.linked.linkedLibraryUris, ['package:aaa/a.dart']); |
| 373 _assertHasLinkedVariable(linkedPackage, 'a1', 'int', |
| 374 expectedTypeNameUri: 'dart:core'); |
| 375 _assertHasLinkedVariable(linkedPackage, 'a2', 'B', |
| 376 expectedTypeNameUri: 'package:bbb/b.dart'); |
| 377 } |
| 378 |
| 379 // package:bbb |
| 380 { |
| 381 LinkedPubPackage linkedPackage = linkedPackages |
| 382 .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb'); |
| 383 expect(linkedPackage.linked.linkedLibraryUris, ['package:bbb/b.dart']); |
| 384 _assertHasLinkedVariable(linkedPackage, 'b', 'C', |
| 385 expectedTypeNameUri: 'package:ccc/c.dart'); |
| 386 } |
| 387 |
| 388 // package:ccc |
| 389 { |
| 390 LinkedPubPackage linkedPackage = linkedPackages |
| 391 .singleWhere((linkedPackage) => linkedPackage.package.name == 'ccc'); |
| 392 expect(linkedPackage.linked.linkedLibraryUris, ['package:ccc/c.dart']); |
| 393 _assertHasLinkedVariable(linkedPackage, 'c1', 'A', |
| 394 expectedTypeNameUri: 'package:aaa/a.dart'); |
| 395 _assertHasLinkedVariable(linkedPackage, 'c2', 'D', |
| 396 expectedTypeNameUri: 'package:ddd/d.dart'); |
| 397 } |
| 398 |
| 399 // package:ddd |
| 400 { |
| 401 LinkedPubPackage linkedPackage = linkedPackages |
| 402 .singleWhere((linkedPackage) => linkedPackage.package.name == 'ddd'); |
| 403 expect(linkedPackage.linked.linkedLibraryUris, ['package:ddd/d.dart']); |
| 404 _assertHasLinkedVariable(linkedPackage, 'd', 'String', |
| 405 expectedTypeNameUri: 'dart:core'); |
| 406 } |
| 407 } |
| 408 |
| 409 test_getLinkedBundles_missingBundle_listed() async { |
| 410 resourceProvider.newFile( |
| 411 '$CACHE/aaa/lib/a.dart', |
| 412 ''' |
| 413 import 'package:bbb/b.dart'; |
| 414 B a; |
| 415 '''); |
| 416 resourceProvider.newFile( |
| 417 '$CACHE/bbb/lib/b.dart', |
| 418 ''' |
| 419 class B {} |
| 420 '''); |
| 421 |
| 422 // Configure packages resolution. |
| 423 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 424 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 425 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 426 sdkResolver, |
| 427 resourceResolver, |
| 428 new PackageMapUriResolver(resourceProvider, { |
| 429 'aaa': [libFolderA], |
| 430 'bbb': [libFolderB], |
| 431 }) |
| 432 ]); |
| 433 |
| 434 // Ensure unlinked bundles for 'aaa'. |
| 435 await manager.computeUnlinkedForFolder('aaa', libFolderA); |
| 436 |
| 437 // Try to link. |
| 438 // Neither 'aaa' nor 'bbb' are linked. |
| 439 // 'bbb' does not have the unlinked bundle. |
| 440 // 'aaa' is not linked because it references 'bbb', which is listed. |
| 441 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 442 expect(linkedPackages, hasLength(0)); |
| 443 } |
| 444 |
| 445 test_getLinkedBundles_missingBundle_listed_chained() async { |
| 446 resourceProvider.newFile( |
| 447 '$CACHE/aaa/lib/a.dart', |
| 448 ''' |
| 449 import 'package:bbb/b.dart'; |
| 450 '''); |
| 451 resourceProvider.newFile( |
| 452 '$CACHE/bbb/lib/b.dart', |
| 453 ''' |
| 454 import 'package:ccc/c.dart'; |
| 455 '''); |
| 456 resourceProvider.newFile( |
| 457 '$CACHE/ccc/lib/c.dart', |
| 458 ''' |
| 459 class C {} |
| 460 '''); |
| 461 |
| 462 // Configure packages resolution. |
| 463 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 464 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 465 Folder libFolderC = resourceProvider.newFolder('$CACHE/ccc/lib'); |
| 466 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 467 sdkResolver, |
| 468 resourceResolver, |
| 469 new PackageMapUriResolver(resourceProvider, { |
| 470 'aaa': [libFolderA], |
| 471 'bbb': [libFolderB], |
| 472 'ccc': [libFolderC], |
| 473 }) |
| 474 ]); |
| 475 |
| 476 // Ensure unlinked bundles. |
| 477 await manager.computeUnlinkedForFolder('aaa', libFolderA); |
| 478 await manager.computeUnlinkedForFolder('bbb', libFolderB); |
| 479 |
| 480 // Try to link. |
| 481 // Neither 'aaa' nor 'bbb' are linked. |
| 482 // 'ccc' is listed in the package map, but its unlinked bundle is not ready. |
| 483 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 484 expect(linkedPackages, hasLength(0)); |
| 485 } |
| 486 |
| 487 test_getLinkedBundles_missingBundle_listed_partial() async { |
| 488 resourceProvider.newFile( |
| 489 '$CACHE/aaa/lib/a.dart', |
| 490 ''' |
| 491 int a; |
| 492 '''); |
| 493 resourceProvider.newFile( |
| 494 '$CACHE/bbb/lib/b.dart', |
| 495 ''' |
| 496 import 'package:ccc/c.dart'; |
| 497 C b; |
| 498 '''); |
| 499 resourceProvider.newFile( |
| 500 '$CACHE/ccc/lib/c.dart', |
| 501 ''' |
| 502 class C {} |
| 503 '''); |
| 504 |
| 505 // Configure packages resolution. |
| 506 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 507 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 508 Folder libFolderC = resourceProvider.newFolder('$CACHE/ccc/lib'); |
| 509 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 510 sdkResolver, |
| 511 resourceResolver, |
| 512 new PackageMapUriResolver(resourceProvider, { |
| 513 'aaa': [libFolderA], |
| 514 'bbb': [libFolderB], |
| 515 'ccc': [libFolderC], |
| 516 }) |
| 517 ]); |
| 518 |
| 519 // Ensure unlinked bundles for 'aaa'. |
| 520 await manager.computeUnlinkedForFolder('aaa', libFolderA); |
| 521 await manager.computeUnlinkedForFolder('bbb', libFolderB); |
| 522 |
| 523 // Try to link. |
| 524 // Only 'aaa' is linked. |
| 525 // The package 'bbb' references the listed 'ccc' without unlinked bundle. |
| 526 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 527 expect(linkedPackages, hasLength(1)); |
| 528 |
| 529 // package:aaa |
| 530 { |
| 531 LinkedPubPackage linkedPackage = linkedPackages |
| 532 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); |
| 533 _assertHasLinkedVariable(linkedPackage, 'a', 'int', |
| 534 expectedTypeNameUri: 'dart:core'); |
| 535 } |
| 536 } |
| 537 |
| 538 test_getLinkedBundles_missingBundle_notListed() async { |
| 539 resourceProvider.newFile( |
| 540 '$CACHE/aaa/lib/a.dart', |
| 541 ''' |
| 542 int a; |
| 543 '''); |
| 544 resourceProvider.newFile( |
| 545 '$CACHE/bbb/lib/b.dart', |
| 546 ''' |
| 547 import 'package:ccc/c.dart'; |
| 548 int b1; |
| 549 C b2; |
| 550 '''); |
| 551 |
| 552 // Configure packages resolution. |
| 553 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 554 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 555 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 556 sdkResolver, |
| 557 resourceResolver, |
| 558 new PackageMapUriResolver(resourceProvider, { |
| 559 'aaa': [libFolderA], |
| 560 'bbb': [libFolderB], |
| 561 }) |
| 562 ]); |
| 563 |
| 564 // Ensure unlinked bundles. |
| 565 manager.getUnlinkedBundles(context); |
| 566 await manager.onUnlinkedComplete; |
| 567 |
| 568 // Try to link. |
| 569 // Both 'aaa' and 'bbb' are linked. |
| 570 // The package 'ccc' is not listed, so it cannot be resolved anyway, |
| 571 // with summaries or without them. |
| 572 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 573 expect(linkedPackages, hasLength(2)); |
| 574 |
| 575 // package:aaa |
| 576 { |
| 577 LinkedPubPackage linkedPackage = linkedPackages |
| 578 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); |
| 579 _assertHasLinkedVariable(linkedPackage, 'a', 'int', |
| 580 expectedTypeNameUri: 'dart:core'); |
| 581 } |
| 582 |
| 583 // package:bbb |
| 584 { |
| 585 LinkedPubPackage linkedPackage = linkedPackages |
| 586 .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb'); |
| 587 _assertHasLinkedVariable(linkedPackage, 'b1', 'int', |
| 588 expectedTypeNameUri: 'dart:core'); |
| 589 _assertHasLinkedVariable(linkedPackage, 'b2', 'C', |
| 590 expectedToBeResolved: false); |
| 591 } |
| 592 } |
| 593 |
| 594 test_getLinkedBundles_missingLibrary() async { |
| 595 resourceProvider.newFile( |
| 596 '$CACHE/aaa/lib/a.dart', |
| 597 ''' |
| 598 import 'package:bbb/b2.dart'; |
| 599 int a1; |
| 600 B2 a2; |
| 601 '''); |
| 602 resourceProvider.newFile( |
| 603 '$CACHE/bbb/lib/b.dart', |
| 604 ''' |
| 605 class B {} |
| 606 int b = 42; |
| 607 '''); |
| 608 |
| 609 // Configure packages resolution. |
| 610 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 611 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 612 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 613 sdkResolver, |
| 614 resourceResolver, |
| 615 new PackageMapUriResolver(resourceProvider, { |
| 616 'aaa': [libFolderA], |
| 617 'bbb': [libFolderB], |
| 618 }) |
| 619 ]); |
| 620 |
| 621 // Ensure unlinked bundles. |
| 622 manager.getUnlinkedBundles(context); |
| 623 await manager.onUnlinkedComplete; |
| 624 |
| 625 // Try to link. |
| 626 // Both 'aaa' and 'bbb' are linked. |
| 627 // The name 'B2' in 'a.dart' is not resolved. |
| 628 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 629 expect(linkedPackages, hasLength(2)); |
| 630 |
| 631 // package:aaa |
| 632 { |
| 633 LinkedPubPackage linkedPackage = linkedPackages |
| 634 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); |
| 635 _assertHasLinkedVariable(linkedPackage, 'a1', 'int', |
| 636 expectedTypeNameUri: 'dart:core'); |
| 637 _assertHasLinkedVariable(linkedPackage, 'a2', 'B2', |
| 638 expectedToBeResolved: false); |
| 639 } |
| 640 |
| 641 // package:bbb |
| 642 { |
| 643 LinkedPubPackage linkedPackage = linkedPackages |
| 644 .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb'); |
| 645 _assertHasLinkedVariable(linkedPackage, 'b', 'int', |
| 646 expectedTypeNameUri: 'dart:core'); |
| 647 } |
| 648 } |
| 649 |
| 650 test_getLinkedBundles_missingLibrary_hasCycle() async { |
| 651 resourceProvider.newFile( |
| 652 '$CACHE/aaa/lib/a.dart', |
| 653 ''' |
| 654 import 'package:bbb/b.dart'; |
| 655 B a; |
| 656 '''); |
| 657 resourceProvider.newFile( |
| 658 '$CACHE/bbb/lib/b.dart', |
| 659 ''' |
| 660 import 'package:aaa/a.dart'; |
| 661 import 'package:ccc/c2.dart'; |
| 662 class B {} |
| 663 int b1; |
| 664 C2 b2; |
| 665 '''); |
| 666 resourceProvider.newFile( |
| 667 '$CACHE/ccc/lib/c.dart', |
| 668 ''' |
| 669 class C {} |
| 670 int c; |
| 671 '''); |
| 672 |
| 673 // Configure packages resolution. |
| 674 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 675 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 676 Folder libFolderC = resourceProvider.newFolder('$CACHE/ccc/lib'); |
| 677 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 678 sdkResolver, |
| 679 resourceResolver, |
| 680 new PackageMapUriResolver(resourceProvider, { |
| 681 'aaa': [libFolderA], |
| 682 'bbb': [libFolderB], |
| 683 'ccc': [libFolderC], |
| 684 }) |
| 685 ]); |
| 686 |
| 687 // Ensure unlinked bundles. |
| 688 manager.getUnlinkedBundles(context); |
| 689 await manager.onUnlinkedComplete; |
| 690 |
| 691 // Try to link. |
| 692 // All bundles 'aaa' and 'bbb' and 'ccc' are linked. |
| 693 // The name 'C2' in 'b.dart' is not resolved. |
| 694 // We have the corresponding unlinked bundle, and it is full, so if it does |
| 695 // not have the library 'package:ccc/c2.dart', this means that this library |
| 696 // does not exist in 'ccc' at all. |
| 697 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 698 expect(linkedPackages, hasLength(3)); |
| 699 |
| 700 // package:aaa |
| 701 { |
| 702 LinkedPubPackage linkedPackage = linkedPackages |
| 703 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); |
| 704 _assertHasLinkedVariable(linkedPackage, 'a', 'B', |
| 705 expectedTypeNameUri: 'package:bbb/b.dart'); |
| 706 } |
| 707 |
| 708 // package:bbb |
| 709 { |
| 710 LinkedPubPackage linkedPackage = linkedPackages |
| 711 .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb'); |
| 712 _assertHasLinkedVariable(linkedPackage, 'b1', 'int', |
| 713 expectedTypeNameUri: 'dart:core'); |
| 714 _assertHasLinkedVariable(linkedPackage, 'b2', 'C2', |
| 715 expectedToBeResolved: false); |
| 716 } |
| 717 |
| 718 // package:ccc |
| 719 { |
| 720 LinkedPubPackage linkedPackage = linkedPackages |
| 721 .singleWhere((linkedPackage) => linkedPackage.package.name == 'ccc'); |
| 722 _assertHasLinkedVariable(linkedPackage, 'c', 'int', |
| 723 expectedTypeNameUri: 'dart:core'); |
| 724 } |
| 725 } |
| 726 |
| 727 test_getLinkedBundles_noCycle() async { |
| 728 resourceProvider.newFile( |
| 729 '$CACHE/aaa/lib/a.dart', |
| 730 ''' |
| 731 class A {} |
| 732 int a; |
| 733 '''); |
| 734 resourceProvider.newFile( |
| 735 '$CACHE/bbb/lib/b.dart', |
| 736 ''' |
| 737 import 'package:aaa/a.dart'; |
| 738 A b; |
| 739 '''); |
| 740 |
| 741 // Configure packages resolution. |
| 742 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 743 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 744 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 745 sdkResolver, |
| 746 resourceResolver, |
| 747 new PackageMapUriResolver(resourceProvider, { |
| 748 'aaa': [libFolderA], |
| 749 'bbb': [libFolderB], |
| 750 }) |
| 751 ]); |
| 752 |
| 753 // Ensure unlinked bundles. |
| 754 manager.getUnlinkedBundles(context); |
| 755 await manager.onUnlinkedComplete; |
| 756 |
| 757 // Now we should be able to get linked bundles. |
| 758 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 759 expect(linkedPackages, hasLength(2)); |
| 760 |
| 761 // package:aaa |
| 762 { |
| 763 LinkedPubPackage linkedPackage = linkedPackages |
| 764 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); |
| 765 _assertHasLinkedVariable(linkedPackage, 'a', 'int', |
| 766 expectedTypeNameUri: 'dart:core'); |
| 767 } |
| 768 |
| 769 // package:bbb |
| 770 { |
| 771 LinkedPubPackage linkedPackage = linkedPackages |
| 772 .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb'); |
| 773 _assertHasLinkedVariable(linkedPackage, 'b', 'A', |
| 774 expectedTypeNameUri: 'package:aaa/a.dart'); |
| 775 } |
| 776 } |
| 777 |
| 778 test_getLinkedBundles_noCycle_relativeUri() async { |
| 779 resourceProvider.newFile( |
| 780 '$CACHE/aaa/lib/a.dart', |
| 781 ''' |
| 782 import 'src/a2.dart'; |
| 783 A a; |
| 784 '''); |
| 785 resourceProvider.newFile( |
| 786 '$CACHE/aaa/lib/src/a2.dart', |
| 787 ''' |
| 788 class A {} |
| 789 '''); |
| 790 |
| 791 // Configure packages resolution. |
| 792 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 793 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 794 sdkResolver, |
| 795 resourceResolver, |
| 796 new PackageMapUriResolver(resourceProvider, { |
| 797 'aaa': [libFolderA], |
| 798 }) |
| 799 ]); |
| 800 |
| 801 // Ensure unlinked bundles. |
| 802 manager.getUnlinkedBundles(context); |
| 803 await manager.onUnlinkedComplete; |
| 804 |
| 805 // Link. |
| 806 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 807 expect(linkedPackages, hasLength(1)); |
| 808 |
| 809 // package:aaa |
| 810 { |
| 811 LinkedPubPackage linkedPackage = linkedPackages |
| 812 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); |
| 813 _assertHasLinkedVariable(linkedPackage, 'a', 'A', |
| 814 expectedTypeNameUri: 'src/a2.dart'); |
| 815 } |
| 816 } |
| 817 |
| 818 test_getLinkedBundles_noCycle_withExport() async { |
| 819 resourceProvider.newFile( |
| 820 '$CACHE/aaa/lib/a.dart', |
| 821 ''' |
| 822 import 'package:bbb/b.dart'; |
| 823 C a; |
| 824 '''); |
| 825 resourceProvider.newFile( |
| 826 '$CACHE/bbb/lib/b.dart', |
| 827 ''' |
| 828 export 'package:ccc/c.dart'; |
| 829 '''); |
| 830 resourceProvider.newFile( |
| 831 '$CACHE/ccc/lib/c.dart', |
| 832 ''' |
| 833 class C {} |
| 834 '''); |
| 835 |
| 836 // Configure packages resolution. |
| 837 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 838 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 839 Folder libFolderC = resourceProvider.newFolder('$CACHE/ccc/lib'); |
| 840 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 841 sdkResolver, |
| 842 resourceResolver, |
| 843 new PackageMapUriResolver(resourceProvider, { |
| 844 'aaa': [libFolderA], |
| 845 'bbb': [libFolderB], |
| 846 'ccc': [libFolderC], |
| 847 }) |
| 848 ]); |
| 849 |
| 850 // Ensure unlinked bundles. |
| 851 manager.getUnlinkedBundles(context); |
| 852 await manager.onUnlinkedComplete; |
| 853 |
| 854 // Now we should be able to get linked bundles. |
| 855 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 856 expect(linkedPackages, hasLength(3)); |
| 857 |
| 858 // package:aaa |
| 859 { |
| 860 LinkedPubPackage linkedPackage = linkedPackages |
| 861 .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa'); |
| 862 _assertHasLinkedVariable(linkedPackage, 'a', 'C', |
| 863 expectedTypeNameUri: 'package:ccc/c.dart'); |
| 864 } |
| 865 } |
| 866 |
| 867 test_getLinkedBundles_wrongScheme() async { |
| 868 resourceProvider.newFile( |
| 869 '$CACHE/aaa/lib/a.dart', |
| 870 ''' |
| 871 import 'xxx:yyy/zzz.dart'; |
| 872 int a1; |
| 873 Z a2; |
| 874 '''); |
| 875 |
| 876 // Configure packages resolution. |
| 877 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 878 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 879 sdkResolver, |
| 880 resourceResolver, |
| 881 new PackageMapUriResolver(resourceProvider, { |
| 882 'aaa': [libFolderA], |
| 883 }) |
| 884 ]); |
| 885 |
| 886 // Ensure unlinked bundles. |
| 887 manager.getUnlinkedBundles(context); |
| 888 await manager.onUnlinkedComplete; |
| 889 |
| 890 // Try to link. |
| 891 // The package 'aaa' is not linked. |
| 892 // We don't know how to handle the URI scheme 'xxx'. |
| 893 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 894 expect(linkedPackages, hasLength(0)); |
| 895 } |
| 896 |
| 897 test_getPackageName() { |
| 898 String getPackageName(String uriStr) { |
| 899 return PubSummaryManager.getPackageName(uriStr); |
| 900 } |
| 901 |
| 902 expect(getPackageName('package:foo/bar.dart'), 'foo'); |
| 903 expect(getPackageName('package:foo/bar/baz.dart'), 'foo'); |
| 904 expect(getPackageName('wrong:foo/bar.dart'), isNull); |
| 905 expect(getPackageName('package:foo'), isNull); |
| 906 } |
| 907 |
| 908 test_getUnlinkedBundles() async { |
| 909 // Create package files. |
| 910 resourceProvider.newFile( |
| 911 '$CACHE/aaa/lib/a.dart', |
| 912 ''' |
| 913 class A {} |
| 914 '''); |
| 915 resourceProvider.newFile( |
| 916 '$CACHE/aaa/lib/src/a2.dart', |
| 917 ''' |
| 918 class A2 {} |
| 919 '''); |
| 920 resourceProvider.newFile( |
| 921 '$CACHE/bbb/lib/b.dart', |
| 922 ''' |
| 923 class B {} |
| 924 '''); |
| 925 |
| 926 // Configure packages resolution. |
| 927 Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 928 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 929 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 930 sdkResolver, |
| 931 resourceResolver, |
| 932 new PackageMapUriResolver(resourceProvider, { |
| 933 'aaa': [libFolderA], |
| 934 'bbb': [libFolderB], |
| 935 }) |
| 936 ]); |
| 937 |
| 938 // No unlinked bundles yet. |
| 939 { |
| 940 Map<PubPackage, PackageBundle> bundles = |
| 941 manager.getUnlinkedBundles(context); |
| 942 expect(bundles, isEmpty); |
| 943 } |
| 944 |
| 945 // The requested unlinked bundles must be available after the wait. |
| 946 await manager.onUnlinkedComplete; |
| 947 { |
| 948 Map<PubPackage, PackageBundle> bundles = |
| 949 manager.getUnlinkedBundles(context); |
| 950 expect(bundles, hasLength(2)); |
| 951 { |
| 952 PackageBundle bundle = _getBundleByPackageName(bundles, 'aaa'); |
| 953 expect(bundle.linkedLibraryUris, isEmpty); |
| 954 expect(bundle.unlinkedUnitUris, |
| 955 ['package:aaa/a.dart', 'package:aaa/src/a2.dart']); |
| 956 expect(bundle.unlinkedUnits, hasLength(2)); |
| 957 expect(bundle.unlinkedUnits[0].classes.map((c) => c.name), ['A']); |
| 958 expect(bundle.unlinkedUnits[1].classes.map((c) => c.name), ['A2']); |
| 959 } |
| 960 { |
| 961 PackageBundle bundle = _getBundleByPackageName(bundles, 'bbb'); |
| 962 expect(bundle.linkedLibraryUris, isEmpty); |
| 963 expect(bundle.unlinkedUnitUris, ['package:bbb/b.dart']); |
| 964 expect(bundle.unlinkedUnits, hasLength(1)); |
| 965 expect(bundle.unlinkedUnits[0].classes.map((c) => c.name), ['B']); |
| 966 } |
| 967 } |
| 968 |
| 969 // The files must be created. |
| 970 _assertFileExists(libFolderA.parent, PubSummaryManager.UNLINKED_NAME); |
| 971 _assertFileExists(libFolderA.parent, PubSummaryManager.UNLINKED_SPEC_NAME); |
| 972 _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_NAME); |
| 973 _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_SPEC_NAME); |
| 974 } |
| 975 |
| 976 test_getUnlinkedBundles_inconsistent_majorVersion() async { |
| 977 // Create package files. |
| 978 resourceProvider.newFile( |
| 979 '$CACHE/aaa/lib/a.dart', |
| 980 ''' |
| 981 class A {} |
| 982 '''); |
| 983 |
| 984 // Configure packages resolution. |
| 985 Folder libFolder = resourceProvider.newFolder('$CACHE/aaa/lib'); |
| 986 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 987 sdkResolver, |
| 988 resourceResolver, |
| 989 new PackageMapUriResolver(resourceProvider, { |
| 990 'aaa': [libFolder], |
| 991 }) |
| 992 ]); |
| 993 |
| 994 /** |
| 995 * Verify that the [manager] has exactly one cache bundle `aaa`. |
| 996 */ |
| 997 void _assertSingleBundle() { |
| 998 Map<PubPackage, PackageBundle> bundles = |
| 999 manager.getUnlinkedBundles(context); |
| 1000 expect(bundles, hasLength(1)); |
| 1001 PackageBundle bundle = _getBundleByPackageName(bundles, 'aaa'); |
| 1002 expect(bundle.unlinkedUnitUris, ['package:aaa/a.dart']); |
| 1003 } |
| 1004 |
| 1005 // Compute the bundle using a non-default major version. |
| 1006 _createManager(majorVersion: 12345); |
| 1007 manager.getUnlinkedBundles(context); |
| 1008 await manager.onUnlinkedComplete; |
| 1009 _assertSingleBundle(); |
| 1010 |
| 1011 // Recompute when using the default major version. |
| 1012 _createManager(); |
| 1013 expect(manager.getUnlinkedBundles(context), isEmpty); |
| 1014 |
| 1015 // Wait for the bundle to be computed. |
| 1016 await manager.onUnlinkedComplete; |
| 1017 _assertSingleBundle(); |
| 1018 _assertFileExists(libFolder.parent, PubSummaryManager.UNLINKED_NAME); |
| 1019 _assertFileExists(libFolder.parent, PubSummaryManager.UNLINKED_SPEC_NAME); |
| 1020 |
| 1021 // Can read from the file again. |
| 1022 _createManager(); |
| 1023 _assertSingleBundle(); |
| 1024 } |
| 1025 |
| 1026 test_getUnlinkedBundles_notPubCache_dontCreate() async { |
| 1027 String aaaPath = '/Users/user/projects/aaa'; |
| 1028 // Create package files. |
| 1029 resourceProvider.newFile( |
| 1030 '$aaaPath/lib/a.dart', |
| 1031 ''' |
| 1032 class A {} |
| 1033 '''); |
| 1034 resourceProvider.newFile( |
| 1035 '$CACHE/bbb/lib/b.dart', |
| 1036 ''' |
| 1037 class B {} |
| 1038 '''); |
| 1039 |
| 1040 // Configure packages resolution. |
| 1041 Folder libFolderA = resourceProvider.getFolder('$aaaPath/lib'); |
| 1042 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 1043 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 1044 sdkResolver, |
| 1045 resourceResolver, |
| 1046 new PackageMapUriResolver(resourceProvider, { |
| 1047 'aaa': [libFolderA], |
| 1048 'bbb': [libFolderB], |
| 1049 }) |
| 1050 ]); |
| 1051 |
| 1052 // No unlinked bundles initially. |
| 1053 { |
| 1054 Map<PubPackage, PackageBundle> bundles = |
| 1055 manager.getUnlinkedBundles(context); |
| 1056 expect(bundles, isEmpty); |
| 1057 } |
| 1058 |
| 1059 // Wait for unlinked bundles to be computed. |
| 1060 await manager.onUnlinkedComplete; |
| 1061 Map<PubPackage, PackageBundle> bundles = |
| 1062 manager.getUnlinkedBundles(context); |
| 1063 // We have just one bundle - for 'bbb'. |
| 1064 expect(bundles, hasLength(1)); |
| 1065 // We computed the unlinked bundle for 'bbb'. |
| 1066 { |
| 1067 PackageBundle bundle = _getBundleByPackageName(bundles, 'bbb'); |
| 1068 expect(bundle.linkedLibraryUris, isEmpty); |
| 1069 expect(bundle.unlinkedUnitUris, ['package:bbb/b.dart']); |
| 1070 expect(bundle.unlinkedUnits, hasLength(1)); |
| 1071 expect(bundle.unlinkedUnits[0].classes.map((c) => c.name), ['B']); |
| 1072 } |
| 1073 |
| 1074 // The files must be created. |
| 1075 _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_NAME); |
| 1076 _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_SPEC_NAME); |
| 1077 } |
| 1078 |
| 1079 test_getUnlinkedBundles_notPubCache_useExisting() async { |
| 1080 String aaaPath = '/Users/user/projects/aaa'; |
| 1081 // Create package files. |
| 1082 { |
| 1083 File file = resourceProvider.newFile( |
| 1084 '$aaaPath/lib/a.dart', |
| 1085 ''' |
| 1086 class A {} |
| 1087 '''); |
| 1088 PackageBundleAssembler assembler = new PackageBundleAssembler() |
| 1089 ..addUnlinkedUnit( |
| 1090 file.createSource(FastUri.parse('package:aaa/a.dart')), |
| 1091 new UnlinkedUnitBuilder()); |
| 1092 resourceProvider.newFileWithBytes( |
| 1093 '$aaaPath/${PubSummaryManager.UNLINKED_SPEC_NAME}', |
| 1094 assembler.assemble().toBuffer()); |
| 1095 } |
| 1096 resourceProvider.newFile( |
| 1097 '$CACHE/bbb/lib/b.dart', |
| 1098 ''' |
| 1099 class B {} |
| 1100 '''); |
| 1101 |
| 1102 // Configure packages resolution. |
| 1103 Folder libFolderA = resourceProvider.getFolder('$aaaPath/lib'); |
| 1104 Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib'); |
| 1105 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 1106 sdkResolver, |
| 1107 resourceResolver, |
| 1108 new PackageMapUriResolver(resourceProvider, { |
| 1109 'aaa': [libFolderA], |
| 1110 'bbb': [libFolderB], |
| 1111 }) |
| 1112 ]); |
| 1113 |
| 1114 // Request already available unlinked bundles. |
| 1115 { |
| 1116 Map<PubPackage, PackageBundle> bundles = |
| 1117 manager.getUnlinkedBundles(context); |
| 1118 expect(bundles, hasLength(1)); |
| 1119 // We get the unlinked bundle for 'aaa' because it already exists. |
| 1120 { |
| 1121 PackageBundle bundle = _getBundleByPackageName(bundles, 'aaa'); |
| 1122 expect(bundle, isNotNull); |
| 1123 } |
| 1124 } |
| 1125 |
| 1126 // Wait for unlinked bundles to be computed. |
| 1127 await manager.onUnlinkedComplete; |
| 1128 Map<PubPackage, PackageBundle> bundles = |
| 1129 manager.getUnlinkedBundles(context); |
| 1130 expect(bundles, hasLength(2)); |
| 1131 // We still have the unlinked bundle for 'aaa'. |
| 1132 { |
| 1133 PackageBundle bundle = _getBundleByPackageName(bundles, 'aaa'); |
| 1134 expect(bundle, isNotNull); |
| 1135 } |
| 1136 // We computed the unlinked bundle for 'bbb'. |
| 1137 { |
| 1138 PackageBundle bundle = _getBundleByPackageName(bundles, 'bbb'); |
| 1139 expect(bundle.linkedLibraryUris, isEmpty); |
| 1140 expect(bundle.unlinkedUnitUris, ['package:bbb/b.dart']); |
| 1141 expect(bundle.unlinkedUnits, hasLength(1)); |
| 1142 expect(bundle.unlinkedUnits[0].classes.map((c) => c.name), ['B']); |
| 1143 } |
| 1144 |
| 1145 // The files must be created. |
| 1146 _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_NAME); |
| 1147 _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_SPEC_NAME); |
| 1148 } |
| 1149 |
| 1150 test_getUnlinkedBundles_notPubCache_useExisting_inconsistent() async { |
| 1151 String aaaPath = '/Users/user/projects/aaa'; |
| 1152 // Create package files. |
| 1153 resourceProvider.newFile( |
| 1154 '$aaaPath/lib/a.dart', |
| 1155 ''' |
| 1156 class A {} |
| 1157 '''); |
| 1158 |
| 1159 // Compute the bundles. |
| 1160 Folder libFolderA = resourceProvider.getFolder('$aaaPath/lib'); |
| 1161 await new PubSummaryManager(resourceProvider, '_.temp') |
| 1162 .computeUnlinkedForFolder('aaa', libFolderA); |
| 1163 |
| 1164 // Configure packages resolution. |
| 1165 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 1166 sdkResolver, |
| 1167 resourceResolver, |
| 1168 new PackageMapUriResolver(resourceProvider, { |
| 1169 'aaa': [libFolderA], |
| 1170 }) |
| 1171 ]); |
| 1172 |
| 1173 // Request already available unlinked bundles. |
| 1174 expect(manager.getUnlinkedBundles(context), hasLength(1)); |
| 1175 |
| 1176 // Update a Dart file. |
| 1177 // So, the cached bundle cannot be reused. |
| 1178 resourceProvider.updateFile( |
| 1179 '$aaaPath/lib/a.dart', |
| 1180 ''' |
| 1181 class A2 {} |
| 1182 '''); |
| 1183 _createManager(); |
| 1184 expect(manager.getUnlinkedBundles(context), isEmpty); |
| 1185 |
| 1186 // ...and because it is not in the pub cache, it will not be recomputed. |
| 1187 await manager.onUnlinkedComplete; |
| 1188 expect(manager.getUnlinkedBundles(context), isEmpty); |
| 1189 } |
| 1190 |
| 1191 test_getUnlinkedBundles_nullPackageMap() async { |
| 1192 context.sourceFactory = |
| 1193 new SourceFactory(<UriResolver>[sdkResolver, resourceResolver]); |
| 1194 Map<PubPackage, PackageBundle> bundles = |
| 1195 manager.getUnlinkedBundles(context); |
| 1196 expect(bundles, isEmpty); |
| 1197 } |
| 1198 |
| 1199 test_isPathInPubCache_posix() { |
| 1200 expect( |
| 1201 PubSummaryManager.isPathInPubCache(pathos.posix, |
| 1202 '/home/.pub-cache/hosted/pub.dartlang.org/foo/lib/bar.dart'), |
| 1203 isTrue); |
| 1204 expect( |
| 1205 PubSummaryManager.isPathInPubCache( |
| 1206 pathos.posix, '/home/.pub-cache/foo/lib/bar.dart'), |
| 1207 isTrue); |
| 1208 expect( |
| 1209 PubSummaryManager.isPathInPubCache( |
| 1210 pathos.posix, '/home/sources/dart/foo/lib/bar.dart'), |
| 1211 isFalse); |
| 1212 } |
| 1213 |
| 1214 test_isPathInPubCache_windows() { |
| 1215 expect( |
| 1216 PubSummaryManager.isPathInPubCache(pathos.windows, |
| 1217 r'C:\Users\user\Setters\Pub\Cache\hosted\foo\lib\bar.dart'), |
| 1218 isTrue); |
| 1219 expect( |
| 1220 PubSummaryManager.isPathInPubCache( |
| 1221 pathos.windows, r'C:\Users\user\Sources\Dart\foo\lib\bar.dart'), |
| 1222 isFalse); |
| 1223 } |
| 1224 |
| 1225 void _assertFileExists(Folder folder, String fileName) { |
| 1226 expect(folder.getChildAssumingFile(fileName).exists, isTrue); |
| 1227 } |
| 1228 |
| 1229 void _assertHasLinkedVariable(LinkedPubPackage linkedPackage, |
| 1230 String variableName, String expectedTypeName, |
| 1231 {bool expectedToBeResolved: true, |
| 1232 String expectedTypeNameUri: 'shouldBeSpecifiedIfResolved'}) { |
| 1233 PackageBundle unlinked = linkedPackage.unlinked; |
| 1234 PackageBundle linked = linkedPackage.linked; |
| 1235 expect(unlinked, isNotNull); |
| 1236 expect(linked, isNotNull); |
| 1237 for (int i = 0; i < unlinked.unlinkedUnitUris.length; i++) { |
| 1238 String unlinkedUnitUri = unlinked.unlinkedUnitUris[i]; |
| 1239 UnlinkedUnit unlinkedUnit = unlinked.unlinkedUnits[i]; |
| 1240 for (UnlinkedVariable v in unlinkedUnit.variables) { |
| 1241 if (v.name == variableName) { |
| 1242 int typeNameReference = v.type.reference; |
| 1243 expect(unlinkedUnit.references[typeNameReference].name, |
| 1244 expectedTypeName); |
| 1245 for (int j = 0; j < linked.linkedLibraryUris.length; j++) { |
| 1246 String linkedLibraryUri = linked.linkedLibraryUris[j]; |
| 1247 if (linkedLibraryUri == unlinkedUnitUri) { |
| 1248 LinkedLibrary linkedLibrary = linked.linkedLibraries[j]; |
| 1249 LinkedUnit linkedUnit = linkedLibrary.units.single; |
| 1250 int typeNameDependency = |
| 1251 linkedUnit.references[typeNameReference].dependency; |
| 1252 if (expectedToBeResolved) { |
| 1253 expect(linkedLibrary.dependencies[typeNameDependency].uri, |
| 1254 expectedTypeNameUri); |
| 1255 } else { |
| 1256 expect(typeNameDependency, isZero); |
| 1257 } |
| 1258 return; |
| 1259 } |
| 1260 } |
| 1261 fail('Cannot find linked unit for $variableName in $linkedPackage'); |
| 1262 } |
| 1263 } |
| 1264 } |
| 1265 fail('Cannot find variable $variableName in $linkedPackage'); |
| 1266 } |
| 1267 |
| 1268 void _createManager( |
| 1269 {bool allowLinking: true, |
| 1270 int majorVersion: PackageBundleAssembler.currentMajorVersion}) { |
| 1271 manager = new PubSummaryManager(resourceProvider, '_.temp', |
| 1272 allowLinking: allowLinking, majorVersion: majorVersion); |
| 1273 } |
| 1274 |
| 1275 LinkedPubPackage _getLinkedPackage( |
| 1276 List<LinkedPubPackage> packages, String name) { |
| 1277 return packages |
| 1278 .singleWhere((linkedPackage) => linkedPackage.package.name == name); |
| 1279 } |
| 1280 |
| 1281 _testImpl_getLinkedBundles_cached_declaredVariables( |
| 1282 String importOrExport) async { |
| 1283 String pathA = '$CACHE/aaa/lib'; |
| 1284 resourceProvider.newFile('$pathA/foo.dart', 'class A {}'); |
| 1285 resourceProvider.newFile('$pathA/foo_io.dart', 'class A {}'); |
| 1286 resourceProvider.newFile('$pathA/foo_html.dart', 'class A {}'); |
| 1287 resourceProvider.newFile( |
| 1288 '$pathA/user.dart', |
| 1289 ''' |
| 1290 $importOrExport 'foo.dart' |
| 1291 if (dart.library.io) 'foo_io.dart' |
| 1292 if (dart.library.html) 'foo_html.dart'; |
| 1293 '''); |
| 1294 // Configure packages resolution. |
| 1295 Folder libFolderA = resourceProvider.newFolder(pathA); |
| 1296 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 1297 sdkResolver, |
| 1298 resourceResolver, |
| 1299 new PackageMapUriResolver(resourceProvider, { |
| 1300 'aaa': [libFolderA], |
| 1301 }) |
| 1302 ]); |
| 1303 |
| 1304 void _assertDependencyInUser(PackageBundle bundle, String shortName) { |
| 1305 for (var i = 0; i < bundle.linkedLibraryUris.length; i++) { |
| 1306 if (bundle.linkedLibraryUris[i].endsWith('user.dart')) { |
| 1307 LinkedLibrary library = bundle.linkedLibraries[i]; |
| 1308 expect(library.dependencies.map((d) => d.uri), |
| 1309 unorderedEquals(['', 'dart:core', shortName])); |
| 1310 return; |
| 1311 } |
| 1312 } |
| 1313 fail('Not found user.dart in $bundle'); |
| 1314 } |
| 1315 |
| 1316 // Session 1. |
| 1317 // Create the linked bundle and cache it in a file. |
| 1318 { |
| 1319 // Ensure unlinked bundles. |
| 1320 manager.getUnlinkedBundles(context); |
| 1321 await manager.onUnlinkedComplete; |
| 1322 |
| 1323 // Now we should be able to get the linked bundle. |
| 1324 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 1325 expect(linkedPackages, hasLength(1)); |
| 1326 } |
| 1327 |
| 1328 // Session 2. |
| 1329 // Recreate manager and don't allow it to perform new linking. |
| 1330 // Set a declared variable, which is not used in the package. |
| 1331 // We still can get the cached linked bundle. |
| 1332 { |
| 1333 context.declaredVariables.define('not.used.variable', 'baz'); |
| 1334 _createManager(allowLinking: false); |
| 1335 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 1336 expect(linkedPackages, hasLength(1)); |
| 1337 _assertDependencyInUser(linkedPackages.single.linked, 'foo.dart'); |
| 1338 } |
| 1339 |
| 1340 // Session 3. |
| 1341 // Recreate manager and don't allow it to perform new linking. |
| 1342 // Set the value of a referenced declared variable. |
| 1343 // So, we cannot use the previously cached linked bundle. |
| 1344 { |
| 1345 context.declaredVariables.define('dart.library.io', 'does-not-matter'); |
| 1346 _createManager(allowLinking: false); |
| 1347 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 1348 expect(linkedPackages, isEmpty); |
| 1349 } |
| 1350 |
| 1351 // Session 4. |
| 1352 // Enable new linking, and configure to use 'foo_html.dart'. |
| 1353 { |
| 1354 context.declaredVariables.define('dart.library.html', 'true'); |
| 1355 _createManager(); |
| 1356 List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context); |
| 1357 expect(linkedPackages, hasLength(1)); |
| 1358 _assertDependencyInUser(linkedPackages.single.linked, 'foo_html.dart'); |
| 1359 } |
| 1360 } |
| 1361 |
| 1362 static PackageBundle _getBundleByPackageName( |
| 1363 Map<PubPackage, PackageBundle> bundles, String name) { |
| 1364 PubPackage package = |
| 1365 bundles.keys.singleWhere((package) => package.name == name); |
| 1366 return bundles[package]; |
| 1367 } |
| 1368 } |
| OLD | NEW |