OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |