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

Side by Side Diff: pkg/analyzer/test/src/dart/analysis/driver_test.dart

Issue 2487003002: Use AnalysisDriverScheduler to schedule work across multiple AnalysisDriver(s). (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 analyzer.test.driver; 5 library analyzer.test.driver;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:convert'; 8 import 'dart:convert';
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 10 matching lines...) Expand all
21 import 'package:analyzer/src/generated/source.dart'; 21 import 'package:analyzer/src/generated/source.dart';
22 import 'package:convert/convert.dart'; 22 import 'package:convert/convert.dart';
23 import 'package:crypto/crypto.dart'; 23 import 'package:crypto/crypto.dart';
24 import 'package:test/test.dart'; 24 import 'package:test/test.dart';
25 import 'package:test_reflective_loader/test_reflective_loader.dart'; 25 import 'package:test_reflective_loader/test_reflective_loader.dart';
26 26
27 import '../../context/mock_sdk.dart'; 27 import '../../context/mock_sdk.dart';
28 28
29 main() { 29 main() {
30 defineReflectiveSuite(() { 30 defineReflectiveSuite(() {
31 defineReflectiveTests(DriverTest); 31 defineReflectiveTests(AnalysisDriverTest);
32 defineReflectiveTests(AnalysisDriverSchedulerTest);
32 }); 33 });
33 } 34 }
34 35
35 /** 36 /**
36 * Returns a [Future] that completes after pumping the event queue [times] 37 * Returns a [Future] that completes after pumping the event queue [times]
37 * times. By default, this should pump the event queue enough times to allow 38 * times. By default, this should pump the event queue enough times to allow
38 * any code to run, as long as it's not waiting on some external event. 39 * any code to run, as long as it's not waiting on some external event.
39 */ 40 */
40 Future pumpEventQueue([int times = 5000]) { 41 Future pumpEventQueue([int times = 5000]) {
41 if (times == 0) return new Future.value(); 42 if (times == 0) return new Future.value();
42 // We use a delayed future to allow microtask events to finish. The 43 // We use a delayed future to allow microtask events to finish. The
43 // Future.value or Future() constructors use scheduleMicrotask themselves and 44 // Future.value or Future() constructors use scheduleMicrotask themselves and
44 // would therefore not wait for microtask callbacks that are scheduled after 45 // would therefore not wait for microtask callbacks that are scheduled after
45 // invoking this method. 46 // invoking this method.
46 return new Future.delayed(Duration.ZERO, () => pumpEventQueue(times - 1)); 47 return new Future.delayed(Duration.ZERO, () => pumpEventQueue(times - 1));
47 } 48 }
48 49
49 @reflectiveTest 50 @reflectiveTest
50 class DriverTest { 51 class AnalysisDriverSchedulerTest {
51 static final MockSdk sdk = new MockSdk(); 52 static final MockSdk sdk = new MockSdk();
52 53
53 final MemoryResourceProvider provider = new MemoryResourceProvider(); 54 final MemoryResourceProvider provider = new MemoryResourceProvider();
54 final ByteStore byteStore = new _TestByteStore(); 55 final ByteStore byteStore = new _TestByteStore();
55 final FileContentOverlay contentOverlay = new FileContentOverlay(); 56 final FileContentOverlay contentOverlay = new FileContentOverlay();
57
56 final StringBuffer logBuffer = new StringBuffer(); 58 final StringBuffer logBuffer = new StringBuffer();
59 PerformanceLog logger;
57 60
61 AnalysisDriverScheduler scheduler;
62
63 List<AnalysisResult> allResults = [];
64
65 AnalysisDriver newDriver() {
66 AnalysisDriver driver = new AnalysisDriver(
67 scheduler,
68 logger,
69 provider,
70 byteStore,
71 contentOverlay,
72 new SourceFactory(
73 [new DartUriResolver(sdk), new ResourceUriResolver(provider)],
74 null,
75 provider),
76 new AnalysisOptionsImpl()..strongMode = true);
77 driver.results.forEach(allResults.add);
78 return driver;
79 }
80
81 void setUp() {
82 logger = new PerformanceLog(logBuffer);
83 scheduler = new AnalysisDriverScheduler(logger);
84 scheduler.start();
85 }
86
87 test_priorities_getResult_beforePriority() async {
88 AnalysisDriver driver1 = newDriver();
89 AnalysisDriver driver2 = newDriver();
90
91 String a = _p('/a.dart');
92 String b = _p('/b.dart');
93 String c = _p('/c.dart');
94 provider.newFile(a, 'class A {}');
95 provider.newFile(b, 'class B {}');
96 provider.newFile(c, 'class C {}');
97 driver1.addFile(a);
98 driver2.addFile(b);
99 driver2.addFile(c);
100 driver1.priorityFiles = [a];
101 driver2.priorityFiles = [a];
102
103 AnalysisResult result = await driver2.getResult(b);
104 expect(result.path, b);
105
106 await driver1.status.firstWhere((status) => status.isIdle);
107 await driver2.status.firstWhere((status) => status.isIdle);
108
109 expect(allResults, hasLength(3));
110 expect(allResults[0].path, b);
111 expect(allResults[1].path, a);
112 expect(allResults[2].path, c);
113 }
114
115 test_priorities_priorityBeforeGeneral1() async {
116 AnalysisDriver driver1 = newDriver();
117 AnalysisDriver driver2 = newDriver();
118
119 String a = _p('/a.dart');
120 String b = _p('/b.dart');
121 provider.newFile(a, 'class A {}');
122 provider.newFile(b, 'class B {}');
123 driver1.addFile(a);
124 driver2.addFile(b);
125 driver1.priorityFiles = [a];
126 driver2.priorityFiles = [a];
127
128 await driver1.status.firstWhere((status) => status.isIdle);
129 await driver2.status.firstWhere((status) => status.isIdle);
130
131 expect(allResults, hasLength(2));
132 expect(allResults[0].path, a);
133 expect(allResults[1].path, b);
134 }
135
136 test_priorities_priorityBeforeGeneral2() async {
137 AnalysisDriver driver1 = newDriver();
138 AnalysisDriver driver2 = newDriver();
139
140 String a = _p('/a.dart');
141 String b = _p('/b.dart');
142 provider.newFile(a, 'class A {}');
143 provider.newFile(b, 'class B {}');
144 driver1.addFile(a);
145 driver2.addFile(b);
146 driver1.priorityFiles = [b];
147 driver2.priorityFiles = [b];
148
149 await driver1.status.firstWhere((status) => status.isIdle);
150 await driver2.status.firstWhere((status) => status.isIdle);
151
152 expect(allResults, hasLength(2));
153 expect(allResults[0].path, b);
154 expect(allResults[1].path, a);
155 }
156
157 test_priorities_priorityBeforeGeneral3() async {
158 AnalysisDriver driver1 = newDriver();
159 AnalysisDriver driver2 = newDriver();
160
161 String a = _p('/a.dart');
162 String b = _p('/b.dart');
163 String c = _p('/c.dart');
164 provider.newFile(a, 'class A {}');
165 provider.newFile(b, 'class B {}');
166 provider.newFile(c, 'class C {}');
167 driver1.addFile(a);
168 driver1.addFile(b);
169 driver2.addFile(c);
170 driver1.priorityFiles = [a, c];
171 driver2.priorityFiles = [a, c];
172
173 await driver1.status.firstWhere((status) => status.isIdle);
174 await driver2.status.firstWhere((status) => status.isIdle);
175
176 expect(allResults, hasLength(3));
177 expect(allResults[0].path, a);
178 expect(allResults[1].path, c);
179 expect(allResults[2].path, b);
180 }
181
182 String _p(String path) => provider.convertPath(path);
183 }
184
185 @reflectiveTest
186 class AnalysisDriverTest {
187 static final MockSdk sdk = new MockSdk();
188
189 final MemoryResourceProvider provider = new MemoryResourceProvider();
190 final ByteStore byteStore = new _TestByteStore();
191 final FileContentOverlay contentOverlay = new FileContentOverlay();
192
193 final StringBuffer logBuffer = new StringBuffer();
194 PerformanceLog logger;
195
196 AnalysisDriverScheduler scheduler;
58 AnalysisDriver driver; 197 AnalysisDriver driver;
59 final _Monitor idleStatusMonitor = new _Monitor(); 198 final _Monitor idleStatusMonitor = new _Monitor();
60 final List<AnalysisStatus> allStatuses = <AnalysisStatus>[]; 199 final List<AnalysisStatus> allStatuses = <AnalysisStatus>[];
61 final List<AnalysisResult> allResults = <AnalysisResult>[]; 200 final List<AnalysisResult> allResults = <AnalysisResult>[];
62 201
63 String testProject; 202 String testProject;
64 String testFile; 203 String testFile;
65 204
66 void setUp() { 205 void setUp() {
67 new MockSdk(); 206 new MockSdk();
68 testProject = _p('/test/lib'); 207 testProject = _p('/test/lib');
69 testFile = _p('/test/lib/test.dart'); 208 testFile = _p('/test/lib/test.dart');
209 logger = new PerformanceLog(logBuffer);
210 scheduler = new AnalysisDriverScheduler(logger);
70 driver = new AnalysisDriver( 211 driver = new AnalysisDriver(
71 new PerformanceLog(logBuffer), 212 scheduler,
213 logger,
72 provider, 214 provider,
73 byteStore, 215 byteStore,
74 contentOverlay, 216 contentOverlay,
75 new SourceFactory([ 217 new SourceFactory([
76 new DartUriResolver(sdk), 218 new DartUriResolver(sdk),
77 new PackageMapUriResolver(provider, <String, List<Folder>>{ 219 new PackageMapUriResolver(provider, <String, List<Folder>>{
78 'test': [provider.getFolder(testProject)] 220 'test': [provider.getFolder(testProject)]
79 }), 221 }),
80 new ResourceUriResolver(provider) 222 new ResourceUriResolver(provider)
81 ], null, provider), 223 ], null, provider),
82 new AnalysisOptionsImpl()..strongMode = true); 224 new AnalysisOptionsImpl()..strongMode = true);
225 scheduler.start();
83 driver.status.lastWhere((status) { 226 driver.status.lastWhere((status) {
84 allStatuses.add(status); 227 allStatuses.add(status);
85 if (status.isIdle) { 228 if (status.isIdle) {
86 idleStatusMonitor.notify(); 229 idleStatusMonitor.notify();
87 } 230 }
88 }); 231 });
89 driver.results.listen(allResults.add); 232 driver.results.listen(allResults.add);
90 } 233 }
91 234
92 test_addFile_thenRemove() async { 235 test_addFile_thenRemove() async {
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 final f = 42; 425 final f = 42;
283 } 426 }
284 ''', 427 ''',
285 priority: true); 428 priority: true);
286 await _waitForIdle(); 429 await _waitForIdle();
287 430
288 AnalysisResult result = await driver.getResult(testFile); 431 AnalysisResult result = await driver.getResult(testFile);
289 expect(_getClassFieldType(result.unit, 'C', 'f'), 'int'); 432 expect(_getClassFieldType(result.unit, 'C', 'f'), 'int');
290 } 433 }
291 434
292 test_getResult_sameFile_twoUris() async {
293 var a = _p('/test/lib/a.dart');
294 var b = _p('/test/lib/b.dart');
295 var c = _p('/test/test/c.dart');
296 provider.newFile(a, 'class A<T> {}');
297 provider.newFile(
298 b,
299 r'''
300 import 'a.dart';
301 var VB = new A<int>();
302 ''');
303 provider.newFile(
304 c,
305 r'''
306 import '../lib/a.dart';
307 var VC = new A<double>();
308 ''');
309
310 driver.addFile(a);
311 driver.addFile(b);
312 await _waitForIdle();
313
314 {
315 AnalysisResult result = await driver.getResult(b);
316 expect(_getImportSource(result.unit, 0).uri.toString(),
317 'package:test/a.dart');
318 expect(_getTopLevelVarType(result.unit, 'VB'), 'A<int>');
319 }
320
321 {
322 AnalysisResult result = await driver.getResult(c);
323 expect(_getImportSource(result.unit, 0).uri,
324 provider.pathContext.toUri(_p('/test/lib/a.dart')));
325 expect(_getTopLevelVarType(result.unit, 'VC'), 'A<double>');
326 }
327 }
328
329 test_getResult_mix_fileAndPackageUris() async { 435 test_getResult_mix_fileAndPackageUris() async {
330 var a = _p('/test/bin/a.dart'); 436 var a = _p('/test/bin/a.dart');
331 var b = _p('/test/bin/b.dart'); 437 var b = _p('/test/bin/b.dart');
332 var c = _p('/test/lib/c.dart'); 438 var c = _p('/test/lib/c.dart');
333 var d = _p('/test/test/d.dart'); 439 var d = _p('/test/test/d.dart');
334 provider.newFile( 440 provider.newFile(
335 a, 441 a,
336 r''' 442 r'''
337 import 'package:test/c.dart'; 443 import 'package:test/c.dart';
338 int x = y; 444 int x = y;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 // successfully imports file:///my_pkg/test/d.dart, causing y to have an 476 // successfully imports file:///my_pkg/test/d.dart, causing y to have an
371 // inferred type of String. 477 // inferred type of String.
372 { 478 {
373 AnalysisResult result = await driver.getResult(b); 479 AnalysisResult result = await driver.getResult(b);
374 List<AnalysisError> errors = result.errors; 480 List<AnalysisError> errors = result.errors;
375 expect(errors, hasLength(1)); 481 expect(errors, hasLength(1));
376 expect(errors[0].errorCode, StaticTypeWarningCode.INVALID_ASSIGNMENT); 482 expect(errors[0].errorCode, StaticTypeWarningCode.INVALID_ASSIGNMENT);
377 } 483 }
378 } 484 }
379 485
486 test_getResult_sameFile_twoUris() async {
487 var a = _p('/test/lib/a.dart');
488 var b = _p('/test/lib/b.dart');
489 var c = _p('/test/test/c.dart');
490 provider.newFile(a, 'class A<T> {}');
491 provider.newFile(
492 b,
493 r'''
494 import 'a.dart';
495 var VB = new A<int>();
496 ''');
497 provider.newFile(
498 c,
499 r'''
500 import '../lib/a.dart';
501 var VC = new A<double>();
502 ''');
503
504 driver.addFile(a);
505 driver.addFile(b);
506 await _waitForIdle();
507
508 {
509 AnalysisResult result = await driver.getResult(b);
510 expect(_getImportSource(result.unit, 0).uri.toString(),
511 'package:test/a.dart');
512 expect(_getTopLevelVarType(result.unit, 'VB'), 'A<int>');
513 }
514
515 {
516 AnalysisResult result = await driver.getResult(c);
517 expect(_getImportSource(result.unit, 0).uri,
518 provider.pathContext.toUri(_p('/test/lib/a.dart')));
519 expect(_getTopLevelVarType(result.unit, 'VC'), 'A<double>');
520 }
521 }
522
380 test_getResult_selfConsistent() async { 523 test_getResult_selfConsistent() async {
381 var a = _p('/test/lib/a.dart'); 524 var a = _p('/test/lib/a.dart');
382 var b = _p('/test/lib/b.dart'); 525 var b = _p('/test/lib/b.dart');
383 provider.newFile( 526 provider.newFile(
384 a, 527 a,
385 r''' 528 r'''
386 import 'b.dart'; 529 import 'b.dart';
387 var A1 = 1; 530 var A1 = 1;
388 var A2 = B1; 531 var A2 = B1;
389 '''); 532 ''');
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 @override 844 @override
702 List<int> get(String key) { 845 List<int> get(String key) {
703 return map[key]; 846 return map[key];
704 } 847 }
705 848
706 @override 849 @override
707 void put(String key, List<int> bytes) { 850 void put(String key, List<int> bytes) {
708 map[key] = bytes; 851 map[key] = bytes;
709 } 852 }
710 } 853 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698