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

Side by Side Diff: pkg/analysis_server/test/src/plugin/notification_manager_test.dart

Issue 2692373002: Add the notification manager (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 import 'package:analysis_server/plugin/protocol/protocol.dart' as server;
6 import 'package:analysis_server/src/channel/channel.dart';
7 import 'package:analysis_server/src/plugin/notification_manager.dart';
8 import 'package:analyzer/file_system/memory_file_system.dart';
9 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
10 import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
11 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
12 import 'package:test/test.dart';
13 import 'package:test_reflective_loader/test_reflective_loader.dart';
14
15 import 'protocol_test_utilities.dart';
16
17 main() {
18 defineReflectiveSuite(() {
19 defineReflectiveTests(NotificationManagerTest);
20 });
21 }
22
23 @reflectiveTest
24 class NotificationManagerTest extends ProtocolTestUtilities {
25 String testDir;
26 String fileA;
27 String fileB;
28
29 TestChannel channel;
30
31 NotificationManager manager;
32
33 void setUp() {
34 MemoryResourceProvider provider = new MemoryResourceProvider();
35 testDir = provider.convertPath('/test');
36 fileA = provider.convertPath('/test/a.dart');
37 fileB = provider.convertPath('/test/b.dart');
38 channel = new TestChannel();
39 manager = new NotificationManager(channel, provider);
40 }
41
42 void test_handlePluginNotification_errors() {
43 manager.setAnalysisRoots([testDir], []);
44 plugin.AnalysisError pluginError1 = pluginAnalysisError(0, 0, file: fileA);
45 plugin.AnalysisError pluginError2 = pluginAnalysisError(3, 4, file: fileA);
46 plugin.AnalysisErrorsParams params =
47 new plugin.AnalysisErrorsParams(fileA, [pluginError1, pluginError2]);
48 manager.handlePluginNotification('a', params.toNotification());
49
50 server.AnalysisError serverError1 = serverAnalysisError(0, 0, file: fileA);
51 server.AnalysisError serverError2 = serverAnalysisError(3, 4, file: fileA);
52 _verifyErrors(fileA, [serverError1, serverError2]);
53 }
54
55 void test_handlePluginNotification_folding() {
56 manager.setSubscriptions({
57 server.AnalysisService.FOLDING: [fileA, fileB]
58 });
59 plugin.FoldingRegion pluginRegion1 = pluginFoldingRegion(10, 3);
60 plugin.FoldingRegion pluginRegion2 = pluginFoldingRegion(20, 6);
61 plugin.AnalysisFoldingParams params =
62 new plugin.AnalysisFoldingParams(fileA, [pluginRegion1, pluginRegion2]);
63 manager.handlePluginNotification('a', params.toNotification());
64
65 server.FoldingRegion serverRegion1 = serverFoldingRegion(10, 3);
66 server.FoldingRegion serverRegion2 = serverFoldingRegion(20, 6);
67 _verifyFoldingRegions(fileA, [serverRegion1, serverRegion2]);
68 }
69
70 void test_handlePluginNotification_highlights() {
71 manager.setSubscriptions({
72 server.AnalysisService.HIGHLIGHTS: [fileA, fileB]
73 });
74 plugin.HighlightRegion pluginRegion1 = pluginHighlightRegion(10, 3);
75 plugin.HighlightRegion pluginRegion2 = pluginHighlightRegion(20, 6);
76 plugin.AnalysisHighlightsParams params =
77 new plugin.AnalysisHighlightsParams(
78 fileA, [pluginRegion1, pluginRegion2]);
79
80 server.HighlightRegion serverRegion1 = serverHighlightRegion(10, 3);
81 server.HighlightRegion serverRegion2 = serverHighlightRegion(20, 6);
82 manager.handlePluginNotification('a', params.toNotification());
83 _verifyHighlightRegions(fileA, [serverRegion1, serverRegion2]);
84 }
85
86 void test_handlePluginNotification_naviation() {
87 manager.setSubscriptions({
88 server.AnalysisService.NAVIGATION: [fileA, fileB]
89 });
90 plugin.AnalysisNavigationParams pluginParams =
91 pluginNavigationParams(0, 0, file: fileA);
92 manager.handlePluginNotification('a', pluginParams.toNotification());
93
94 server.AnalysisNavigationParams serverParams =
95 serverNavigationParams(0, 0, file: fileA);
96 _verifyNavigationParams(serverParams);
97 }
98
99 void test_handlePluginNotification_occurences() {
100 manager.setSubscriptions({
101 server.AnalysisService.OCCURRENCES: [fileA, fileB]
102 });
103 plugin.Occurrences pluginOccurrences1 = pluginOccurrences(0, 0);
104 plugin.Occurrences pluginOccurrences2 = pluginOccurrences(5, 7);
105 plugin.AnalysisOccurrencesParams params =
106 new plugin.AnalysisOccurrencesParams(
107 fileA, [pluginOccurrences1, pluginOccurrences2]);
108
109 server.Occurrences serverOccurrences1 = serverOccurrences(0, 0);
110 server.Occurrences serverOccurrences2 = serverOccurrences(5, 7);
111 manager.handlePluginNotification('a', params.toNotification());
112 _verifyOccurrences(fileA, [serverOccurrences1, serverOccurrences2]);
113 }
114
115 void test_handlePluginNotification_outline() {
116 manager.setSubscriptions({
117 server.AnalysisService.OUTLINE: [fileA, fileB]
118 });
119 plugin.Outline pluginOutline1 = pluginOutline(0, 0);
120 plugin.AnalysisOutlineParams params =
121 new plugin.AnalysisOutlineParams(fileA, [pluginOutline1]);
122 manager.handlePluginNotification('a', params.toNotification());
123
124 server.Outline serverOutline1 = serverOutline(0, 0);
125 _verifyOutlines(fileA, serverOutline1);
126 }
127
128 void test_recordAnalysisErrors_noSubscription() {
129 server.AnalysisError error = serverAnalysisError(0, 0, file: fileA);
130 manager.recordAnalysisErrors('a', fileA, [error]);
131 expect(channel.sentNotification, isNull);
132 }
133
134 void test_recordAnalysisErrors_withSubscription() {
135 manager.setAnalysisRoots([testDir], []);
136 //
137 // Errors should be reported when they are recorded.
138 //
139 server.AnalysisError error1 = serverAnalysisError(0, 0, file: fileA);
140 server.AnalysisError error2 = serverAnalysisError(3, 4, file: fileA);
141 manager.recordAnalysisErrors('a', fileA, [error1, error2]);
142 _verifyErrors(fileA, [error1, error2]);
143 //
144 // Errors from different plugins should be cumulative.
145 //
146 server.AnalysisError error3 = serverAnalysisError(6, 8, file: fileA);
147 manager.recordAnalysisErrors('b', fileA, [error3]);
148 _verifyErrors(fileA, [error1, error2, error3]);
149 //
150 // Overwriting errors from one plugin should not affect errors from other
151 // plugins.
152 //
153 server.AnalysisError error4 = serverAnalysisError(9, 12, file: fileA);
154 manager.recordAnalysisErrors('a', fileA, [error4]);
155 _verifyErrors(fileA, [error4, error3]);
156 //
157 // Recording errors against a file should not affect the errors for other
158 // files.
159 //
160 server.AnalysisError error5 = serverAnalysisError(12, 16, file: fileB);
161 manager.recordAnalysisErrors('a', fileB, [error5]);
162 _verifyErrors(fileB, [error5]);
163 }
164
165 void test_recordFoldingRegions_noSubscription() {
166 server.FoldingRegion region = serverFoldingRegion(10, 5);
167 manager.recordFoldingRegions('a', fileA, [region]);
168 expect(channel.sentNotification, isNull);
169 }
170
171 void test_recordFoldingRegions_withSubscription() {
172 manager.setSubscriptions({
173 server.AnalysisService.FOLDING: [fileA, fileB]
174 });
175 //
176 // Regions should be reported when they are recorded.
177 //
178 server.FoldingRegion region1 = serverFoldingRegion(10, 3);
179 server.FoldingRegion region2 = serverFoldingRegion(20, 6);
180 manager.recordFoldingRegions('a', fileA, [region1, region2]);
181 _verifyFoldingRegions(fileA, [region1, region2]);
182 //
183 // Regions from different plugins should be cumulative.
184 //
185 server.FoldingRegion region3 = serverFoldingRegion(30, 5);
186 manager.recordFoldingRegions('b', fileA, [region3]);
187 _verifyFoldingRegions(fileA, [region1, region2, region3]);
188 //
189 // Overwriting regions from one plugin should not affect regions from other
190 // plugins.
191 //
192 server.FoldingRegion region4 = serverFoldingRegion(40, 2);
193 manager.recordFoldingRegions('a', fileA, [region4]);
194 _verifyFoldingRegions(fileA, [region4, region3]);
195 //
196 // Recording regions against a file should not affect the regions for other
197 // files.
198 //
199 server.FoldingRegion region5 = serverFoldingRegion(50, 7);
200 manager.recordFoldingRegions('a', fileB, [region5]);
201 _verifyFoldingRegions(fileB, [region5]);
202 }
203
204 void test_recordHighlightRegions_noSubscription() {
205 server.HighlightRegion region = serverHighlightRegion(10, 5);
206 manager.recordHighlightRegions('a', fileA, [region]);
207 expect(channel.sentNotification, isNull);
208 }
209
210 void test_recordHighlightRegions_withSubscription() {
211 manager.setSubscriptions({
212 server.AnalysisService.HIGHLIGHTS: [fileA, fileB]
213 });
214 //
215 // Regions should be reported when they are recorded.
216 //
217 server.HighlightRegion region1 = serverHighlightRegion(10, 3);
218 server.HighlightRegion region2 = serverHighlightRegion(20, 6);
219 manager.recordHighlightRegions('a', fileA, [region1, region2]);
220 _verifyHighlightRegions(fileA, [region1, region2]);
221 //
222 // Regions from different plugins should be cumulative.
223 //
224 server.HighlightRegion region3 = serverHighlightRegion(30, 5);
225 manager.recordHighlightRegions('b', fileA, [region3]);
226 _verifyHighlightRegions(fileA, [region1, region2, region3]);
227 //
228 // Overwriting regions from one plugin should not affect regions from other
229 // plugins.
230 //
231 server.HighlightRegion region4 = serverHighlightRegion(40, 2);
232 manager.recordHighlightRegions('a', fileA, [region4]);
233 _verifyHighlightRegions(fileA, [region4, region3]);
234 //
235 // Recording regions against a file should not affect the regions for other
236 // files.
237 //
238 server.HighlightRegion region5 = serverHighlightRegion(50, 7);
239 manager.recordHighlightRegions('a', fileB, [region5]);
240 _verifyHighlightRegions(fileB, [region5]);
241 }
242
243 void test_recordNavigationParams_noSubscription() {
244 server.AnalysisNavigationParams params =
245 serverNavigationParams(0, 0, file: fileA);
246 manager.recordNavigationParams('a', fileA, params);
247 expect(channel.sentNotification, isNull);
248 }
249
250 void test_recordNavigationParams_withSubscription() {
251 manager.setSubscriptions({
252 server.AnalysisService.NAVIGATION: [fileA, fileB]
253 });
254 //
255 // Parameters should be reported when they are recorded.
256 //
257 server.AnalysisNavigationParams params1 =
258 serverNavigationParams(0, 0, file: fileA);
259 manager.recordNavigationParams('a', fileA, params1);
260 _verifyNavigationParams(params1);
261 //
262 // Parameters from different plugins should be cumulative.
263 //
264 server.AnalysisNavigationParams params2 =
265 serverNavigationParams(2, 4, file: fileA);
266 manager.recordNavigationParams('b', fileA, params2);
267 server.AnalysisNavigationParams params1and2 =
268 new server.AnalysisNavigationParams(fileA, <server.NavigationRegion>[
269 new server.NavigationRegion(0, 2, <int>[0]),
270 new server.NavigationRegion(4, 2, <int>[1])
271 ], <server.NavigationTarget>[
272 new server.NavigationTarget(server.ElementKind.FIELD, 0, 1, 2, 2, 3),
273 new server.NavigationTarget(server.ElementKind.FIELD, 2, 5, 2, 6, 7)
274 ], <String>[
275 'aa',
276 'ab',
277 'ac',
278 'ad'
279 ]);
280 _verifyNavigationParams(params1and2);
281 //
282 // Overwriting parameters from one plugin should not affect parameters from
283 // other plugins.
284 //
285 server.AnalysisNavigationParams params3 =
286 serverNavigationParams(4, 8, file: fileA);
287 manager.recordNavigationParams('a', fileA, params3);
288 server.AnalysisNavigationParams params3and2 =
289 new server.AnalysisNavigationParams(fileA, <server.NavigationRegion>[
290 new server.NavigationRegion(8, 2, <int>[0]),
291 new server.NavigationRegion(4, 2, <int>[1])
292 ], <server.NavigationTarget>[
293 new server.NavigationTarget(server.ElementKind.FIELD, 0, 9, 2, 10, 11),
294 new server.NavigationTarget(server.ElementKind.FIELD, 2, 5, 2, 6, 7)
295 ], <String>[
296 'ae',
297 'af',
298 'ac',
299 'ad'
300 ]);
301 _verifyNavigationParams(params3and2);
302 //
303 // Recording parameters against a file should not affect the parameters for
304 // other files.
305 //
306 server.AnalysisNavigationParams params4 =
307 serverNavigationParams(6, 12, file: fileB);
308 manager.recordNavigationParams('a', fileB, params4);
309 _verifyNavigationParams(params4);
310 }
311
312 void test_recordOccurrences_noSubscription() {
313 server.Occurrences occurrences = serverOccurrences(0, 0);
314 manager.recordOccurrences('a', fileA, [occurrences]);
315 expect(channel.sentNotification, isNull);
316 }
317
318 void test_recordOccurrences_withSubscription() {
319 manager.setSubscriptions({
320 server.AnalysisService.OCCURRENCES: [fileA, fileB]
321 });
322 //
323 // Occurrences should be reported when they are recorded.
324 //
325 server.Occurrences occurrences1 = serverOccurrences(0, 0);
326 server.Occurrences occurrences2 = serverOccurrences(5, 7);
327 manager.recordOccurrences('a', fileA, [occurrences1, occurrences2]);
328 _verifyOccurrences(fileA, [occurrences1, occurrences2]);
329 //
330 // Occurrences from different plugins should be cumulative.
331 //
332 server.Occurrences occurrences3 = serverOccurrences(10, 14);
333 manager.recordOccurrences('b', fileA, [occurrences3]);
334 _verifyOccurrences(fileA, [occurrences1, occurrences2, occurrences3]);
335 //
336 // Overwriting occurrences from one plugin should not affect occurrences
337 // from other plugins.
338 //
339 server.Occurrences occurrences4 = serverOccurrences(15, 21);
340 manager.recordOccurrences('a', fileA, [occurrences4]);
341 _verifyOccurrences(fileA, [occurrences4, occurrences3]);
342 //
343 // Recording occurrences against a file should not affect the occurrences
344 // for other files.
345 //
346 server.Occurrences occurrences5 = serverOccurrences(20, 28);
347 manager.recordOccurrences('a', fileB, [occurrences5]);
348 _verifyOccurrences(fileB, [occurrences5]);
349 }
350
351 void test_recordOutlines_noSubscription() {
352 server.Outline outline = serverOutline(0, 0);
353 manager.recordOutlines('a', fileA, [outline]);
354 expect(channel.sentNotification, isNull);
355 }
356
357 @failingTest
358 void test_recordOutlines_withSubscription() {
359 fail('The outline handling needs to be re-worked slightly');
360 // TODO(brianwilkerson) Figure out outlines. What should we do when merge
361 // cannot produce a single outline?
362 manager.setSubscriptions({
363 server.AnalysisService.OUTLINE: [fileA, fileB]
364 });
365 //
366 // Outlines should be reported when they are recorded.
367 //
368 server.Outline outline1 = serverOutline(0, 0);
369 server.Outline outline2 = serverOutline(5, 7);
370 manager.recordOutlines('a', fileA, [outline1, outline2]);
371 // TODO(brianwilkerson) Figure out how to test this.
372 // _verifyOutlines(fileA, [outline1, outline2]);
373 //
374 // Outlines from different plugins should be cumulative.
375 //
376 server.Outline outline3 = serverOutline(10, 14);
377 manager.recordOutlines('b', fileA, [outline3]);
378 // TODO(brianwilkerson) Figure out how to test this.
379 // _verifyOutlines(fileA, [outline1, outline2, outline3]);
380 //
381 // Overwriting outlines from one plugin should not affect outlines from
382 // other plugins.
383 //
384 server.Outline outline4 = serverOutline(15, 21);
385 manager.recordOutlines('a', fileA, [outline4]);
386 // TODO(brianwilkerson) Figure out how to test this.
387 // _verifyOutlines(fileA, [outline4, outline3]);
388 //
389 // Recording outlines against a file should not affect the outlines for
390 // other files.
391 //
392 server.Outline outline5 = serverOutline(20, 28);
393 manager.recordOutlines('a', fileB, [outline5]);
394 // TODO(brianwilkerson) Figure out how to test this.
395 // _verifyOutlines(fileB, [outline5]);
396 }
397
398 void _verifyErrors(
399 String fileName, List<server.AnalysisError> expectedErrors) {
400 server.Notification notification = channel.sentNotification;
401 expect(notification, isNotNull);
402 expect(notification.event, 'analysis.errors');
403 server.AnalysisErrorsParams params =
404 new server.AnalysisErrorsParams.fromNotification(notification);
405 expect(params, isNotNull);
406 expect(params.file, fileName);
407 expect(params.errors, equals(expectedErrors));
408 channel.sentNotification = null;
409 }
410
411 void _verifyFoldingRegions(
412 String fileName, List<server.FoldingRegion> expectedRegions) {
413 server.Notification notification = channel.sentNotification;
414 expect(notification, isNotNull);
415 expect(notification.event, 'analysis.folding');
416 server.AnalysisFoldingParams params =
417 new server.AnalysisFoldingParams.fromNotification(notification);
418 expect(params, isNotNull);
419 expect(params.file, fileName);
420 expect(params.regions, equals(expectedRegions));
421 channel.sentNotification = null;
422 }
423
424 void _verifyHighlightRegions(
425 String fileName, List<server.HighlightRegion> expectedRegions) {
426 server.Notification notification = channel.sentNotification;
427 expect(notification, isNotNull);
428 expect(notification.event, 'analysis.highlights');
429 server.AnalysisHighlightsParams params =
430 new server.AnalysisHighlightsParams.fromNotification(notification);
431 expect(params, isNotNull);
432 expect(params.file, fileName);
433 expect(params.regions, equals(expectedRegions));
434 channel.sentNotification = null;
435 }
436
437 void _verifyNavigationParams(server.AnalysisNavigationParams expectedParams) {
438 server.Notification notification = channel.sentNotification;
439 expect(notification, isNotNull);
440 expect(notification.event, 'analysis.navigation');
441 server.AnalysisNavigationParams params =
442 new server.AnalysisNavigationParams.fromNotification(notification);
443 expect(params, isNotNull);
444 expect(params.file, expectedParams.file);
445 expect(params.files, equals(expectedParams.files));
446 expect(params.regions, equals(expectedParams.regions));
447 expect(params.targets, equals(expectedParams.targets));
448 channel.sentNotification = null;
449 }
450
451 void _verifyOccurrences(
452 String fileName, List<server.Occurrences> expectedOccurrences) {
453 server.Notification notification = channel.sentNotification;
454 expect(notification, isNotNull);
455 expect(notification.event, 'analysis.occurrences');
456 server.AnalysisOccurrencesParams params =
457 new server.AnalysisOccurrencesParams.fromNotification(notification);
458 expect(params, isNotNull);
459 expect(params.file, fileName);
460 expect(params.occurrences, equals(expectedOccurrences));
461 channel.sentNotification = null;
462 }
463
464 void _verifyOutlines(String fileName, server.Outline expectedOutline) {
465 server.Notification notification = channel.sentNotification;
466 expect(notification, isNotNull);
467 expect(notification.event, 'analysis.outline');
468 server.AnalysisOutlineParams params =
469 new server.AnalysisOutlineParams.fromNotification(notification);
470 expect(params, isNotNull);
471 expect(params.file, fileName);
472 expect(params.outline, equals(expectedOutline));
473 channel.sentNotification = null;
474 }
475 }
476
477 class TestChannel implements ServerCommunicationChannel {
478 server.Notification sentNotification;
479
480 @override
481 void close() {
482 fail('Unexpected invocation of close');
483 }
484
485 @override
486 void listen(void onRequest(server.Request request),
487 {Function onError, void onDone()}) {
488 fail('Unexpected invocation of listen');
489 }
490
491 @override
492 void sendNotification(server.Notification notification) {
493 sentNotification = notification;
494 }
495
496 @override
497 void sendResponse(server.Response response) {
498 fail('Unexpected invocation of sendResponse');
499 }
500 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698