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

Side by Side Diff: packages/analyzer/test/src/summary/pub_summary_test.dart

Issue 2990843002: Removed fixed dependencies (Closed)
Patch Set: Created 3 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 unified diff | Download patch
OLDNEW
(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 }
OLDNEW
« no previous file with comments | « packages/analyzer/test/src/summary/prelinker_test.dart ('k') | packages/analyzer/test/src/summary/resynthesize_ast_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698