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

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

Issue 1242023008: Server .packages support. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: More merging/nits. Created 5 years, 5 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
« no previous file with comments | « pkg/analysis_server/lib/src/context_manager.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analysis_server/src/context_manager.dart'; 9 import 'package:analysis_server/src/context_manager.dart';
10 import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.d art'; 10 import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.d art';
11 import 'package:analysis_server/uri/resolver_provider.dart'; 11 import 'package:analysis_server/uri/resolver_provider.dart';
12 import 'package:analyzer/file_system/file_system.dart'; 12 import 'package:analyzer/file_system/file_system.dart';
13 import 'package:analyzer/file_system/memory_file_system.dart'; 13 import 'package:analyzer/file_system/memory_file_system.dart';
14 import 'package:analyzer/instrumentation/instrumentation.dart'; 14 import 'package:analyzer/instrumentation/instrumentation.dart';
15 import 'package:analyzer/source/package_map_resolver.dart'; 15 import 'package:analyzer/source/package_map_resolver.dart';
16 import 'package:analyzer/src/generated/engine.dart'; 16 import 'package:analyzer/src/generated/engine.dart';
17 import 'package:analyzer/src/generated/source.dart'; 17 import 'package:analyzer/src/generated/source.dart';
18 import 'package:analyzer/src/generated/source_io.dart'; 18 import 'package:analyzer/src/generated/source_io.dart';
19 import 'package:package_config/packages.dart';
19 import 'package:path/path.dart'; 20 import 'package:path/path.dart';
20 import 'package:test_reflective_loader/test_reflective_loader.dart'; 21 import 'package:test_reflective_loader/test_reflective_loader.dart';
21 import 'package:unittest/unittest.dart'; 22 import 'package:unittest/unittest.dart';
22 23
23 import 'mocks.dart'; 24 import 'mocks.dart';
24 25
25 main() { 26 main() {
26 groupSep = ' | '; 27 groupSep = ' | ';
27 defineReflectiveTests(AbstractContextManagerTest); 28 defineReflectiveTests(AbstractContextManagerTest);
28 } 29 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 UriResolver providePackageResolver(Folder folder) { 80 UriResolver providePackageResolver(Folder folder) {
80 return packageResolver; 81 return packageResolver;
81 } 82 }
82 83
83 void setUp() { 84 void setUp() {
84 resourceProvider = new MemoryResourceProvider(); 85 resourceProvider = new MemoryResourceProvider();
85 packageMapProvider = new MockPackageMapProvider(); 86 packageMapProvider = new MockPackageMapProvider();
86 manager = new TestContextManager( 87 manager = new TestContextManager(
87 resourceProvider, providePackageResolver, packageMapProvider); 88 resourceProvider, providePackageResolver, packageMapProvider);
88 resourceProvider.newFolder(projPath); 89 resourceProvider.newFolder(projPath);
90 AbstractContextManager.ENABLE_PACKAGESPEC_SUPPORT = true;
91 }
92
93 void tearDown() {
94 AbstractContextManager.ENABLE_PACKAGESPEC_SUPPORT = false;
89 } 95 }
90 96
91 test_ignoreFilesInPackagesFolder() { 97 test_ignoreFilesInPackagesFolder() {
92 // create a context with a pubspec.yaml file 98 // create a context with a pubspec.yaml file
93 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); 99 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
94 resourceProvider.newFile(pubspecPath, 'pubspec'); 100 resourceProvider.newFile(pubspecPath, 'pubspec');
95 // create a file in the "packages" folder 101 // create a file in the "packages" folder
96 String filePath1 = posix.join(projPath, 'packages', 'file1.dart'); 102 String filePath1 = posix.join(projPath, 'packages', 'file1.dart');
97 resourceProvider.newFile(filePath1, 'contents'); 103 resourceProvider.newFile(filePath1, 'contents');
98 // "packages" files are ignored initially 104 // "packages" files are ignored initially
(...skipping 23 matching lines...) Expand all
122 void test_isInAnalysisRoot_inRoot() { 128 void test_isInAnalysisRoot_inRoot() {
123 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 129 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
124 expect(manager.isInAnalysisRoot('$projPath/test.dart'), isTrue); 130 expect(manager.isInAnalysisRoot('$projPath/test.dart'), isTrue);
125 } 131 }
126 132
127 void test_isInAnalysisRoot_notInRoot() { 133 void test_isInAnalysisRoot_notInRoot() {
128 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 134 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
129 expect(manager.isInAnalysisRoot('/test.dart'), isFalse); 135 expect(manager.isInAnalysisRoot('/test.dart'), isFalse);
130 } 136 }
131 137
138 test_refresh_folder_with_packagespec() {
139 // create a context with a .packages file
140 String packagespecFile = posix.join(projPath, '.packages');
141 resourceProvider.newFile(packagespecFile, '');
142 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
143 return pumpEventQueue().then((_) {
144 expect(manager.currentContextPaths.toList(), [projPath]);
145 manager.now++;
146 manager.refresh(null);
147 return pumpEventQueue().then((_) {
148 expect(manager.currentContextPaths.toList(), [projPath]);
149 expect(manager.currentContextTimestamps[projPath], manager.now);
150 });
151 });
152 }
153
154 test_refresh_folder_with_packagespec_subfolders() {
155 // Create a folder with no .packages file, containing two subfolders with
156 // .packages files.
157 String subdir1Path = posix.join(projPath, 'subdir1');
158 String subdir2Path = posix.join(projPath, 'subdir2');
159 String packagespec1Path = posix.join(subdir1Path, '.packages');
160 String packagespec2Path = posix.join(subdir2Path, '.packages');
161 resourceProvider.newFile(packagespec1Path, '');
162 resourceProvider.newFile(packagespec2Path, '');
163 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
164 return pumpEventQueue().then((_) {
165 expect(manager.currentContextPaths.toSet(),
166 [subdir1Path, subdir2Path, projPath].toSet());
167 manager.now++;
168 manager.refresh(null);
169 return pumpEventQueue().then((_) {
170 expect(manager.currentContextPaths.toSet(),
171 [subdir1Path, subdir2Path, projPath].toSet());
172 expect(manager.currentContextTimestamps[projPath], manager.now);
173 expect(manager.currentContextTimestamps[subdir1Path], manager.now);
174 expect(manager.currentContextTimestamps[subdir2Path], manager.now);
175 });
176 });
177 }
178
132 test_refresh_folder_with_pubspec() { 179 test_refresh_folder_with_pubspec() {
133 // create a context with a pubspec.yaml file 180 // create a context with a pubspec.yaml file
134 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); 181 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
135 resourceProvider.newFile(pubspecPath, 'pubspec'); 182 resourceProvider.newFile(pubspecPath, 'pubspec');
136 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 183 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
137 return pumpEventQueue().then((_) { 184 return pumpEventQueue().then((_) {
138 expect(manager.currentContextPaths.toList(), [projPath]); 185 expect(manager.currentContextPaths.toList(), [projPath]);
139 manager.now++; 186 manager.now++;
140 manager.refresh(null); 187 manager.refresh(null);
141 return pumpEventQueue().then((_) { 188 return pumpEventQueue().then((_) {
(...skipping 27 matching lines...) Expand all
169 }); 216 });
170 }); 217 });
171 } 218 }
172 219
173 test_path_filter() async { 220 test_path_filter() async {
174 // Setup context. 221 // Setup context.
175 Folder root = resourceProvider.newFolder(projPath); 222 Folder root = resourceProvider.newFolder(projPath);
176 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 223 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
177 expect(manager.currentContextFilePaths[projPath], isEmpty); 224 expect(manager.currentContextFilePaths[projPath], isEmpty);
178 // Set ignore patterns for context. 225 // Set ignore patterns for context.
179 manager.setIgnorePatternsForContext(root, 226 manager.setIgnorePatternsForContext(
180 ['sdk_ext/**', 'lib/ignoreme.dart']); 227 root, ['sdk_ext/**', 'lib/ignoreme.dart']);
181 // Start creating files. 228 // Start creating files.
182 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]); 229 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]);
183 String libPath = newFolder([projPath, LIB_NAME]); 230 String libPath = newFolder([projPath, LIB_NAME]);
184 newFile([libPath, 'main.dart']); 231 newFile([libPath, 'main.dart']);
185 newFile([libPath, 'ignoreme.dart']); 232 newFile([libPath, 'ignoreme.dart']);
186 String sdkExtPath = newFolder([projPath, 'sdk_ext']); 233 String sdkExtPath = newFolder([projPath, 'sdk_ext']);
187 newFile([sdkExtPath, 'entry.dart']); 234 newFile([sdkExtPath, 'entry.dart']);
188 String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); 235 String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']);
189 newFile([sdkExtSrcPath, 'part.dart']); 236 newFile([sdkExtSrcPath, 'part.dart']);
190 // Pump event loop so new files are discovered and added to context. 237 // Pump event loop so new files are discovered and added to context.
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 325
279 void test_setRoots_addFolderWithDummyLink() { 326 void test_setRoots_addFolderWithDummyLink() {
280 String filePath = posix.join(projPath, 'foo.dart'); 327 String filePath = posix.join(projPath, 'foo.dart');
281 resourceProvider.newDummyLink(filePath); 328 resourceProvider.newDummyLink(filePath);
282 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 329 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
283 // verify 330 // verify
284 var filePaths = manager.currentContextFilePaths[projPath]; 331 var filePaths = manager.currentContextFilePaths[projPath];
285 expect(filePaths, isEmpty); 332 expect(filePaths, isEmpty);
286 } 333 }
287 334
335 void test_setRoots_addFolderWithNestedPackageSpec() {
336 String examplePath = newFolder([projPath, EXAMPLE_NAME]);
337 String libPath = newFolder([projPath, LIB_NAME]);
338
339 newFile([projPath, AbstractContextManager.PACKAGE_SPEC_NAME]);
340 newFile([libPath, 'main.dart']);
341 newFile([examplePath, AbstractContextManager.PACKAGE_SPEC_NAME]);
342 newFile([examplePath, 'example.dart']);
343
344 packageMapProvider.packageMap['proj'] =
345 [resourceProvider.getResource(libPath)];
346
347 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
348
349 expect(manager.currentContextPaths, hasLength(2));
350
351 expect(manager.currentContextPaths, contains(projPath));
352 Set<Source> projSources = manager.currentContextSources[projPath];
353 expect(projSources, hasLength(1));
354 expect(projSources.first.uri.toString(), 'file:///my/proj/lib/main.dart');
355
356 expect(manager.currentContextPaths, contains(examplePath));
357 Set<Source> exampleSources = manager.currentContextSources[examplePath];
358 expect(exampleSources, hasLength(1));
359 expect(exampleSources.first.uri.toString(),
360 'file:///my/proj/example/example.dart');
361 }
362
288 void test_setRoots_addFolderWithNestedPubspec() { 363 void test_setRoots_addFolderWithNestedPubspec() {
289 String examplePath = newFolder([projPath, EXAMPLE_NAME]); 364 String examplePath = newFolder([projPath, EXAMPLE_NAME]);
290 String libPath = newFolder([projPath, LIB_NAME]); 365 String libPath = newFolder([projPath, LIB_NAME]);
291 366
292 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]); 367 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]);
293 newFile([libPath, 'main.dart']); 368 newFile([libPath, 'main.dart']);
294 newFile([examplePath, AbstractContextManager.PUBSPEC_NAME]); 369 newFile([examplePath, AbstractContextManager.PUBSPEC_NAME]);
295 newFile([examplePath, 'example.dart']); 370 newFile([examplePath, 'example.dart']);
296 371
297 packageMapProvider.packageMap['proj'] = 372 packageMapProvider.packageMap['proj'] =
(...skipping 17 matching lines...) Expand all
315 390
316 void test_setRoots_addFolderWithoutPubspec() { 391 void test_setRoots_addFolderWithoutPubspec() {
317 packageMapProvider.packageMap = null; 392 packageMapProvider.packageMap = null;
318 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 393 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
319 // verify 394 // verify
320 expect(manager.currentContextPaths, hasLength(1)); 395 expect(manager.currentContextPaths, hasLength(1));
321 expect(manager.currentContextPaths, contains(projPath)); 396 expect(manager.currentContextPaths, contains(projPath));
322 expect(manager.currentContextFilePaths[projPath], hasLength(0)); 397 expect(manager.currentContextFilePaths[projPath], hasLength(0));
323 } 398 }
324 399
400 void test_setRoots_addFolderWithPackagespec() {
401 String packagespecPath = posix.join(projPath, '.packages');
402 resourceProvider.newFile(packagespecPath,
403 'unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/');
404 String libPath = newFolder([projPath, LIB_NAME]);
405 File mainFile =
406 resourceProvider.newFile(posix.join(libPath, 'main.dart'), '');
407 Source source = mainFile.createSource();
408
409 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
410
411 // verify
412 expect(manager.currentContextPaths, hasLength(1));
413 expect(manager.currentContextPaths, contains(projPath));
414 expect(manager.currentContextFilePaths[projPath], hasLength(1));
415
416 // smoketest resolution
417 SourceFactory sourceFactory = manager.currentContext.sourceFactory;
418 Source resolvedSource =
419 sourceFactory.resolveUri(source, 'package:unittest/unittest.dart');
420 expect(resolvedSource, isNotNull);
421 expect(resolvedSource.fullName,
422 equals('/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart'));
423 }
424
325 void test_setRoots_addFolderWithPubspec() { 425 void test_setRoots_addFolderWithPubspec() {
326 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); 426 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
327 resourceProvider.newFile(pubspecPath, 'pubspec'); 427 resourceProvider.newFile(pubspecPath, 'pubspec');
328 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 428 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
329 // verify 429 // verify
330 expect(manager.currentContextPaths, hasLength(1)); 430 expect(manager.currentContextPaths, hasLength(1));
331 expect(manager.currentContextPaths, contains(projPath)); 431 expect(manager.currentContextPaths, contains(projPath));
332 expect(manager.currentContextFilePaths[projPath], hasLength(0)); 432 expect(manager.currentContextFilePaths[projPath], hasLength(0));
333 } 433 }
334 434
435 void test_setRoots_addFolderWithPubspec_andPackagespec() {
436 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
437 String packagespecPath = posix.join(projPath, '.packages');
438 resourceProvider.newFile(pubspecPath, 'pubspec');
439 resourceProvider.newFile(packagespecPath, '');
440 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
441 // verify
442 manager.assertContextPaths([projPath]);
443 }
444
335 void test_setRoots_addFolderWithPubspecAndLib() { 445 void test_setRoots_addFolderWithPubspecAndLib() {
336 String binPath = newFolder([projPath, BIN_NAME]); 446 String binPath = newFolder([projPath, BIN_NAME]);
337 String libPath = newFolder([projPath, LIB_NAME]); 447 String libPath = newFolder([projPath, LIB_NAME]);
338 String srcPath = newFolder([libPath, SRC_NAME]); 448 String srcPath = newFolder([libPath, SRC_NAME]);
339 String testPath = newFolder([projPath, TEST_NAME]); 449 String testPath = newFolder([projPath, TEST_NAME]);
340 450
341 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]); 451 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]);
342 String appPath = newFile([binPath, 'app.dart']); 452 String appPath = newFile([binPath, 'app.dart']);
343 newFile([libPath, 'main.dart']); 453 newFile([libPath, 'main.dart']);
344 newFile([srcPath, 'internal.dart']); 454 newFile([srcPath, 'internal.dart']);
345 String testFilePath = newFile([testPath, 'main_test.dart']); 455 String testFilePath = newFile([testPath, 'main_test.dart']);
346 456
347 packageMapProvider.packageMap['proj'] = 457 packageMapProvider.packageMap['proj'] =
348 [resourceProvider.getResource(libPath)]; 458 [resourceProvider.getResource(libPath)];
349 459
350 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 460 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
351 Set<Source> sources = manager.currentContextSources[projPath]; 461 Set<Source> sources = manager.currentContextSources[projPath];
352 462
353 expect(manager.currentContextPaths, hasLength(1)); 463 expect(manager.currentContextPaths, hasLength(1));
354 expect(manager.currentContextPaths, contains(projPath)); 464 expect(manager.currentContextPaths, contains(projPath));
355 expect(sources, hasLength(4)); 465 expect(sources, hasLength(4));
356 List<String> uris = 466 List<String> uris =
357 sources.map((Source source) => source.uri.toString()).toList(); 467 sources.map((Source source) => source.uri.toString()).toList();
358 expect(uris, contains('file://$appPath')); 468 expect(uris, contains('file://$appPath'));
359 expect(uris, contains('package:proj/main.dart')); 469 expect(uris, contains('package:proj/main.dart'));
360 expect(uris, contains('package:proj/src/internal.dart')); 470 expect(uris, contains('package:proj/src/internal.dart'));
361 expect(uris, contains('file://$testFilePath')); 471 expect(uris, contains('file://$testFilePath'));
362 } 472 }
363 473
474 void test_setRoots_addFolderWithPubspecAndPackagespecFolders() {
475 // prepare paths
476 String root = '/root';
477 String rootFile = '$root/root.dart';
478 String subProjectA = '$root/sub/aaa';
479 String subProjectB = '$root/sub/sub2/bbb';
480 String subProjectA_file = '$subProjectA/bin/a.dart';
481 String subProjectB_file = '$subProjectB/bin/b.dart';
482 // create files
483 resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec');
484 resourceProvider.newFile('$subProjectB/pubspec.yaml', 'pubspec');
485 resourceProvider.newFile('$subProjectA/.packages', '');
486 resourceProvider.newFile('$subProjectB/.packages', '');
487
488 resourceProvider.newFile(rootFile, 'library root;');
489 resourceProvider.newFile(subProjectA_file, 'library a;');
490 resourceProvider.newFile(subProjectB_file, 'library b;');
491
492 // set roots
493 manager.setRoots(<String>[root], <String>[], <String, String>{});
494 manager.assertContextPaths([root, subProjectA, subProjectB]);
495 // verify files
496 manager.assertContextFiles(root, [rootFile]);
497 manager.assertContextFiles(subProjectA, [subProjectA_file]);
498 manager.assertContextFiles(subProjectB, [subProjectB_file]);
499 }
500
364 void test_setRoots_addFolderWithPubspecFolders() { 501 void test_setRoots_addFolderWithPubspecFolders() {
365 // prepare paths 502 // prepare paths
366 String root = '/root'; 503 String root = '/root';
367 String rootFile = '$root/root.dart'; 504 String rootFile = '$root/root.dart';
368 String subProjectA = '$root/sub/aaa'; 505 String subProjectA = '$root/sub/aaa';
369 String subProjectB = '$root/sub/sub2/bbb'; 506 String subProjectB = '$root/sub/sub2/bbb';
370 String subProjectA_file = '$subProjectA/bin/a.dart'; 507 String subProjectA_file = '$subProjectA/bin/a.dart';
371 String subProjectB_file = '$subProjectB/bin/b.dart'; 508 String subProjectB_file = '$subProjectB/bin/b.dart';
372 // create files 509 // create files
373 resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec'); 510 resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec');
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 packageMapProvider.packageMap = null; 723 packageMapProvider.packageMap = null;
587 // add one root - there is a context 724 // add one root - there is a context
588 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 725 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
589 expect(manager.currentContextPaths, hasLength(1)); 726 expect(manager.currentContextPaths, hasLength(1));
590 // set empty roots - no contexts 727 // set empty roots - no contexts
591 manager.setRoots(<String>[], <String>[], <String, String>{}); 728 manager.setRoots(<String>[], <String>[], <String, String>{});
592 expect(manager.currentContextPaths, hasLength(0)); 729 expect(manager.currentContextPaths, hasLength(0));
593 expect(manager.currentContextFilePaths, hasLength(0)); 730 expect(manager.currentContextFilePaths, hasLength(0));
594 } 731 }
595 732
733 void test_setRoots_removeFolderWithPackagespec() {
734 // create a pubspec
735 String pubspecPath = posix.join(projPath, '.packages');
736 resourceProvider.newFile(pubspecPath, '');
737 // add one root - there is a context
738 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
739 expect(manager.currentContextPaths, hasLength(1));
740 // set empty roots - no contexts
741 manager.setRoots(<String>[], <String>[], <String, String>{});
742 expect(manager.currentContextPaths, hasLength(0));
743 expect(manager.currentContextFilePaths, hasLength(0));
744 }
745
746 void test_setRoots_removeFolderWithPackagespecFolder() {
747 // prepare paths
748 String projectA = '/projectA';
749 String projectB = '/projectB';
750 String subProjectA = '$projectA/sub';
751 String subProjectB = '$projectB/sub';
752 String projectA_file = '$projectA/a.dart';
753 String projectB_file = '$projectB/a.dart';
754 String subProjectA_pubspec = '$subProjectA/.packages';
755 String subProjectB_pubspec = '$subProjectB/.packages';
756 String subProjectA_file = '$subProjectA/bin/sub_a.dart';
757 String subProjectB_file = '$subProjectB/bin/sub_b.dart';
758 // create files
759 resourceProvider.newFile(projectA_file, '// a');
760 resourceProvider.newFile(projectB_file, '// b');
761 resourceProvider.newFile(subProjectA_pubspec, '');
762 resourceProvider.newFile(subProjectB_pubspec, '');
763 resourceProvider.newFile(subProjectA_file, '// sub-a');
764 resourceProvider.newFile(subProjectB_file, '// sub-b');
765 // set roots
766 manager.setRoots(
767 <String>[projectA, projectB], <String>[], <String, String>{});
768 manager.assertContextPaths([projectA, subProjectA, projectB, subProjectB]);
769 manager.assertContextFiles(projectA, [projectA_file]);
770 manager.assertContextFiles(projectB, [projectB_file]);
771 manager.assertContextFiles(subProjectA, [subProjectA_file]);
772 manager.assertContextFiles(subProjectB, [subProjectB_file]);
773 // remove "projectB"
774 manager.setRoots(<String>[projectA], <String>[], <String, String>{});
775 manager.assertContextPaths([projectA, subProjectA]);
776 manager.assertContextFiles(projectA, [projectA_file]);
777 manager.assertContextFiles(subProjectA, [subProjectA_file]);
778 }
779
596 void test_setRoots_removeFolderWithPubspec() { 780 void test_setRoots_removeFolderWithPubspec() {
597 // create a pubspec 781 // create a pubspec
598 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); 782 String pubspecPath = posix.join(projPath, 'pubspec.yaml');
599 resourceProvider.newFile(pubspecPath, 'pubspec'); 783 resourceProvider.newFile(pubspecPath, 'pubspec');
600 // add one root - there is a context 784 // add one root - there is a context
601 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); 785 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
602 expect(manager.currentContextPaths, hasLength(1)); 786 expect(manager.currentContextPaths, hasLength(1));
603 // set empty roots - no contexts 787 // set empty roots - no contexts
604 manager.setRoots(<String>[], <String>[], <String, String>{}); 788 manager.setRoots(<String>[], <String>[], <String, String>{});
605 expect(manager.currentContextPaths, hasLength(0)); 789 expect(manager.currentContextPaths, hasLength(0));
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 // add file in subfolder 897 // add file in subfolder
714 String filePath = posix.join(projPath, 'foo', 'bar.dart'); 898 String filePath = posix.join(projPath, 'foo', 'bar.dart');
715 resourceProvider.newFile(filePath, 'contents'); 899 resourceProvider.newFile(filePath, 'contents');
716 // the file was added 900 // the file was added
717 return pumpEventQueue().then((_) { 901 return pumpEventQueue().then((_) {
718 expect(filePaths, hasLength(1)); 902 expect(filePaths, hasLength(1));
719 expect(filePaths, contains(filePath)); 903 expect(filePaths, contains(filePath));
720 }); 904 });
721 } 905 }
722 906
907 test_watch_addPackagespec_toRoot() {
908 // prepare paths
909 String root = '/root';
910 String rootFile = '$root/root.dart';
911 String rootPackagespec = '$root/.packages';
912 // create files
913 resourceProvider.newFile(rootFile, 'library root;');
914 // set roots
915 manager.setRoots(<String>[root], <String>[], <String, String>{});
916 manager.assertContextPaths([root]);
917 // verify files
918 manager.assertContextFiles(root, [rootFile]);
919 // add packagespec - still just one root
920 resourceProvider.newFile(rootPackagespec, '');
921 return pumpEventQueue().then((_) {
922 manager.assertContextPaths([root]);
923 manager.assertContextFiles(root, [rootFile]);
924 // TODO(pquitslund): verify that a new source factory is created --
925 // likely this will need to happen in a corresponding ServerContextManager Test.
926 });
927 }
928
929 test_watch_addPackagespec_toSubFolder() {
930 // prepare paths
931 String root = '/root';
932 String rootFile = '$root/root.dart';
933 String subProject = '$root/sub/aaa';
934 String subPubspec = '$subProject/.packages';
935 String subFile = '$subProject/bin/a.dart';
936 // create files
937 resourceProvider.newFile(rootFile, 'library root;');
938 resourceProvider.newFile(subFile, 'library a;');
939 // set roots
940 manager.setRoots(<String>[root], <String>[], <String, String>{});
941 manager.assertContextPaths([root]);
942 // verify files
943 manager.assertContextFiles(root, [rootFile, subFile]);
944 // add .packages
945 resourceProvider.newFile(subPubspec, '');
946 return pumpEventQueue().then((_) {
947 manager.assertContextPaths([root, subProject]);
948 manager.assertContextFiles(root, [rootFile]);
949 manager.assertContextFiles(subProject, [subFile]);
950 });
951 }
952
953 test_watch_addPackagespec_toSubFolder_ofSubFolder() {
954 // prepare paths
955 String root = '/root';
956 String rootFile = '$root/root.dart';
957 String subProject = '$root/sub';
958 String subPubspec = '$subProject/.packages';
959 String subFile = '$subProject/bin/sub.dart';
960 String subSubPubspec = '$subProject/subsub/.packages';
961 // create files
962 resourceProvider.newFile(rootFile, 'library root;');
963 resourceProvider.newFile(subPubspec, '');
964 resourceProvider.newFile(subFile, 'library sub;');
965 // set roots
966 manager.setRoots(<String>[root], <String>[], <String, String>{});
967 manager.assertContextPaths([root, subProject]);
968 manager.assertContextFiles(root, [rootFile]);
969 manager.assertContextFiles(subProject, [subFile]);
970 // add pubspec - ignore, because is already in a packagespec-based context
971 resourceProvider.newFile(subSubPubspec, '');
972 return pumpEventQueue().then((_) {
973 manager.assertContextPaths([root, subProject]);
974 manager.assertContextFiles(root, [rootFile]);
975 manager.assertContextFiles(subProject, [subFile]);
976 });
977 }
978
979 test_watch_addPackagespec_toSubFolder_withPubspec() {
980 // prepare paths
981 String root = '/root';
982 String rootFile = '$root/root.dart';
983 String subProject = '$root/sub/aaa';
984 String subPackagespec = '$subProject/.packages';
985 String subPubspec = '$subProject/pubspec.yaml';
986 String subFile = '$subProject/bin/a.dart';
987 // create files
988 resourceProvider.newFile(subPubspec, 'pubspec');
989 resourceProvider.newFile(rootFile, 'library root;');
990 resourceProvider.newFile(subFile, 'library a;');
991 // set roots
992 manager.setRoots(<String>[root], <String>[], <String, String>{});
993 manager.assertContextPaths([root, subProject]);
994 // verify files
995 manager.assertContextFiles(root, [rootFile]);
996 manager.assertContextFiles(subProject, [subFile]);
997
998 // add .packages
999 resourceProvider.newFile(subPackagespec, '');
1000 return pumpEventQueue().then((_) {
1001 // Should NOT create another context.
1002 manager.assertContextPaths([root, subProject]);
1003 manager.assertContextFiles(root, [rootFile]);
1004 manager.assertContextFiles(subProject, [subFile]);
1005 });
1006 }
1007
723 test_watch_addPubspec_toRoot() { 1008 test_watch_addPubspec_toRoot() {
724 // prepare paths 1009 // prepare paths
725 String root = '/root'; 1010 String root = '/root';
726 String rootFile = '$root/root.dart'; 1011 String rootFile = '$root/root.dart';
727 String rootPubspec = '$root/pubspec.yaml'; 1012 String rootPubspec = '$root/pubspec.yaml';
728 // create files 1013 // create files
729 resourceProvider.newFile(rootFile, 'library root;'); 1014 resourceProvider.newFile(rootFile, 'library root;');
730 // set roots 1015 // set roots
731 manager.setRoots(<String>[root], <String>[], <String, String>{}); 1016 manager.setRoots(<String>[root], <String>[], <String, String>{});
732 manager.assertContextPaths([root]); 1017 manager.assertContextPaths([root]);
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 expect(projFolder.exists, isTrue); 1110 expect(projFolder.exists, isTrue);
826 // delete the folder 1111 // delete the folder
827 resourceProvider.deleteFolder(projPath); 1112 resourceProvider.deleteFolder(projPath);
828 return pumpEventQueue().then((_) { 1113 return pumpEventQueue().then((_) {
829 expect(file.exists, isFalse); 1114 expect(file.exists, isFalse);
830 expect(projFolder.exists, isFalse); 1115 expect(projFolder.exists, isFalse);
831 return expect(filePaths, hasLength(0)); 1116 return expect(filePaths, hasLength(0));
832 }); 1117 });
833 } 1118 }
834 1119
1120 test_watch_deletePackagespec_fromRoot() {
1121 // prepare paths
1122 String root = '/root';
1123 String rootPubspec = '$root/.packages';
1124 String rootFile = '$root/root.dart';
1125 // create files
1126 resourceProvider.newFile(rootPubspec, '');
1127 resourceProvider.newFile(rootFile, 'library root;');
1128 // set roots
1129 manager.setRoots(<String>[root], <String>[], <String, String>{});
1130 manager.assertContextPaths([root]);
1131 manager.assertContextFiles(root, [rootFile]);
1132 // delete the pubspec
1133 resourceProvider.deleteFile(rootPubspec);
1134 return pumpEventQueue().then((_) {
1135 manager.assertContextPaths([root]);
1136 manager.assertContextFiles(root, [rootFile]);
1137 });
1138 }
1139
1140 test_watch_deletePackagespec_fromSubFolder() {
1141 // prepare paths
1142 String root = '/root';
1143 String rootFile = '$root/root.dart';
1144 String subProject = '$root/sub/aaa';
1145 String subPubspec = '$subProject/.packages';
1146 String subFile = '$subProject/bin/a.dart';
1147 // create files
1148 resourceProvider.newFile(subPubspec, '');
1149 resourceProvider.newFile(rootFile, 'library root;');
1150 resourceProvider.newFile(subFile, 'library a;');
1151 // set roots
1152 manager.setRoots(<String>[root], <String>[], <String, String>{});
1153 manager.assertContextPaths([root, subProject]);
1154 // verify files
1155 manager.assertContextFiles(root, [rootFile]);
1156 manager.assertContextFiles(subProject, [subFile]);
1157 // delete the pubspec
1158 resourceProvider.deleteFile(subPubspec);
1159 return pumpEventQueue().then((_) {
1160 manager.assertContextPaths([root]);
1161 manager.assertContextFiles(root, [rootFile, subFile]);
1162 });
1163 }
1164
1165 test_watch_deletePackagespec_fromSubFolder_withPubspec() {
1166 // prepare paths
1167 String root = '/root';
1168 String rootFile = '$root/root.dart';
1169 String subProject = '$root/sub/aaa';
1170 String subPackagespec = '$subProject/.packages';
1171 String subPubspec = '$subProject/pubspec.yaml';
1172 String subFile = '$subProject/bin/a.dart';
1173 // create files
1174 resourceProvider.newFile(subPackagespec, '');
1175 resourceProvider.newFile(subPubspec, 'pubspec');
1176 resourceProvider.newFile(rootFile, 'library root;');
1177 resourceProvider.newFile(subFile, 'library a;');
1178 // set roots
1179 manager.setRoots(<String>[root], <String>[], <String, String>{});
1180 manager.assertContextPaths([root, subProject]);
1181 // verify files
1182 manager.assertContextFiles(root, [rootFile]);
1183 manager.assertContextFiles(subProject, [subFile]);
1184 // delete the packagespec
1185 resourceProvider.deleteFile(subPackagespec);
1186 return pumpEventQueue().then((_) {
1187 // Should NOT merge
1188 manager.assertContextPaths([root, subProject]);
1189 manager.assertContextFiles(subProject, [subFile]);
1190 });
1191 }
1192
835 test_watch_deletePubspec_fromRoot() { 1193 test_watch_deletePubspec_fromRoot() {
836 // prepare paths 1194 // prepare paths
837 String root = '/root'; 1195 String root = '/root';
838 String rootPubspec = '$root/pubspec.yaml'; 1196 String rootPubspec = '$root/pubspec.yaml';
839 String rootFile = '$root/root.dart'; 1197 String rootFile = '$root/root.dart';
840 // create files 1198 // create files
841 resourceProvider.newFile(rootPubspec, 'pubspec'); 1199 resourceProvider.newFile(rootPubspec, 'pubspec');
842 resourceProvider.newFile(rootFile, 'library root;'); 1200 resourceProvider.newFile(rootFile, 'library root;');
843 // set roots 1201 // set roots
844 manager.setRoots(<String>[root], <String>[], <String, String>{}); 1202 manager.setRoots(<String>[root], <String>[], <String, String>{});
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 File resource = resourceProvider.getResource(path); 1359 File resource = resourceProvider.getResource(path);
1002 packageMapProvider.modificationTimes[path] = resource.modificationStamp; 1360 packageMapProvider.modificationTimes[path] = resource.modificationStamp;
1003 } 1361 }
1004 // This should cause the new package map to be picked up, by executing 1362 // This should cause the new package map to be picked up, by executing
1005 // computePackageMap just one additional time. 1363 // computePackageMap just one additional time.
1006 await pumpEventQueue(); 1364 await pumpEventQueue();
1007 _checkPackageMap(projPath, equals(packageMapProvider.packageMap)); 1365 _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
1008 expect(packageMapProvider.computeCount, 2); 1366 expect(packageMapProvider.computeCount, 2);
1009 } 1367 }
1010 1368
1369 test_watch_modifyPackagespec() {
1370 String packagesPath = '$projPath/.packages';
1371 String filePath = '$projPath/bin/main.dart';
1372
1373 resourceProvider.newFile(packagesPath, '');
1374 resourceProvider.newFile(filePath, 'library main;');
1375
1376 manager.setRoots(<String>[projPath], <String>[], <String, String>{});
1377
1378 Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
1379 expect(filePaths, hasLength(1));
1380 expect(filePaths, contains(filePath));
1381 Packages packages = manager.currentContextPackagespecs[projPath];
1382 expect(packages.packages, isEmpty);
1383
1384 // update .packages
1385 manager.now++;
1386 resourceProvider.modifyFile(packagesPath, 'main:./lib/');
1387 return pumpEventQueue().then((_) {
1388 // verify new package info
1389 packages = manager.currentContextPackagespecs[projPath];
1390 expect(packages.packages, unorderedEquals(['main']));
1391 });
1392 }
1393
1011 /** 1394 /**
1012 * Verify that package URI's for source files in [path] will be resolved 1395 * Verify that package URI's for source files in [path] will be resolved
1013 * using a package map matching [expectation]. 1396 * using a package map matching [expectation].
1014 */ 1397 */
1015 void _checkPackageMap(String path, expectation) { 1398 void _checkPackageMap(String path, expectation) {
1016 UriResolver resolver = manager.currentContextPackageUriResolvers[path]; 1399 UriResolver resolver = manager.currentContextPackageUriResolvers[path];
1017 Map<String, List<Folder>> packageMap = 1400 Map<String, List<Folder>> packageMap =
1018 resolver is PackageMapUriResolver ? resolver.packageMap : null; 1401 resolver is PackageMapUriResolver ? resolver.packageMap : null;
1019 expect(packageMap, expectation); 1402 expect(packageMap, expectation);
1020 } 1403 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1059 */ 1442 */
1060 final Map<String, Set<Source>> currentContextSources = <String, Set<Source>>{ 1443 final Map<String, Set<Source>> currentContextSources = <String, Set<Source>>{
1061 }; 1444 };
1062 1445
1063 /** 1446 /**
1064 * Map from context to package URI resolver. 1447 * Map from context to package URI resolver.
1065 */ 1448 */
1066 final Map<String, UriResolver> currentContextPackageUriResolvers = 1449 final Map<String, UriResolver> currentContextPackageUriResolvers =
1067 <String, UriResolver>{}; 1450 <String, UriResolver>{};
1068 1451
1452 /**
1453 * Map from context to packages object.
1454 */
1455 final Map<String, Packages> currentContextPackagespecs = <String, Packages>{};
1456
1069 TestContextManager(MemoryResourceProvider resourceProvider, 1457 TestContextManager(MemoryResourceProvider resourceProvider,
1070 ResolverProvider packageResolverProvider, 1458 ResolverProvider packageResolverProvider,
1071 OptimizingPubPackageMapProvider packageMapProvider) 1459 OptimizingPubPackageMapProvider packageMapProvider)
1072 : super(resourceProvider, packageResolverProvider, packageMapProvider, 1460 : super(resourceProvider, packageResolverProvider, packageMapProvider,
1073 InstrumentationService.NULL_SERVICE); 1461 InstrumentationService.NULL_SERVICE);
1074 1462
1075 /** 1463 /**
1076 * Iterable of the paths to contexts that currently exist. 1464 * Iterable of the paths to contexts that currently exist.
1077 */ 1465 */
1078 Iterable<String> get currentContextPaths => currentContextTimestamps.keys; 1466 Iterable<String> get currentContextPaths => currentContextTimestamps.keys;
1079 1467
1080 @override 1468 @override
1081 AnalysisContext addContext(Folder folder, UriResolver packageUriResolver) { 1469 AnalysisContext addContext(
1470 Folder folder, UriResolver packageUriResolver, Packages packages) {
1082 String path = folder.path; 1471 String path = folder.path;
1083 expect(currentContextPaths, isNot(contains(path))); 1472 expect(currentContextPaths, isNot(contains(path)));
1084 currentContextTimestamps[path] = now; 1473 currentContextTimestamps[path] = now;
1085 currentContextFilePaths[path] = <String, int>{}; 1474 currentContextFilePaths[path] = <String, int>{};
1086 currentContextSources[path] = new HashSet<Source>(); 1475 currentContextSources[path] = new HashSet<Source>();
1087 currentContextPackageUriResolvers[path] = packageUriResolver; 1476 currentContextPackageUriResolvers[path] = packageUriResolver;
1477 currentContextPackagespecs[path] = packages;
1088 currentContext = AnalysisEngine.instance.createAnalysisContext(); 1478 currentContext = AnalysisEngine.instance.createAnalysisContext();
1089 currentContext.sourceFactory = new SourceFactory( 1479 List<UriResolver> resolvers = [new FileUriResolver()];
1090 packageUriResolver == null ? [] : [packageUriResolver]); 1480 if (packageUriResolver != null) {
1481 resolvers.add(packageUriResolver);
1482 }
1483 currentContext.sourceFactory = new SourceFactory(resolvers, packages);
1091 return currentContext; 1484 return currentContext;
1092 } 1485 }
1093 1486
1094 @override 1487 @override
1095 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) { 1488 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
1096 Map<String, int> filePaths = currentContextFilePaths[contextFolder.path]; 1489 Map<String, int> filePaths = currentContextFilePaths[contextFolder.path];
1097 Set<Source> sources = currentContextSources[contextFolder.path]; 1490 Set<Source> sources = currentContextSources[contextFolder.path];
1098 1491
1099 for (Source source in changeSet.addedSources) { 1492 for (Source source in changeSet.addedSources) {
1100 expect(filePaths, isNot(contains(source.fullName))); 1493 expect(filePaths, isNot(contains(source.fullName)));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 // Emacs creates dummy links to track the fact that a file is open for 1535 // Emacs creates dummy links to track the fact that a file is open for
1143 // editing and has unsaved changes (e.g. having unsaved changes to 1536 // editing and has unsaved changes (e.g. having unsaved changes to
1144 // 'foo.dart' causes a link '.#foo.dart' to be created, which points to the 1537 // 'foo.dart' causes a link '.#foo.dart' to be created, which points to the
1145 // non-existent file 'username@hostname.pid'. To avoid these dummy links 1538 // non-existent file 'username@hostname.pid'. To avoid these dummy links
1146 // causing the analyzer to thrash, just ignore links to non-existent files. 1539 // causing the analyzer to thrash, just ignore links to non-existent files.
1147 return file.exists; 1540 return file.exists;
1148 } 1541 }
1149 1542
1150 @override 1543 @override
1151 void updateContextPackageUriResolver( 1544 void updateContextPackageUriResolver(
1152 Folder contextFolder, UriResolver packageUriResolver) { 1545 Folder contextFolder, UriResolver packageUriResolver, Packages packages) {
1153 currentContextPackageUriResolvers[contextFolder.path] = packageUriResolver; 1546 currentContextPackageUriResolvers[contextFolder.path] = packageUriResolver;
1547 currentContextPackagespecs[contextFolder.path] = packages;
1154 } 1548 }
1155 } 1549 }
1156 1550
1157 /** 1551 /**
1158 * A [Source] that knows it's [fullName]. 1552 * A [Source] that knows it's [fullName].
1159 */ 1553 */
1160 class TestSource implements Source { 1554 class TestSource implements Source {
1161 TestSource(); 1555 TestSource();
1162 1556
1163 @override 1557 @override
1164 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); 1558 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
1165 } 1559 }
1166 1560
1167 class TestUriResolver extends UriResolver { 1561 class TestUriResolver extends UriResolver {
1168 Map<Uri, Source> uriMap; 1562 Map<Uri, Source> uriMap;
1169 1563
1170 TestUriResolver(this.uriMap); 1564 TestUriResolver(this.uriMap);
1171 1565
1172 @override 1566 @override
1173 Source resolveAbsolute(Uri uri) { 1567 Source resolveAbsolute(Uri uri) {
1174 return uriMap[uri]; 1568 return uriMap[uri];
1175 } 1569 }
1176 } 1570 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/lib/src/context_manager.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698