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

Side by Side Diff: pkg/analysis_server/test/context_manager_test.dart

Issue 679763002: Add package root support to analysis server. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library test.context.directory.manager; 5 library test.context.directory.manager;
6 6
7 import 'package:analysis_server/src/context_manager.dart'; 7 import 'package:analysis_server/src/context_manager.dart';
8 import 'reflective_tests.dart'; 8 import 'reflective_tests.dart';
9 import 'package:analyzer/file_system/file_system.dart'; 9 import 'package:analyzer/file_system/file_system.dart';
10 import 'package:analyzer/file_system/memory_file_system.dart'; 10 import 'package:analyzer/file_system/memory_file_system.dart';
11 import 'package:analyzer/source/package_map_provider.dart'; 11 import 'package:analyzer/source/package_map_provider.dart';
12 import 'package:analyzer/source/package_map_resolver.dart';
12 import 'package:analyzer/src/generated/engine.dart'; 13 import 'package:analyzer/src/generated/engine.dart';
13 import 'package:analyzer/src/generated/source.dart'; 14 import 'package:analyzer/src/generated/source.dart';
15 import 'package:analyzer/src/generated/source_io.dart';
14 import 'package:path/path.dart'; 16 import 'package:path/path.dart';
15 import 'package:unittest/unittest.dart'; 17 import 'package:unittest/unittest.dart';
16 18
17 import 'mocks.dart'; 19 import 'mocks.dart';
18 20
19 21
20 main() { 22 main() {
21 groupSep = ' | '; 23 groupSep = ' | ';
22 runReflectiveTests(ContextManagerTest); 24 runReflectiveTests(ContextManagerTest);
23 } 25 }
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 }, 185 },
184 }; 186 };
185 // set roots 187 // set roots
186 manager.setRoots(<String>[root], <String>[], <String, String>{}); 188 manager.setRoots(<String>[root], <String>[], <String, String>{});
187 manager.assertContextPaths([root, subProjectA, subProjectB]); 189 manager.assertContextPaths([root, subProjectA, subProjectB]);
188 // verify files 190 // verify files
189 manager.assertContextFiles(root, [rootFile]); 191 manager.assertContextFiles(root, [rootFile]);
190 manager.assertContextFiles(subProjectA, [subProjectA_file]); 192 manager.assertContextFiles(subProjectA, [subProjectA_file]);
191 manager.assertContextFiles(subProjectB, [subProjectB_file]); 193 manager.assertContextFiles(subProjectB, [subProjectB_file]);
192 // verify package maps 194 // verify package maps
193 expect( 195 _checkPackageMap(root, equals(packageMapProvider.packageMaps[root]));
194 manager.currentContextPackageMaps[root], 196 _checkPackageMap(subProjectA,
195 equals(packageMapProvider.packageMaps[root]));
196 expect(
197 manager.currentContextPackageMaps[subProjectA],
198 equals(packageMapProvider.packageMaps[subProjectA])); 197 equals(packageMapProvider.packageMaps[subProjectA]));
199 expect( 198 _checkPackageMap(subProjectB,
200 manager.currentContextPackageMaps[subProjectB],
201 equals(packageMapProvider.packageMaps[subProjectB])); 199 equals(packageMapProvider.packageMaps[subProjectB]));
202 } 200 }
203 201
204 void test_setRoots_addFolderWithoutPubspec() { 202 void test_setRoots_addFolderWithoutPubspec() {
205 packageMapProvider.packageMap = null; 203 packageMapProvider.packageMap = null;
206 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 204 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
207 // verify 205 // verify
208 expect(manager.currentContextPaths, hasLength(1)); 206 expect(manager.currentContextPaths, hasLength(1));
209 expect(manager.currentContextPaths, contains(projPath)); 207 expect(manager.currentContextPaths, contains(projPath));
210 expect(manager.currentContextFilePaths[projPath], hasLength(0)); 208 expect(manager.currentContextFilePaths[projPath], hasLength(0));
211 } 209 }
212 210
211 void test_setRoots_addPackageRoot() {
212 String packagePathFoo = '/package1/foo';
213 String packageRootPath = '/package2/foo';
214 Folder packageFolder = resourceProvider.newFolder(packagePathFoo);
215 packageMapProvider.packageMap = {
216 'foo': [packageFolder]
217 };
218 List<String> includedPaths = <String>[projPath];
219 List<String> excludedPaths = <String>[];
220 manager.setRoots(includedPaths, excludedPaths, <String, String>{});
221 _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
222 manager.setRoots(includedPaths, excludedPaths,
223 <String, String>{ projPath: packageRootPath });
224 _checkPackageRoot(projPath, equals(packageRootPath));
225 }
226
227 void test_setRoots_changePackageRoot() {
228 String packageRootPath1 = '/package1';
229 String packageRootPath2 = '/package2';
230 List<String> includedPaths = <String>[projPath];
231 List<String> excludedPaths = <String>[];
232 manager.setRoots(includedPaths, excludedPaths,
233 <String, String>{ projPath: packageRootPath1 });
234 _checkPackageRoot(projPath, equals(packageRootPath1));
235 manager.setRoots(includedPaths, excludedPaths,
236 <String, String>{ projPath: packageRootPath2 });
237 _checkPackageRoot(projPath, equals(packageRootPath2));
238 }
239
213 void test_setRoots_exclude_newRoot_withExcludedFile() { 240 void test_setRoots_exclude_newRoot_withExcludedFile() {
214 // prepare paths 241 // prepare paths
215 String project = '/project'; 242 String project = '/project';
216 String file1 = '$project/file1.dart'; 243 String file1 = '$project/file1.dart';
217 String file2 = '$project/file2.dart'; 244 String file2 = '$project/file2.dart';
218 // create files 245 // create files
219 resourceProvider.newFile(file1, '// 1'); 246 resourceProvider.newFile(file1, '// 1');
220 resourceProvider.newFile(file2, '// 2'); 247 resourceProvider.newFile(file2, '// 2');
221 // set roots 248 // set roots
222 manager.setRoots(<String>[project], <String>[file1], <String, String>{}); 249 manager.setRoots(<String>[project], <String>[file1], <String, String>{});
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 manager.assertContextFiles(subProject, [subFile]); 363 manager.assertContextFiles(subProject, [subFile]);
337 } 364 }
338 365
339 void test_setRoots_newlyAddedFoldersGetProperPackageMap() { 366 void test_setRoots_newlyAddedFoldersGetProperPackageMap() {
340 String packagePath = '/package/foo'; 367 String packagePath = '/package/foo';
341 Folder packageFolder = resourceProvider.newFolder(packagePath); 368 Folder packageFolder = resourceProvider.newFolder(packagePath);
342 packageMapProvider.packageMap = { 369 packageMapProvider.packageMap = {
343 'foo': [packageFolder] 370 'foo': [packageFolder]
344 }; 371 };
345 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 372 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
346 expect( 373 _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
347 manager.currentContextPackageMaps[projPath], 374 }
348 equals(packageMapProvider.packageMap)); 375
376 void test_setRoots_newFolderWithPackageRoot() {
377 String packageRootPath = '/package';
378 manager.setRoots(<String>[projPath], <String>[],
379 <String, String>{ projPath: packageRootPath });
380 _checkPackageRoot(projPath, equals(packageRootPath));
349 } 381 }
350 382
351 void test_setRoots_removeFolderWithPubspec() { 383 void test_setRoots_removeFolderWithPubspec() {
352 // create a pubspec 384 // create a pubspec
353 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); 385 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
354 resourceProvider.newFile(pubspecPath, 'pubspec'); 386 resourceProvider.newFile(pubspecPath, 'pubspec');
355 // add one root - there is a context 387 // add one root - there is a context
356 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 388 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
357 expect(manager.currentContextPaths, hasLength(1)); 389 expect(manager.currentContextPaths, hasLength(1));
358 // set empty roots - no contexts 390 // set empty roots - no contexts
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 packageMapProvider.packageMap = null; 431 packageMapProvider.packageMap = null;
400 // add one root - there is a context 432 // add one root - there is a context
401 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 433 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
402 expect(manager.currentContextPaths, hasLength(1)); 434 expect(manager.currentContextPaths, hasLength(1));
403 // set empty roots - no contexts 435 // set empty roots - no contexts
404 manager.setRoots(<String>[], <String>[], <String, String>{}); 436 manager.setRoots(<String>[], <String>[], <String, String>{});
405 expect(manager.currentContextPaths, hasLength(0)); 437 expect(manager.currentContextPaths, hasLength(0));
406 expect(manager.currentContextFilePaths, hasLength(0)); 438 expect(manager.currentContextFilePaths, hasLength(0));
407 } 439 }
408 440
441 void test_setRoots_removePackageRoot() {
442 String packagePathFoo = '/package1/foo';
443 String packageRootPath = '/package2/foo';
444 Folder packageFolder = resourceProvider.newFolder(packagePathFoo);
445 packageMapProvider.packageMap = {
446 'foo': [packageFolder]
447 };
448 List<String> includedPaths = <String>[projPath];
449 List<String> excludedPaths = <String>[];
450 manager.setRoots(includedPaths, excludedPaths,
451 <String, String>{ projPath: packageRootPath });
452 _checkPackageRoot(projPath, equals(packageRootPath));
453 manager.setRoots(includedPaths, excludedPaths, <String, String>{});
454 _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
455 }
456
409 test_watch_addDummyLink() { 457 test_watch_addDummyLink() {
410 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 458 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
411 // empty folder initially 459 // empty folder initially
412 Map<String, int> filePaths = manager.currentContextFilePaths[projPath]; 460 Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
413 expect(filePaths, isEmpty); 461 expect(filePaths, isEmpty);
414 // add link 462 // add link
415 String filePath = posix.join(projPath, 'foo.dart'); 463 String filePath = posix.join(projPath, 'foo.dart');
416 resourceProvider.newDummyLink(filePath); 464 resourceProvider.newDummyLink(filePath);
417 // the link was ignored 465 // the link was ignored
418 return pumpEventQueue().then((_) { 466 return pumpEventQueue().then((_) {
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 test_watch_modifyPackageMapDependency() { 671 test_watch_modifyPackageMapDependency() {
624 // create a dependency file 672 // create a dependency file
625 String dependencyPath = posix.join(projPath, 'dep'); 673 String dependencyPath = posix.join(projPath, 'dep');
626 resourceProvider.newFile(dependencyPath, 'contents'); 674 resourceProvider.newFile(dependencyPath, 'contents');
627 packageMapProvider.dependencies.add(dependencyPath); 675 packageMapProvider.dependencies.add(dependencyPath);
628 // create a Dart file 676 // create a Dart file
629 String dartFilePath = posix.join(projPath, 'main.dart'); 677 String dartFilePath = posix.join(projPath, 'main.dart');
630 resourceProvider.newFile(dartFilePath, 'contents'); 678 resourceProvider.newFile(dartFilePath, 'contents');
631 // the created context has the expected empty package map 679 // the created context has the expected empty package map
632 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 680 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
633 expect(manager.currentContextPackageMaps[projPath], isEmpty); 681 _checkPackageMap(projPath, isEmpty);
634 // configure package map 682 // configure package map
635 String packagePath = '/package/foo'; 683 String packagePath = '/package/foo';
636 resourceProvider.newFolder(packagePath); 684 resourceProvider.newFolder(packagePath);
637 packageMapProvider.packageMap = { 685 packageMapProvider.packageMap = {
638 'foo': projPath 686 'foo': projPath
639 }; 687 };
640 // Changing a .dart file in the project shouldn't cause a new 688 // Changing a .dart file in the project shouldn't cause a new
641 // package map to be picked up. 689 // package map to be picked up.
642 resourceProvider.modifyFile(dartFilePath, 'new contents'); 690 resourceProvider.modifyFile(dartFilePath, 'new contents');
643 return pumpEventQueue().then((_) { 691 return pumpEventQueue().then((_) {
644 expect(manager.currentContextPackageMaps[projPath], isEmpty); 692 _checkPackageMap(projPath, isEmpty);
645 // However, changing the package map dependency should. 693 // However, changing the package map dependency should.
646 resourceProvider.modifyFile(dependencyPath, 'new contents'); 694 resourceProvider.modifyFile(dependencyPath, 'new contents');
647 return pumpEventQueue().then((_) { 695 return pumpEventQueue().then((_) {
648 expect( 696 _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
649 manager.currentContextPackageMaps[projPath],
650 equals(packageMapProvider.packageMap));
651 }); 697 });
652 }); 698 });
653 } 699 }
654 700
655 test_watch_modifyPackageMapDependency_fail() { 701 test_watch_modifyPackageMapDependency_fail() {
656 // create a dependency file 702 // create a dependency file
657 String dependencyPath = posix.join(projPath, 'dep'); 703 String dependencyPath = posix.join(projPath, 'dep');
658 resourceProvider.newFile(dependencyPath, 'contents'); 704 resourceProvider.newFile(dependencyPath, 'contents');
659 packageMapProvider.dependencies.add(dependencyPath); 705 packageMapProvider.dependencies.add(dependencyPath);
660 // create a Dart file 706 // create a Dart file
661 String dartFilePath = posix.join(projPath, 'main.dart'); 707 String dartFilePath = posix.join(projPath, 'main.dart');
662 resourceProvider.newFile(dartFilePath, 'contents'); 708 resourceProvider.newFile(dartFilePath, 'contents');
663 // the created context has the expected empty package map 709 // the created context has the expected empty package map
664 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 710 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
665 expect(manager.currentContextPackageMaps[projPath], isEmpty); 711 _checkPackageMap(projPath, isEmpty);
666 // Change the package map dependency so that the packageMapProvider is 712 // Change the package map dependency so that the packageMapProvider is
667 // re-run, and arrange for it to return null from computePackageMap(). 713 // re-run, and arrange for it to return null from computePackageMap().
668 packageMapProvider.packageMap = null; 714 packageMapProvider.packageMap = null;
669 resourceProvider.modifyFile(dependencyPath, 'new contents'); 715 resourceProvider.modifyFile(dependencyPath, 'new contents');
670 return pumpEventQueue().then((_) { 716 return pumpEventQueue().then((_) {
671 // The package map should have been changed to null. 717 // The package map should have been changed to null.
672 expect(manager.currentContextPackageMaps[projPath], isNull); 718 _checkPackageMap(projPath, isNull);
673 }); 719 });
674 } 720 }
721
722 /**
723 * Verify that package URI's for source files in [path] will be resolved
724 * using a package map matching [expectation].
725 */
726 void _checkPackageMap(String path, expectation) {
727 UriResolver resolver = manager.currentContextPackageUriResolvers[path];
728 expect(resolver, new isInstanceOf<PackageMapUriResolver>());
729 PackageMapUriResolver packageMapUriResolver = resolver;
730 expect(packageMapUriResolver.packageMap, expectation);
731 }
732
733 /**
734 * Verify that package URI's for source files in [path] will be resolved
735 * using a package root maching [expectation].
736 */
737 void _checkPackageRoot(String path, expectation) {
738 UriResolver resolver = manager.currentContextPackageUriResolvers[path];
739 expect(resolver, new isInstanceOf<PackageUriResolver>());
740 PackageUriResolver packageUriResolver = resolver;
741 expect(packageUriResolver.packagesDirectory_forTesting, expectation);
742 }
675 } 743 }
676 744
677 745
678 class TestContextManager extends ContextManager { 746 class TestContextManager extends ContextManager {
679 /** 747 /**
680 * Source of timestamps stored in [currentContextFilePaths]. 748 * Source of timestamps stored in [currentContextFilePaths].
681 */ 749 */
682 int now = 0; 750 int now = 0;
683 751
684 /** 752 /**
685 * Map from context to the timestamp when the context was created. 753 * Map from context to the timestamp when the context was created.
686 */ 754 */
687 Map<String, int> currentContextTimestamps = <String, int>{}; 755 Map<String, int> currentContextTimestamps = <String, int>{};
688 756
689 /** 757 /**
690 * Iterable of the paths to contexts that currently exist. 758 * Iterable of the paths to contexts that currently exist.
691 */ 759 */
692 Iterable<String> get currentContextPaths => currentContextTimestamps.keys; 760 Iterable<String> get currentContextPaths => currentContextTimestamps.keys;
693 761
694 /** 762 /**
695 * Map from context to (map from file path to timestamp of last event). 763 * Map from context to (map from file path to timestamp of last event).
696 */ 764 */
697 final Map<String, Map<String, int>> currentContextFilePaths = <String, 765 final Map<String, Map<String, int>> currentContextFilePaths = <String,
698 Map<String, int>>{}; 766 Map<String, int>>{};
699 767
700 /** 768 /**
701 * Map from context to package map. 769 * Map from context to package URI resolver.
702 */ 770 */
703 final Map<String, Map<String, List<Folder>>> currentContextPackageMaps = 771 final Map<String, UriResolver> currentContextPackageUriResolvers =
704 <String, Map<String, List<Folder>>>{}; 772 <String, UriResolver>{};
705 773
706 TestContextManager(MemoryResourceProvider resourceProvider, 774 TestContextManager(MemoryResourceProvider resourceProvider,
707 PackageMapProvider packageMapProvider) 775 PackageMapProvider packageMapProvider)
708 : super(resourceProvider, packageMapProvider); 776 : super(resourceProvider, packageMapProvider);
709 777
710 @override 778 @override
711 void addContext(Folder folder, Map<String, List<Folder>> packageMap) { 779 void addContext(Folder folder, UriResolver packageUriResolver) {
712 String path = folder.path; 780 String path = folder.path;
713 expect(currentContextPaths, isNot(contains(path))); 781 expect(currentContextPaths, isNot(contains(path)));
714 currentContextTimestamps[path] = now; 782 currentContextTimestamps[path] = now;
715 currentContextFilePaths[path] = <String, int>{}; 783 currentContextFilePaths[path] = <String, int>{};
716 currentContextPackageMaps[path] = packageMap; 784 currentContextPackageUriResolvers[path] = packageUriResolver;
717 } 785 }
718 786
719 @override 787 @override
720 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) { 788 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
721 Map<String, int> filePaths = currentContextFilePaths[contextFolder.path]; 789 Map<String, int> filePaths = currentContextFilePaths[contextFolder.path];
722 for (Source source in changeSet.addedSources) { 790 for (Source source in changeSet.addedSources) {
723 expect(filePaths, isNot(contains(source.fullName))); 791 expect(filePaths, isNot(contains(source.fullName)));
724 filePaths[source.fullName] = now; 792 filePaths[source.fullName] = now;
725 } 793 }
726 for (Source source in changeSet.removedSources) { 794 for (Source source in changeSet.removedSources) {
(...skipping 14 matching lines...) Expand all
741 void assertContextPaths(List<String> expected) { 809 void assertContextPaths(List<String> expected) {
742 expect(currentContextPaths, unorderedEquals(expected)); 810 expect(currentContextPaths, unorderedEquals(expected));
743 } 811 }
744 812
745 @override 813 @override
746 void removeContext(Folder folder) { 814 void removeContext(Folder folder) {
747 String path = folder.path; 815 String path = folder.path;
748 expect(currentContextPaths, contains(path)); 816 expect(currentContextPaths, contains(path));
749 currentContextTimestamps.remove(path); 817 currentContextTimestamps.remove(path);
750 currentContextFilePaths.remove(path); 818 currentContextFilePaths.remove(path);
751 currentContextPackageMaps.remove(path); 819 currentContextPackageUriResolvers.remove(path);
752 } 820 }
753 821
754 @override 822 @override
755 void updateContextPackageMap(Folder contextFolder, Map<String, 823 void updateContextPackageUriResolver(Folder contextFolder,
756 List<Folder>> packageMap) { 824 UriResolver packageUriResolver) {
757 currentContextPackageMaps[contextFolder.path] = packageMap; 825 currentContextPackageUriResolvers[contextFolder.path] = packageUriResolver;
758 } 826 }
759 } 827 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698