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

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

Issue 2937323003: Remove ability to disable new analysis driver (Closed)
Patch Set: Created 3 years, 6 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
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 import 'dart:async'; 5 import 'dart:async';
6 6
7 import 'package:analysis_server/protocol/protocol.dart'; 7 import 'package:analysis_server/protocol/protocol.dart';
8 import 'package:analysis_server/protocol/protocol_generated.dart'; 8 import 'package:analysis_server/protocol/protocol_generated.dart';
9 import 'package:analysis_server/src/analysis_server.dart'; 9 import 'package:analysis_server/src/analysis_server.dart';
10 import 'package:analysis_server/src/constants.dart'; 10 import 'package:analysis_server/src/constants.dart';
11 import 'package:analysis_server/src/context_manager.dart';
12 import 'package:analysis_server/src/domain_server.dart'; 11 import 'package:analysis_server/src/domain_server.dart';
13 import 'package:analysis_server/src/operation/operation.dart'; 12 import 'package:analysis_server/src/operation/operation.dart';
14 import 'package:analysis_server/src/plugin/server_plugin.dart'; 13 import 'package:analysis_server/src/plugin/server_plugin.dart';
15 import 'package:analyzer/exception/exception.dart'; 14 import 'package:analyzer/exception/exception.dart';
16 import 'package:analyzer/file_system/file_system.dart'; 15 import 'package:analyzer/file_system/file_system.dart';
17 import 'package:analyzer/file_system/memory_file_system.dart'; 16 import 'package:analyzer/file_system/memory_file_system.dart';
18 import 'package:analyzer/instrumentation/instrumentation.dart'; 17 import 'package:analyzer/instrumentation/instrumentation.dart';
19 import 'package:analyzer/source/package_map_resolver.dart';
20 import 'package:analyzer/src/generated/engine.dart'; 18 import 'package:analyzer/src/generated/engine.dart';
21 import 'package:analyzer/src/generated/sdk.dart'; 19 import 'package:analyzer/src/generated/sdk.dart';
22 import 'package:analyzer/src/generated/source.dart'; 20 import 'package:analyzer/src/generated/source.dart';
23 import 'package:analyzer_plugin/protocol/protocol_common.dart'; 21 import 'package:analyzer_plugin/protocol/protocol_common.dart';
24 import 'package:plugin/manager.dart'; 22 import 'package:plugin/manager.dart';
25 import 'package:plugin/plugin.dart'; 23 import 'package:plugin/plugin.dart';
26 import 'package:test/test.dart'; 24 import 'package:test/test.dart';
27 import 'package:test_reflective_loader/test_reflective_loader.dart'; 25 import 'package:test_reflective_loader/test_reflective_loader.dart';
28 import 'package:typed_mock/typed_mock.dart'; 26 import 'package:typed_mock/typed_mock.dart';
29 27
30 import 'mock_sdk.dart'; 28 import 'mock_sdk.dart';
31 import 'mocks.dart'; 29 import 'mocks.dart';
32 30
33 main() { 31 main() {
34 defineReflectiveSuite(() { 32 defineReflectiveSuite(() {
35 defineReflectiveTests(AnalysisServerTest); 33 defineReflectiveTests(AnalysisServerTest);
36 }); 34 });
37 } 35 }
38 36
39 @reflectiveTest 37 @reflectiveTest
40 class AnalysisServerTest { 38 class AnalysisServerTest {
41 MockServerChannel channel; 39 MockServerChannel channel;
42 AnalysisServer server; 40 AnalysisServer server;
43 MemoryResourceProvider resourceProvider; 41 MemoryResourceProvider resourceProvider;
44 MockPackageMapProvider packageMapProvider; 42 MockPackageMapProvider packageMapProvider;
45 43
46 /**
47 * Verify that getAnalysisContextForSource returns the correct contexts even
48 * for sources that are included by multiple contexts.
49 *
50 * See dartbug.com/21898
51 */
52 Future fail_getAnalysisContextForSource_crossImports() {
53 // Subscribe to STATUS so we'll know when analysis is done.
54 server.serverServices = [ServerService.STATUS].toSet();
55 // Analyze project foo containing foo.dart and project bar containing
56 // bar.dart.
57 resourceProvider.newFolder('/foo');
58 resourceProvider.newFolder('/bar');
59 File foo = resourceProvider.newFile(
60 '/foo/foo.dart',
61 '''
62 libary foo;
63 import "../bar/bar.dart";
64 ''');
65 Source fooSource = foo.createSource();
66 File bar = resourceProvider.newFile(
67 '/bar/bar.dart',
68 '''
69 library bar;
70 import "../foo/foo.dart";
71 ''');
72 Source barSource = bar.createSource();
73 server.setAnalysisRoots('0', ['/foo', '/bar'], [], {});
74 return server.onAnalysisComplete.then((_) {
75 expect(server.statusAnalyzing, isFalse);
76 // Make sure getAnalysisContext returns the proper context for each.
77 AnalysisContext fooContext =
78 server.getAnalysisContextForSource(fooSource);
79 expect(fooContext, isNotNull);
80 AnalysisContext barContext =
81 server.getAnalysisContextForSource(barSource);
82 expect(barContext, isNotNull);
83 expect(fooContext, isNot(same(barContext)));
84 expect(fooContext.getKindOf(fooSource), SourceKind.LIBRARY);
85 expect(fooContext.getKindOf(barSource), SourceKind.UNKNOWN);
86 expect(barContext.getKindOf(fooSource), SourceKind.UNKNOWN);
87 expect(barContext.getKindOf(barSource), SourceKind.LIBRARY);
88 });
89 }
90
91 /**
92 * Verify that getAnalysisContextForSource returns the correct contexts even
93 * for sources that haven't been analyzed yet.
94 *
95 * See dartbug.com/21898
96 */
97 Future fail_getAnalysisContextForSource_unanalyzed() {
98 // Subscribe to STATUS so we'll know when analysis is done.
99 server.serverServices = [ServerService.STATUS].toSet();
100 // Analyze project foo containing foo.dart and project bar containing
101 // bar.dart.
102 resourceProvider.newFolder('/foo');
103 resourceProvider.newFolder('/bar');
104 File foo = resourceProvider.newFile('/foo/foo.dart', 'library lib;');
105 Source fooSource = foo.createSource();
106 File bar = resourceProvider.newFile('/bar/bar.dart', 'library lib;');
107 Source barSource = bar.createSource();
108 server.setAnalysisRoots('0', ['/foo', '/bar'], [], {});
109 AnalysisContext fooContext = server.getAnalysisContextForSource(fooSource);
110 expect(fooContext, isNotNull);
111 AnalysisContext barContext = server.getAnalysisContextForSource(barSource);
112 expect(barContext, isNotNull);
113 expect(fooContext, isNot(same(barContext)));
114 return server.onAnalysisComplete.then((_) {
115 expect(server.statusAnalyzing, isFalse);
116 // Make sure getAnalysisContext returned the proper context for each.
117 expect(fooContext.getKindOf(fooSource), SourceKind.LIBRARY);
118 expect(fooContext.getKindOf(barSource), SourceKind.UNKNOWN);
119 expect(barContext.getKindOf(fooSource), SourceKind.UNKNOWN);
120 expect(barContext.getKindOf(barSource), SourceKind.LIBRARY);
121 });
122 }
123
124 void processRequiredPlugins(ServerPlugin serverPlugin) { 44 void processRequiredPlugins(ServerPlugin serverPlugin) {
125 List<Plugin> plugins = <Plugin>[]; 45 List<Plugin> plugins = <Plugin>[];
126 plugins.addAll(AnalysisEngine.instance.requiredPlugins); 46 plugins.addAll(AnalysisEngine.instance.requiredPlugins);
127 plugins.add(serverPlugin); 47 plugins.add(serverPlugin);
128 48
129 ExtensionManager manager = new ExtensionManager(); 49 ExtensionManager manager = new ExtensionManager();
130 manager.processPlugins(plugins); 50 manager.processPlugins(plugins);
131 } 51 }
132 52
133 void setUp() { 53 void setUp() {
134 ServerPlugin serverPlugin = new ServerPlugin(); 54 ServerPlugin serverPlugin = new ServerPlugin();
135 processRequiredPlugins(serverPlugin); 55 processRequiredPlugins(serverPlugin);
136 channel = new MockServerChannel(); 56 channel = new MockServerChannel();
137 resourceProvider = new MemoryResourceProvider(); 57 resourceProvider = new MemoryResourceProvider();
138 // Create an SDK in the mock file system. 58 // Create an SDK in the mock file system.
139 new MockSdk(resourceProvider: resourceProvider); 59 new MockSdk(resourceProvider: resourceProvider);
140 packageMapProvider = new MockPackageMapProvider(); 60 packageMapProvider = new MockPackageMapProvider();
141 server = new AnalysisServer( 61 server = new AnalysisServer(
142 channel, 62 channel,
143 resourceProvider, 63 resourceProvider,
144 packageMapProvider, 64 packageMapProvider,
145 null, 65 null,
146 serverPlugin, 66 serverPlugin,
147 new AnalysisServerOptions(), 67 new AnalysisServerOptions(),
148 new DartSdkManager('/', false), 68 new DartSdkManager('/', false),
149 InstrumentationService.NULL_SERVICE, 69 InstrumentationService.NULL_SERVICE,
150 rethrowExceptions: true); 70 rethrowExceptions: true);
151 } 71 }
152 72
153 Future test_contextDisposed() {
154 resourceProvider.newFolder('/foo');
155 resourceProvider.newFile('/foo/bar.dart', 'library lib;');
156 server.setAnalysisRoots('0', ['/foo'], [], {});
157 AnalysisContext context;
158 return pumpEventQueue()
159 .then((_) {
160 context = server.getAnalysisContext('/foo/bar.dart');
161 server.setAnalysisRoots('1', [], [], {});
162 })
163 .then((_) => pumpEventQueue())
164 .then((_) {
165 expect(context.isDisposed, isTrue);
166 });
167 }
168
169 Future test_contextsChangedEvent() {
170 resourceProvider.newFolder('/foo');
171
172 bool wasAdded = false;
173 bool wasChanged = false;
174 bool wasRemoved = false;
175 server.onContextsChanged.listen((ContextsChangedEvent event) {
176 wasAdded = event.added.length == 1;
177 if (wasAdded) {
178 expect(event.added[0], isNotNull);
179 }
180 wasChanged = event.changed.length == 1;
181 if (wasChanged) {
182 expect(event.changed[0], isNotNull);
183 }
184 wasRemoved = event.removed.length == 1;
185 if (wasRemoved) {
186 expect(event.removed[0], isNotNull);
187 }
188 });
189
190 server.setAnalysisRoots('0', ['/foo'], [], {});
191 return pumpEventQueue().then((_) {
192 expect(wasAdded, isTrue);
193 expect(wasChanged, isFalse);
194 expect(wasRemoved, isFalse);
195
196 wasAdded = false;
197 wasChanged = false;
198 wasRemoved = false;
199 server.setAnalysisRoots('0', ['/foo'], [], {'/foo': '/bar'});
200 return pumpEventQueue();
201 }).then((_) {
202 expect(wasAdded, isFalse);
203 expect(wasChanged, isTrue);
204 expect(wasRemoved, isFalse);
205
206 wasAdded = false;
207 wasChanged = false;
208 wasRemoved = false;
209 server.setAnalysisRoots('0', [], [], {});
210 return pumpEventQueue();
211 }).then((_) {
212 expect(wasAdded, isFalse);
213 expect(wasChanged, isFalse);
214 expect(wasRemoved, isTrue);
215 });
216 }
217
218 Future test_echo() { 73 Future test_echo() {
219 server.handlers = [new EchoHandler()]; 74 server.handlers = [new EchoHandler()];
220 var request = new Request('my22', 'echo'); 75 var request = new Request('my22', 'echo');
221 return channel.sendRequest(request).then((Response response) { 76 return channel.sendRequest(request).then((Response response) {
222 expect(response.id, equals('my22')); 77 expect(response.id, equals('my22'));
223 expect(response.error, isNull); 78 expect(response.error, isNull);
224 }); 79 });
225 } 80 }
226 81
227 Future test_getAnalysisContextForSource() {
228 // Subscribe to STATUS so we'll know when analysis is done.
229 server.serverServices = [ServerService.STATUS].toSet();
230 // Analyze project foo containing foo.dart and project bar containing
231 // bar.dart.
232 resourceProvider.newFolder('/foo');
233 resourceProvider.newFolder('/bar');
234 File foo = resourceProvider.newFile('/foo/foo.dart', 'library lib;');
235 Source fooSource = foo.createSource();
236 File bar = resourceProvider.newFile('/bar/bar.dart', 'library lib;');
237 Source barSource = bar.createSource();
238 server.setAnalysisRoots('0', ['/foo', '/bar'], [], {});
239 return server.onAnalysisComplete.then((_) {
240 expect(server.statusAnalyzing, isFalse);
241 // Make sure getAnalysisContext returns the proper context for each.
242 AnalysisContext fooContext =
243 server.getAnalysisContextForSource(fooSource);
244 expect(fooContext, isNotNull);
245 AnalysisContext barContext =
246 server.getAnalysisContextForSource(barSource);
247 expect(barContext, isNotNull);
248 expect(fooContext, isNot(same(barContext)));
249 expect(fooContext.getKindOf(fooSource), SourceKind.LIBRARY);
250 expect(fooContext.getKindOf(barSource), SourceKind.UNKNOWN);
251 expect(barContext.getKindOf(fooSource), SourceKind.UNKNOWN);
252 expect(barContext.getKindOf(barSource), SourceKind.LIBRARY);
253 });
254 }
255
256 test_getContextSourcePair_nested() {
257 String dir1Path = '/dir1';
258 String dir2Path = dir1Path + '/dir2';
259 String filePath = dir2Path + '/file.dart';
260 resourceProvider.newFile('$dir1Path/.packages', '');
261 resourceProvider.newFile('$dir2Path/.packages', '');
262 resourceProvider.newFile(filePath, 'library lib;');
263 // create contexts
264 server.setAnalysisRoots('0', [dir1Path], [], {});
265 // get pair
266 ContextSourcePair pair = server.getContextSourcePair(filePath);
267 _assertContextOfFolder(pair.context, dir2Path);
268 Source source = pair.source;
269 expect(source, isNotNull);
270 expect(source.uri.scheme, 'file');
271 expect(source.fullName, filePath);
272 }
273
274 test_getContextSourcePair_nonFile() {
275 String dirPath = '/dir';
276 Folder dir = resourceProvider.newFolder(dirPath);
277
278 AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
279 _configureSourceFactory(context);
280 server.folderMap[dir] = context;
281
282 ContextSourcePair pair = server.getContextSourcePair(dirPath);
283 expect(pair, isNotNull);
284 expect(pair.context, isNull);
285 expect(pair.source, isNull);
286 }
287
288 test_getContextSourcePair_simple() {
289 String dirPath = '/dir';
290 String filePath = dirPath + '/file.dart';
291 resourceProvider.newFile(filePath, 'library lib;');
292 // create contexts
293 server.setAnalysisRoots('0', [dirPath], [], {});
294 // get pair
295 ContextSourcePair pair = server.getContextSourcePair(filePath);
296 _assertContextOfFolder(pair.context, dirPath);
297 Source source = pair.source;
298 expect(source, isNotNull);
299 expect(source.uri.scheme, 'file');
300 expect(source.fullName, filePath);
301 }
302
303 test_getContextSourcePair_withPackagesFile() {
304 String dirPath = '/dir';
305 String packagesFilePath = dirPath + '/.packages';
306 resourceProvider.newFile(packagesFilePath, 'dir:lib/');
307 String filePath = dirPath + '/lib/file.dart';
308 resourceProvider.newFile(filePath, 'library lib;');
309 // create contexts
310 server.setAnalysisRoots('0', [dirPath], [], {});
311 // get pair
312 ContextSourcePair pair = server.getContextSourcePair(filePath);
313 _assertContextOfFolder(pair.context, dirPath);
314 Source source = pair.source;
315 expect(source, isNotNull);
316 expect(source.uri.scheme, 'package');
317 expect(source.fullName, filePath);
318 }
319
320 /** 82 /**
321 * Test that having multiple analysis contexts analyze the same file doesn't 83 * Test that having multiple analysis contexts analyze the same file doesn't
322 * cause that file to receive duplicate notifications when it's modified. 84 * cause that file to receive duplicate notifications when it's modified.
323 */ 85 */
324 Future test_no_duplicate_notifications() async { 86 Future test_no_duplicate_notifications() async {
325 // Subscribe to STATUS so we'll know when analysis is done. 87 // Subscribe to STATUS so we'll know when analysis is done.
326 server.serverServices = [ServerService.STATUS].toSet(); 88 server.serverServices = [ServerService.STATUS].toSet();
327 resourceProvider.newFolder('/foo'); 89 resourceProvider.newFolder('/foo');
328 resourceProvider.newFolder('/bar'); 90 resourceProvider.newFolder('/bar');
329 resourceProvider.newFile('/foo/foo.dart', 'import "../bar/bar.dart";'); 91 resourceProvider.newFile('/foo/foo.dart', 'import "../bar/bar.dart";');
(...skipping 27 matching lines...) Expand all
357 break; 119 break;
358 default: 120 default:
359 if (!notificationTypesReceived.add(notificationType)) { 121 if (!notificationTypesReceived.add(notificationType)) {
360 fail('Notification type $notificationType received more than once'); 122 fail('Notification type $notificationType received more than once');
361 } 123 }
362 break; 124 break;
363 } 125 }
364 } 126 }
365 } 127 }
366 128
367 test_operationsRemovedOnContextDisposal() async {
368 resourceProvider.newFolder('/foo');
369 resourceProvider.newFile('/foo/baz.dart', 'library lib;');
370 resourceProvider.newFolder('/bar');
371 resourceProvider.newFile('/bar/baz.dart', 'library lib;');
372 server.setAnalysisRoots('0', ['/foo', '/bar'], [], {});
373 await pumpEventQueue();
374 AnalysisContext contextFoo = server.getAnalysisContext('/foo/baz.dart');
375 AnalysisContext contextBar = server.getAnalysisContext('/bar/baz.dart');
376 _MockServerOperation operationFoo = new _MockServerOperation(contextFoo);
377 _MockServerOperation operationBar = new _MockServerOperation(contextBar);
378 server.scheduleOperation(operationFoo);
379 server.scheduleOperation(operationBar);
380 server.setAnalysisRoots('1', ['/foo'], [], {});
381 await pumpEventQueue();
382 expect(operationFoo.isComplete, isTrue);
383 expect(operationBar.isComplete, isFalse);
384 }
385
386 Future test_prioritySourcesChangedEvent() {
387 resourceProvider.newFolder('/foo');
388
389 int eventCount = 0;
390 Source firstSource = null;
391 server.onPriorityChange.listen((PriorityChangeEvent event) {
392 ++eventCount;
393 firstSource = event.firstSource;
394 });
395
396 server.setAnalysisRoots('0', ['/foo'], [], {});
397 return pumpEventQueue().then((_) {
398 expect(eventCount, 0);
399
400 server.setPriorityFiles('1', ['/foo/bar.dart']);
401 return pumpEventQueue();
402 }).then((_) {
403 expect(eventCount, 1);
404 expect(firstSource.fullName, '/foo/bar.dart');
405
406 server.setPriorityFiles('2', ['/foo/b1.dart', '/foo/b2.dart']);
407 return pumpEventQueue();
408 }).then((_) {
409 expect(eventCount, 2);
410 expect(firstSource.fullName, '/foo/b1.dart');
411
412 server.setPriorityFiles('17', []);
413 return pumpEventQueue();
414 }).then((_) {
415 expect(eventCount, 3);
416 expect(firstSource, isNull);
417 });
418 }
419
420 void test_rethrowExceptions() { 129 void test_rethrowExceptions() {
421 Exception exceptionToThrow = new Exception('test exception'); 130 Exception exceptionToThrow = new Exception('test exception');
422 MockServerOperation operation = 131 MockServerOperation operation =
423 new MockServerOperation(ServerOperationPriority.ANALYSIS, (_) { 132 new MockServerOperation(ServerOperationPriority.ANALYSIS, (_) {
424 throw exceptionToThrow; 133 throw exceptionToThrow;
425 }); 134 });
426 server.operationQueue.add(operation); 135 server.operationQueue.add(operation);
427 server.performOperationPending = true; 136 server.performOperationPending = true;
428 try { 137 try {
429 server.performOperation(); 138 server.performOperation();
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 } 228 }
520 229
521 Future test_unknownRequest() { 230 Future test_unknownRequest() {
522 server.handlers = [new EchoHandler()]; 231 server.handlers = [new EchoHandler()];
523 var request = new Request('my22', 'randomRequest'); 232 var request = new Request('my22', 'randomRequest');
524 return channel.sendRequest(request).then((Response response) { 233 return channel.sendRequest(request).then((Response response) {
525 expect(response.id, equals('my22')); 234 expect(response.id, equals('my22'));
526 expect(response.error, isNotNull); 235 expect(response.error, isNotNull);
527 }); 236 });
528 } 237 }
529
530 void _assertContextOfFolder(
531 AnalysisContext context, String expectedFolderPath) {
532 Folder expectedFolder = resourceProvider.newFolder(expectedFolderPath);
533 ContextInfo expectedContextInfo =
534 (server.contextManager as ContextManagerImpl)
535 .getContextInfoFor(expectedFolder);
536 expect(expectedContextInfo, isNotNull);
537 expect(context, same(expectedContextInfo.context));
538 }
539
540 void _configureSourceFactory(AnalysisContext context) {
541 var resourceUriResolver = new ResourceUriResolver(resourceProvider);
542 var packageUriResolver = new PackageMapUriResolver(
543 resourceProvider, packageMapProvider.packageMap);
544 context.sourceFactory =
545 new SourceFactory([packageUriResolver, resourceUriResolver]);
546 }
547 } 238 }
548 239
549 class EchoHandler implements RequestHandler { 240 class EchoHandler implements RequestHandler {
550 @override 241 @override
551 Response handleRequest(Request request) { 242 Response handleRequest(Request request) {
552 if (request.method == 'echo') { 243 if (request.method == 'echo') {
553 return new Response(request.id, result: {'echo': true}); 244 return new Response(request.id, result: {'echo': true});
554 } 245 }
555 return null; 246 return null;
556 } 247 }
557 } 248 }
558
559 /**
560 * A [ServerOperation] that does nothing but keep track of whether or not it
561 * has been performed.
562 */
563 class _MockServerOperation implements ServerOperation {
564 final AnalysisContext context;
565 bool isComplete = false;
566
567 _MockServerOperation(this.context);
568
569 @override
570 ServerOperationPriority get priority => ServerOperationPriority.ANALYSIS;
571
572 @override
573 void perform(AnalysisServer server) {
574 isComplete = true;
575 }
576 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/test/analysis_abstract.dart ('k') | pkg/analysis_server/test/context_manager_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698