OLD | NEW |
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:analyzer/file_system/file_system.dart'; | 12 import 'package:analyzer/file_system/file_system.dart'; |
12 import 'package:analyzer/file_system/memory_file_system.dart'; | 13 import 'package:analyzer/file_system/memory_file_system.dart'; |
13 import 'package:analyzer/instrumentation/instrumentation.dart'; | 14 import 'package:analyzer/instrumentation/instrumentation.dart'; |
14 import 'package:analyzer/source/package_map_resolver.dart'; | 15 import 'package:analyzer/source/package_map_resolver.dart'; |
15 import 'package:analyzer/src/generated/engine.dart'; | 16 import 'package:analyzer/src/generated/engine.dart'; |
16 import 'package:analyzer/src/generated/source.dart'; | 17 import 'package:analyzer/src/generated/source.dart'; |
17 import 'package:analyzer/src/generated/source_io.dart'; | 18 import 'package:analyzer/src/generated/source_io.dart'; |
18 import 'package:path/path.dart'; | 19 import 'package:path/path.dart'; |
19 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 20 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
20 import 'package:unittest/unittest.dart'; | 21 import 'package:unittest/unittest.dart'; |
21 | 22 |
22 import 'mocks.dart'; | 23 import 'mocks.dart'; |
23 import 'package:analysis_server/uri/resolver_provider.dart'; | |
24 | 24 |
25 main() { | 25 main() { |
26 groupSep = ' | '; | 26 groupSep = ' | '; |
27 defineReflectiveTests(ContextManagerTest); | 27 defineReflectiveTests(AbstractContextManagerTest); |
28 } | 28 } |
29 | 29 |
30 @reflectiveTest | 30 @reflectiveTest |
31 class ContextManagerTest { | 31 class AbstractContextManagerTest { |
32 /** | 32 /** |
33 * The name of the 'bin' directory. | 33 * The name of the 'bin' directory. |
34 */ | 34 */ |
35 static const String BIN_NAME = 'bin'; | 35 static const String BIN_NAME = 'bin'; |
36 | 36 |
37 /** | 37 /** |
38 * The name of the 'example' directory. | 38 * The name of the 'example' directory. |
39 */ | 39 */ |
40 static const String EXAMPLE_NAME = 'example'; | 40 static const String EXAMPLE_NAME = 'example'; |
41 | 41 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 return folderPath; | 76 return folderPath; |
77 } | 77 } |
78 | 78 |
79 UriResolver providePackageResolver(Folder folder) { | 79 UriResolver providePackageResolver(Folder folder) { |
80 return packageResolver; | 80 return packageResolver; |
81 } | 81 } |
82 | 82 |
83 void setUp() { | 83 void setUp() { |
84 resourceProvider = new MemoryResourceProvider(); | 84 resourceProvider = new MemoryResourceProvider(); |
85 packageMapProvider = new MockPackageMapProvider(); | 85 packageMapProvider = new MockPackageMapProvider(); |
86 manager = new TestContextManager(resourceProvider, providePackageResolver, p
ackageMapProvider); | 86 manager = new TestContextManager( |
| 87 resourceProvider, providePackageResolver, packageMapProvider); |
87 resourceProvider.newFolder(projPath); | 88 resourceProvider.newFolder(projPath); |
88 } | 89 } |
89 | 90 |
90 test_ignoreFilesInPackagesFolder() { | 91 test_ignoreFilesInPackagesFolder() { |
91 // create a context with a pubspec.yaml file | 92 // create a context with a pubspec.yaml file |
92 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); | 93 String pubspecPath = posix.join(projPath, 'pubspec.yaml'); |
93 resourceProvider.newFile(pubspecPath, 'pubspec'); | 94 resourceProvider.newFile(pubspecPath, 'pubspec'); |
94 // create a file in the "packages" folder | 95 // create a file in the "packages" folder |
95 String filePath1 = posix.join(projPath, 'packages', 'file1.dart'); | 96 String filePath1 = posix.join(projPath, 'packages', 'file1.dart'); |
96 resourceProvider.newFile(filePath1, 'contents'); | 97 resourceProvider.newFile(filePath1, 'contents'); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 } | 196 } |
196 | 197 |
197 void test_setRoots_addFolderWithDartFile() { | 198 void test_setRoots_addFolderWithDartFile() { |
198 String filePath = posix.join(projPath, 'foo.dart'); | 199 String filePath = posix.join(projPath, 'foo.dart'); |
199 resourceProvider.newFile(filePath, 'contents'); | 200 resourceProvider.newFile(filePath, 'contents'); |
200 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); | 201 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
201 // verify | 202 // verify |
202 var filePaths = manager.currentContextFilePaths[projPath]; | 203 var filePaths = manager.currentContextFilePaths[projPath]; |
203 expect(filePaths, hasLength(1)); | 204 expect(filePaths, hasLength(1)); |
204 expect(filePaths, contains(filePath)); | 205 expect(filePaths, contains(filePath)); |
205 List<AnalysisContext> contextsInAnalysisRoot = manager.contextsInAnalysisRoo
t(resourceProvider.newFolder(projPath)); | 206 List<AnalysisContext> contextsInAnalysisRoot = |
| 207 manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
206 expect(contextsInAnalysisRoot, hasLength(1)); | 208 expect(contextsInAnalysisRoot, hasLength(1)); |
207 AnalysisContext context = contextsInAnalysisRoot[0]; | 209 AnalysisContext context = contextsInAnalysisRoot[0]; |
208 expect(context, isNotNull); | 210 expect(context, isNotNull); |
209 Source result = context.sourceFactory.forUri('package:foo/foo.dart'); | 211 Source result = context.sourceFactory.forUri('package:foo/foo.dart'); |
210 expect(result, isNotNull); | 212 expect(result, isNotNull); |
211 expect(result.exists(), isFalse); | 213 expect(result.exists(), isFalse); |
212 } | 214 } |
213 | 215 |
214 void test_setRoots_packageResolver() { | |
215 Uri uri = Uri.parse('package:foo/foo.dart'); | |
216 Source source = new TestSource(); | |
217 packageResolver = new TestUriResolver({uri : source}); | |
218 String filePath = posix.join(projPath, 'foo.dart'); | |
219 resourceProvider.newFile(filePath, 'contents'); | |
220 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); | |
221 | |
222 List<AnalysisContext> contextsInAnalysisRoot = manager.contextsInAnalysisRoo
t(resourceProvider.newFolder(projPath)); | |
223 expect(contextsInAnalysisRoot, hasLength(1)); | |
224 AnalysisContext context = contextsInAnalysisRoot[0]; | |
225 expect(context, isNotNull); | |
226 Source result = context.sourceFactory.forUri2(uri); | |
227 expect(result, same(source)); | |
228 } | |
229 | |
230 void test_setRoots_addFolderWithDartFileInSubfolder() { | 216 void test_setRoots_addFolderWithDartFileInSubfolder() { |
231 String filePath = posix.join(projPath, 'foo', 'bar.dart'); | 217 String filePath = posix.join(projPath, 'foo', 'bar.dart'); |
232 resourceProvider.newFile(filePath, 'contents'); | 218 resourceProvider.newFile(filePath, 'contents'); |
233 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); | 219 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
234 // verify | 220 // verify |
235 var filePaths = manager.currentContextFilePaths[projPath]; | 221 var filePaths = manager.currentContextFilePaths[projPath]; |
236 expect(filePaths, hasLength(1)); | 222 expect(filePaths, hasLength(1)); |
237 expect(filePaths, contains(filePath)); | 223 expect(filePaths, contains(filePath)); |
238 } | 224 } |
239 | 225 |
240 void test_setRoots_addFolderWithDummyLink() { | 226 void test_setRoots_addFolderWithDummyLink() { |
241 String filePath = posix.join(projPath, 'foo.dart'); | 227 String filePath = posix.join(projPath, 'foo.dart'); |
242 resourceProvider.newDummyLink(filePath); | 228 resourceProvider.newDummyLink(filePath); |
243 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); | 229 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
244 // verify | 230 // verify |
245 var filePaths = manager.currentContextFilePaths[projPath]; | 231 var filePaths = manager.currentContextFilePaths[projPath]; |
246 expect(filePaths, isEmpty); | 232 expect(filePaths, isEmpty); |
247 } | 233 } |
248 | 234 |
249 void test_setRoots_addFolderWithNestedPubspec() { | 235 void test_setRoots_addFolderWithNestedPubspec() { |
250 String examplePath = newFolder([projPath, EXAMPLE_NAME]); | 236 String examplePath = newFolder([projPath, EXAMPLE_NAME]); |
251 String libPath = newFolder([projPath, LIB_NAME]); | 237 String libPath = newFolder([projPath, LIB_NAME]); |
252 | 238 |
253 newFile([projPath, PUBSPEC_NAME]); | 239 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]); |
254 newFile([libPath, 'main.dart']); | 240 newFile([libPath, 'main.dart']); |
255 newFile([examplePath, PUBSPEC_NAME]); | 241 newFile([examplePath, AbstractContextManager.PUBSPEC_NAME]); |
256 newFile([examplePath, 'example.dart']); | 242 newFile([examplePath, 'example.dart']); |
257 | 243 |
258 packageMapProvider.packageMap['proj'] = | 244 packageMapProvider.packageMap['proj'] = |
259 [resourceProvider.getResource(libPath)]; | 245 [resourceProvider.getResource(libPath)]; |
260 | 246 |
261 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); | 247 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
262 | 248 |
263 expect(manager.currentContextPaths, hasLength(2)); | 249 expect(manager.currentContextPaths, hasLength(2)); |
264 | 250 |
265 expect(manager.currentContextPaths, contains(projPath)); | 251 expect(manager.currentContextPaths, contains(projPath)); |
(...skipping 26 matching lines...) Expand all Loading... |
292 expect(manager.currentContextPaths, contains(projPath)); | 278 expect(manager.currentContextPaths, contains(projPath)); |
293 expect(manager.currentContextFilePaths[projPath], hasLength(0)); | 279 expect(manager.currentContextFilePaths[projPath], hasLength(0)); |
294 } | 280 } |
295 | 281 |
296 void test_setRoots_addFolderWithPubspecAndLib() { | 282 void test_setRoots_addFolderWithPubspecAndLib() { |
297 String binPath = newFolder([projPath, BIN_NAME]); | 283 String binPath = newFolder([projPath, BIN_NAME]); |
298 String libPath = newFolder([projPath, LIB_NAME]); | 284 String libPath = newFolder([projPath, LIB_NAME]); |
299 String srcPath = newFolder([libPath, SRC_NAME]); | 285 String srcPath = newFolder([libPath, SRC_NAME]); |
300 String testPath = newFolder([projPath, TEST_NAME]); | 286 String testPath = newFolder([projPath, TEST_NAME]); |
301 | 287 |
302 newFile([projPath, PUBSPEC_NAME]); | 288 newFile([projPath, AbstractContextManager.PUBSPEC_NAME]); |
303 String appPath = newFile([binPath, 'app.dart']); | 289 String appPath = newFile([binPath, 'app.dart']); |
304 newFile([libPath, 'main.dart']); | 290 newFile([libPath, 'main.dart']); |
305 newFile([srcPath, 'internal.dart']); | 291 newFile([srcPath, 'internal.dart']); |
306 String testFilePath = newFile([testPath, 'main_test.dart']); | 292 String testFilePath = newFile([testPath, 'main_test.dart']); |
307 | 293 |
308 packageMapProvider.packageMap['proj'] = | 294 packageMapProvider.packageMap['proj'] = |
309 [resourceProvider.getResource(libPath)]; | 295 [resourceProvider.getResource(libPath)]; |
310 | 296 |
311 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); | 297 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
312 Set<Source> sources = manager.currentContextSources[projPath]; | 298 Set<Source> sources = manager.currentContextSources[projPath]; |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 } | 505 } |
520 | 506 |
521 void test_setRoots_newlyAddedFoldersGetProperPackageMap() { | 507 void test_setRoots_newlyAddedFoldersGetProperPackageMap() { |
522 String packagePath = '/package/foo'; | 508 String packagePath = '/package/foo'; |
523 Folder packageFolder = resourceProvider.newFolder(packagePath); | 509 Folder packageFolder = resourceProvider.newFolder(packagePath); |
524 packageMapProvider.packageMap = {'foo': [packageFolder]}; | 510 packageMapProvider.packageMap = {'foo': [packageFolder]}; |
525 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); | 511 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
526 _checkPackageMap(projPath, equals(packageMapProvider.packageMap)); | 512 _checkPackageMap(projPath, equals(packageMapProvider.packageMap)); |
527 } | 513 } |
528 | 514 |
| 515 void test_setRoots_packageResolver() { |
| 516 Uri uri = Uri.parse('package:foo/foo.dart'); |
| 517 Source source = new TestSource(); |
| 518 packageResolver = new TestUriResolver({uri: source}); |
| 519 String filePath = posix.join(projPath, 'foo.dart'); |
| 520 resourceProvider.newFile(filePath, 'contents'); |
| 521 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
| 522 |
| 523 List<AnalysisContext> contextsInAnalysisRoot = |
| 524 manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); |
| 525 expect(contextsInAnalysisRoot, hasLength(1)); |
| 526 AnalysisContext context = contextsInAnalysisRoot[0]; |
| 527 expect(context, isNotNull); |
| 528 Source result = context.sourceFactory.forUri2(uri); |
| 529 expect(result, same(source)); |
| 530 } |
| 531 |
529 void test_setRoots_removeFolderWithoutPubspec() { | 532 void test_setRoots_removeFolderWithoutPubspec() { |
530 packageMapProvider.packageMap = null; | 533 packageMapProvider.packageMap = null; |
531 // add one root - there is a context | 534 // add one root - there is a context |
532 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); | 535 manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
533 expect(manager.currentContextPaths, hasLength(1)); | 536 expect(manager.currentContextPaths, hasLength(1)); |
534 // set empty roots - no contexts | 537 // set empty roots - no contexts |
535 manager.setRoots(<String>[], <String>[], <String, String>{}); | 538 manager.setRoots(<String>[], <String>[], <String, String>{}); |
536 expect(manager.currentContextPaths, hasLength(0)); | 539 expect(manager.currentContextPaths, hasLength(0)); |
537 expect(manager.currentContextFilePaths, hasLength(0)); | 540 expect(manager.currentContextFilePaths, hasLength(0)); |
538 } | 541 } |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 * using a package root maching [expectation]. | 971 * using a package root maching [expectation]. |
969 */ | 972 */ |
970 void _checkPackageRoot(String path, expectation) { | 973 void _checkPackageRoot(String path, expectation) { |
971 UriResolver resolver = manager.currentContextPackageUriResolvers[path]; | 974 UriResolver resolver = manager.currentContextPackageUriResolvers[path]; |
972 expect(resolver, new isInstanceOf<PackageUriResolver>()); | 975 expect(resolver, new isInstanceOf<PackageUriResolver>()); |
973 PackageUriResolver packageUriResolver = resolver; | 976 PackageUriResolver packageUriResolver = resolver; |
974 expect(packageUriResolver.packagesDirectory_forTesting, expectation); | 977 expect(packageUriResolver.packagesDirectory_forTesting, expectation); |
975 } | 978 } |
976 } | 979 } |
977 | 980 |
978 class TestContextManager extends ContextManager { | 981 class TestContextManager extends AbstractContextManager { |
979 /** | 982 /** |
980 * Source of timestamps stored in [currentContextFilePaths]. | 983 * Source of timestamps stored in [currentContextFilePaths]. |
981 */ | 984 */ |
982 int now = 0; | 985 int now = 0; |
983 | 986 |
984 /** | 987 /** |
985 * The analysis context that was created. | 988 * The analysis context that was created. |
986 */ | 989 */ |
987 AnalysisContext currentContext; | 990 AnalysisContext currentContext; |
988 | 991 |
(...skipping 15 matching lines...) Expand all Loading... |
1004 final Map<String, Set<Source>> currentContextSources = <String, Set<Source>>{ | 1007 final Map<String, Set<Source>> currentContextSources = <String, Set<Source>>{ |
1005 }; | 1008 }; |
1006 | 1009 |
1007 /** | 1010 /** |
1008 * Map from context to package URI resolver. | 1011 * Map from context to package URI resolver. |
1009 */ | 1012 */ |
1010 final Map<String, UriResolver> currentContextPackageUriResolvers = | 1013 final Map<String, UriResolver> currentContextPackageUriResolvers = |
1011 <String, UriResolver>{}; | 1014 <String, UriResolver>{}; |
1012 | 1015 |
1013 TestContextManager(MemoryResourceProvider resourceProvider, | 1016 TestContextManager(MemoryResourceProvider resourceProvider, |
1014 ResolverProvider packageResolverProvider, | 1017 ResolverProvider packageResolverProvider, |
1015 OptimizingPubPackageMapProvider packageMapProvider) | 1018 OptimizingPubPackageMapProvider packageMapProvider) |
1016 : super(resourceProvider, packageResolverProvider, packageMapProvider, | 1019 : super(resourceProvider, packageResolverProvider, packageMapProvider, |
1017 InstrumentationService.NULL_SERVICE); | 1020 InstrumentationService.NULL_SERVICE); |
1018 | 1021 |
1019 /** | 1022 /** |
1020 * Iterable of the paths to contexts that currently exist. | 1023 * Iterable of the paths to contexts that currently exist. |
1021 */ | 1024 */ |
1022 Iterable<String> get currentContextPaths => currentContextTimestamps.keys; | 1025 Iterable<String> get currentContextPaths => currentContextTimestamps.keys; |
1023 | 1026 |
1024 @override | 1027 @override |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 return file.exists; | 1094 return file.exists; |
1092 } | 1095 } |
1093 | 1096 |
1094 @override | 1097 @override |
1095 void updateContextPackageUriResolver( | 1098 void updateContextPackageUriResolver( |
1096 Folder contextFolder, UriResolver packageUriResolver) { | 1099 Folder contextFolder, UriResolver packageUriResolver) { |
1097 currentContextPackageUriResolvers[contextFolder.path] = packageUriResolver; | 1100 currentContextPackageUriResolvers[contextFolder.path] = packageUriResolver; |
1098 } | 1101 } |
1099 } | 1102 } |
1100 | 1103 |
| 1104 /** |
| 1105 * A [Source] that knows it's [fullName]. |
| 1106 */ |
| 1107 class TestSource implements Source { |
| 1108 TestSource(); |
| 1109 |
| 1110 @override |
| 1111 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 1112 } |
| 1113 |
1101 class TestUriResolver extends UriResolver { | 1114 class TestUriResolver extends UriResolver { |
1102 Map<Uri, Source> uriMap; | 1115 Map<Uri, Source> uriMap; |
1103 | 1116 |
1104 TestUriResolver(this.uriMap); | 1117 TestUriResolver(this.uriMap); |
1105 | 1118 |
1106 @override | 1119 @override |
1107 Source resolveAbsolute(Uri uri) { | 1120 Source resolveAbsolute(Uri uri) { |
1108 return uriMap[uri]; | 1121 return uriMap[uri]; |
1109 } | 1122 } |
1110 } | 1123 } |
1111 | |
1112 /** | |
1113 * A [Source] that knows it's [fullName]. | |
1114 */ | |
1115 class TestSource implements Source { | |
1116 TestSource(); | |
1117 | |
1118 @override | |
1119 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
1120 } | |
OLD | NEW |