| 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.domain.analysis; | 5 library test.domain.analysis; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 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/domain_analysis.dart'; | 11 import 'package:analysis_server/src/domain_analysis.dart'; |
| 12 import 'package:analysis_server/src/plugin/server_plugin.dart'; | 12 import 'package:analysis_server/src/plugin/server_plugin.dart'; |
| 13 import 'package:analysis_server/src/protocol.dart'; | 13 import 'package:analysis_server/src/protocol.dart'; |
| 14 import 'package:analyzer/file_system/memory_file_system.dart'; | 14 import 'package:analyzer/file_system/memory_file_system.dart'; |
| 15 import 'package:analyzer/instrumentation/instrumentation.dart'; | 15 import 'package:analyzer/instrumentation/instrumentation.dart'; |
| 16 import 'package:path/path.dart'; | 16 import 'package:path/path.dart'; |
| 17 import 'package:plugin/manager.dart'; | 17 import 'package:plugin/manager.dart'; |
| 18 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 18 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 19 import 'package:unittest/unittest.dart'; | 19 import 'package:unittest/unittest.dart'; |
| 20 | 20 |
| 21 import 'analysis_abstract.dart'; | 21 import 'analysis_abstract.dart'; |
| 22 import 'mock_sdk.dart'; | 22 import 'mock_sdk.dart'; |
| 23 import 'mocks.dart'; | 23 import 'mocks.dart'; |
| 24 import 'utils.dart'; |
| 24 | 25 |
| 25 main() { | 26 main() { |
| 26 groupSep = ' | '; | 27 initializeTestEnvironment(); |
| 27 | 28 |
| 28 defineReflectiveTests(AnalysisDomainTest); | 29 defineReflectiveTests(AnalysisDomainTest); |
| 29 defineReflectiveTests(SetSubscriptionsTest); | 30 defineReflectiveTests(SetSubscriptionsTest); |
| 30 | 31 |
| 31 MockServerChannel serverChannel; | 32 MockServerChannel serverChannel; |
| 32 MemoryResourceProvider resourceProvider; | 33 MemoryResourceProvider resourceProvider; |
| 33 AnalysisServer server; | 34 AnalysisServer server; |
| 34 AnalysisDomainHandler handler; | 35 AnalysisDomainHandler handler; |
| 35 | 36 |
| 36 setUp(() { | 37 setUp(() { |
| 37 serverChannel = new MockServerChannel(); | 38 serverChannel = new MockServerChannel(); |
| 38 resourceProvider = new MemoryResourceProvider(); | 39 resourceProvider = new MemoryResourceProvider(); |
| 39 ExtensionManager manager = new ExtensionManager(); | 40 ExtensionManager manager = new ExtensionManager(); |
| 40 ServerPlugin serverPlugin = new ServerPlugin(); | 41 ServerPlugin serverPlugin = new ServerPlugin(); |
| 41 manager.processPlugins([serverPlugin]); | 42 manager.processPlugins([serverPlugin]); |
| 42 server = new AnalysisServer(serverChannel, resourceProvider, | 43 server = new AnalysisServer( |
| 43 new MockPackageMapProvider(), null, serverPlugin, | 44 serverChannel, |
| 44 new AnalysisServerOptions(), new MockSdk(), | 45 resourceProvider, |
| 46 new MockPackageMapProvider(), |
| 47 null, |
| 48 serverPlugin, |
| 49 new AnalysisServerOptions(), |
| 50 new MockSdk(), |
| 45 InstrumentationService.NULL_SERVICE); | 51 InstrumentationService.NULL_SERVICE); |
| 46 handler = new AnalysisDomainHandler(server); | 52 handler = new AnalysisDomainHandler(server); |
| 47 }); | 53 }); |
| 48 | 54 |
| 49 group('updateContent', testUpdateContent); | 55 group('updateContent', testUpdateContent); |
| 50 | 56 |
| 51 group('AnalysisDomainHandler', () { | 57 group('AnalysisDomainHandler', () { |
| 52 group('setAnalysisRoots', () { | 58 group('setAnalysisRoots', () { |
| 53 Response testSetAnalysisRoots( | 59 Response testSetAnalysisRoots( |
| 54 List<String> included, List<String> excluded) { | 60 List<String> included, List<String> excluded) { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 } | 131 } |
| 126 | 132 |
| 127 setPriorityFiles(['/p1/a.dart', '/p2/b.dart']); | 133 setPriorityFiles(['/p1/a.dart', '/p2/b.dart']); |
| 128 setPriorityFiles(['/p2/b.dart', '/p2/c.dart']); | 134 setPriorityFiles(['/p2/b.dart', '/p2/c.dart']); |
| 129 setPriorityFiles([]); | 135 setPriorityFiles([]); |
| 130 }); | 136 }); |
| 131 }); | 137 }); |
| 132 | 138 |
| 133 group('updateOptions', () { | 139 group('updateOptions', () { |
| 134 test('invalid', () { | 140 test('invalid', () { |
| 135 var request = new Request( | 141 var request = new Request('0', ANALYSIS_UPDATE_OPTIONS, { |
| 136 '0', ANALYSIS_UPDATE_OPTIONS, {OPTIONS: {'not-an-option': true}}); | 142 OPTIONS: {'not-an-option': true} |
| 143 }); |
| 137 var response = handler.handleRequest(request); | 144 var response = handler.handleRequest(request); |
| 138 // Invalid options should be silently ignored. | 145 // Invalid options should be silently ignored. |
| 139 expect(response, isResponseSuccess('0')); | 146 expect(response, isResponseSuccess('0')); |
| 140 }); | 147 }); |
| 141 | 148 |
| 142 test('null', () { | 149 test('null', () { |
| 143 // null is allowed as a synonym for {}. | 150 // null is allowed as a synonym for {}. |
| 144 var request = | 151 var request = |
| 145 new Request('0', ANALYSIS_UPDATE_OPTIONS, {OPTIONS: null}); | 152 new Request('0', ANALYSIS_UPDATE_OPTIONS, {OPTIONS: null}); |
| 146 var response = handler.handleRequest(request); | 153 var response = handler.handleRequest(request); |
| 147 expect(response, isResponseSuccess('0')); | 154 expect(response, isResponseSuccess('0')); |
| 148 }); | 155 }); |
| 149 }); | 156 }); |
| 150 }); | 157 }); |
| 151 } | 158 } |
| 152 | 159 |
| 153 testUpdateContent() { | 160 testUpdateContent() { |
| 154 test('bad type', () { | 161 test('bad type', () { |
| 155 AnalysisTestHelper helper = new AnalysisTestHelper(); | 162 AnalysisTestHelper helper = new AnalysisTestHelper(); |
| 156 helper.createSingleFileProject('// empty'); | 163 helper.createSingleFileProject('// empty'); |
| 157 return helper.onAnalysisComplete.then((_) { | 164 return helper.onAnalysisComplete.then((_) { |
| 158 Request request = new Request('0', ANALYSIS_UPDATE_CONTENT, { | 165 Request request = new Request('0', ANALYSIS_UPDATE_CONTENT, { |
| 159 'files': {helper.testFile: {TYPE: 'foo',}} | 166 'files': { |
| 167 helper.testFile: {TYPE: 'foo',} |
| 168 } |
| 160 }); | 169 }); |
| 161 Response response = helper.handler.handleRequest(request); | 170 Response response = helper.handler.handleRequest(request); |
| 162 expect(response, isResponseFailure('0')); | 171 expect(response, isResponseFailure('0')); |
| 163 }); | 172 }); |
| 164 }); | 173 }); |
| 165 | 174 |
| 166 test('full content', () { | 175 test('full content', () { |
| 167 AnalysisTestHelper helper = new AnalysisTestHelper(); | 176 AnalysisTestHelper helper = new AnalysisTestHelper(); |
| 168 helper.createSingleFileProject('// empty'); | 177 helper.createSingleFileProject('// empty'); |
| 169 return helper.onAnalysisComplete.then((_) { | 178 return helper.onAnalysisComplete.then((_) { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 if (notification.event == ANALYSIS_ERRORS) { | 293 if (notification.event == ANALYSIS_ERRORS) { |
| 285 var decoded = new AnalysisErrorsParams.fromNotification(notification); | 294 var decoded = new AnalysisErrorsParams.fromNotification(notification); |
| 286 filesErrors[decoded.file] = decoded.errors; | 295 filesErrors[decoded.file] = decoded.errors; |
| 287 } | 296 } |
| 288 } | 297 } |
| 289 | 298 |
| 290 test_packageMapDependencies() async { | 299 test_packageMapDependencies() async { |
| 291 // Prepare a source file that has errors because it refers to an unknown | 300 // Prepare a source file that has errors because it refers to an unknown |
| 292 // package. | 301 // package. |
| 293 String pkgFile = '/packages/pkgA/libA.dart'; | 302 String pkgFile = '/packages/pkgA/libA.dart'; |
| 294 resourceProvider.newFile(pkgFile, ''' | 303 resourceProvider.newFile( |
| 304 pkgFile, |
| 305 ''' |
| 295 library lib_a; | 306 library lib_a; |
| 296 class A {} | 307 class A {} |
| 297 '''); | 308 '''); |
| 298 addTestFile(''' | 309 addTestFile(''' |
| 299 import 'package:pkgA/libA.dart'; | 310 import 'package:pkgA/libA.dart'; |
| 300 f(A a) { | 311 f(A a) { |
| 301 } | 312 } |
| 302 '''); | 313 '''); |
| 303 String pkgDependency = posix.join(projectPath, 'package_dep'); | 314 String pkgDependency = posix.join(projectPath, 'package_dep'); |
| 304 resourceProvider.newFile(pkgDependency, 'contents'); | 315 resourceProvider.newFile(pkgDependency, 'contents'); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 315 // Give the server time to notice the file has changed, then let | 326 // Give the server time to notice the file has changed, then let |
| 316 // analysis complete. There should now be no error. | 327 // analysis complete. There should now be no error. |
| 317 await pumpEventQueue(); | 328 await pumpEventQueue(); |
| 318 await waitForTasksFinished(); | 329 await waitForTasksFinished(); |
| 319 expect(filesErrors[testFile], isEmpty); | 330 expect(filesErrors[testFile], isEmpty); |
| 320 } | 331 } |
| 321 | 332 |
| 322 test_setRoots_packages() { | 333 test_setRoots_packages() { |
| 323 // prepare package | 334 // prepare package |
| 324 String pkgFile = '/packages/pkgA/libA.dart'; | 335 String pkgFile = '/packages/pkgA/libA.dart'; |
| 325 resourceProvider.newFile(pkgFile, ''' | 336 resourceProvider.newFile( |
| 337 pkgFile, |
| 338 ''' |
| 326 library lib_a; | 339 library lib_a; |
| 327 class A {} | 340 class A {} |
| 328 '''); | 341 '''); |
| 329 packageMapProvider.packageMap['pkgA'] = | 342 packageMapProvider.packageMap['pkgA'] = [ |
| 330 [resourceProvider.getResource('/packages/pkgA')]; | 343 resourceProvider.getResource('/packages/pkgA') |
| 344 ]; |
| 331 addTestFile(''' | 345 addTestFile(''' |
| 332 import 'package:pkgA/libA.dart'; | 346 import 'package:pkgA/libA.dart'; |
| 333 main(A a) { | 347 main(A a) { |
| 334 } | 348 } |
| 335 '''); | 349 '''); |
| 336 // create project and wait for analysis | 350 // create project and wait for analysis |
| 337 createProject(); | 351 createProject(); |
| 338 return waitForTasksFinished().then((_) { | 352 return waitForTasksFinished().then((_) { |
| 339 // if 'package:pkgA/libA.dart' was resolved, then there are no errors | 353 // if 'package:pkgA/libA.dart' was resolved, then there are no errors |
| 340 expect(filesErrors[testFile], isEmpty); | 354 expect(filesErrors[testFile], isEmpty); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 361 | 375 |
| 362 String testFile = '/project/bin/test.dart'; | 376 String testFile = '/project/bin/test.dart'; |
| 363 String testCode; | 377 String testCode; |
| 364 | 378 |
| 365 AnalysisTestHelper() { | 379 AnalysisTestHelper() { |
| 366 serverChannel = new MockServerChannel(); | 380 serverChannel = new MockServerChannel(); |
| 367 resourceProvider = new MemoryResourceProvider(); | 381 resourceProvider = new MemoryResourceProvider(); |
| 368 ExtensionManager manager = new ExtensionManager(); | 382 ExtensionManager manager = new ExtensionManager(); |
| 369 ServerPlugin serverPlugin = new ServerPlugin(); | 383 ServerPlugin serverPlugin = new ServerPlugin(); |
| 370 manager.processPlugins([serverPlugin]); | 384 manager.processPlugins([serverPlugin]); |
| 371 server = new AnalysisServer(serverChannel, resourceProvider, | 385 server = new AnalysisServer( |
| 372 new MockPackageMapProvider(), null, serverPlugin, | 386 serverChannel, |
| 373 new AnalysisServerOptions(), new MockSdk(), | 387 resourceProvider, |
| 388 new MockPackageMapProvider(), |
| 389 null, |
| 390 serverPlugin, |
| 391 new AnalysisServerOptions(), |
| 392 new MockSdk(), |
| 374 InstrumentationService.NULL_SERVICE); | 393 InstrumentationService.NULL_SERVICE); |
| 375 handler = new AnalysisDomainHandler(server); | 394 handler = new AnalysisDomainHandler(server); |
| 376 // listen for notifications | 395 // listen for notifications |
| 377 Stream<Notification> notificationStream = | 396 Stream<Notification> notificationStream = |
| 378 serverChannel.notificationController.stream; | 397 serverChannel.notificationController.stream; |
| 379 notificationStream.listen((Notification notification) { | 398 notificationStream.listen((Notification notification) { |
| 380 if (notification.event == ANALYSIS_ERRORS) { | 399 if (notification.event == ANALYSIS_ERRORS) { |
| 381 var decoded = new AnalysisErrorsParams.fromNotification(notification); | 400 var decoded = new AnalysisErrorsParams.fromNotification(notification); |
| 382 filesErrors[decoded.file] = decoded.errors; | 401 filesErrors[decoded.file] = decoded.errors; |
| 383 } | 402 } |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 586 expect(filesHighlights[testFile], isNull); | 605 expect(filesHighlights[testFile], isNull); |
| 587 // subscribe | 606 // subscribe |
| 588 addAnalysisSubscription(AnalysisService.HIGHLIGHTS, file); | 607 addAnalysisSubscription(AnalysisService.HIGHLIGHTS, file); |
| 589 await server.onAnalysisComplete; | 608 await server.onAnalysisComplete; |
| 590 // there are results | 609 // there are results |
| 591 expect(filesHighlights[file], isNull); | 610 expect(filesHighlights[file], isNull); |
| 592 } | 611 } |
| 593 | 612 |
| 594 test_afterAnalysis_packageFile_external() async { | 613 test_afterAnalysis_packageFile_external() async { |
| 595 String pkgFile = '/packages/pkgA/lib/libA.dart'; | 614 String pkgFile = '/packages/pkgA/lib/libA.dart'; |
| 596 resourceProvider.newFile(pkgFile, ''' | 615 resourceProvider.newFile( |
| 616 pkgFile, |
| 617 ''' |
| 597 library lib_a; | 618 library lib_a; |
| 598 class A {} | 619 class A {} |
| 599 '''); | 620 '''); |
| 600 packageMapProvider.packageMap = { | 621 packageMapProvider.packageMap = { |
| 601 'pkgA': [(resourceProvider.newFolder('/packages/pkgA/lib'))] | 622 'pkgA': [(resourceProvider.newFolder('/packages/pkgA/lib'))] |
| 602 }; | 623 }; |
| 603 // | 624 // |
| 604 addTestFile(''' | 625 addTestFile(''' |
| 605 import 'package:pkgA/libA.dart'; | 626 import 'package:pkgA/libA.dart'; |
| 606 main() { | 627 main() { |
| 607 new A(); | 628 new A(); |
| 608 } | 629 } |
| 609 '''); | 630 '''); |
| 610 createProject(); | 631 createProject(); |
| 611 // wait for analysis, no results initially | 632 // wait for analysis, no results initially |
| 612 await waitForTasksFinished(); | 633 await waitForTasksFinished(); |
| 613 expect(filesHighlights[pkgFile], isNull); | 634 expect(filesHighlights[pkgFile], isNull); |
| 614 // subscribe | 635 // subscribe |
| 615 addAnalysisSubscription(AnalysisService.HIGHLIGHTS, pkgFile); | 636 addAnalysisSubscription(AnalysisService.HIGHLIGHTS, pkgFile); |
| 616 await server.onAnalysisComplete; | 637 await server.onAnalysisComplete; |
| 617 // there are results | 638 // there are results |
| 618 expect(filesHighlights[pkgFile], isNotEmpty); | 639 expect(filesHighlights[pkgFile], isNotEmpty); |
| 619 } | 640 } |
| 620 | 641 |
| 621 test_afterAnalysis_packageFile_inRoot() async { | 642 test_afterAnalysis_packageFile_inRoot() async { |
| 622 String pkgA = '/pkgA'; | 643 String pkgA = '/pkgA'; |
| 623 String pkgB = '/pkgA'; | 644 String pkgB = '/pkgA'; |
| 624 String pkgFileA = '$pkgA/lib/libA.dart'; | 645 String pkgFileA = '$pkgA/lib/libA.dart'; |
| 625 String pkgFileB = '$pkgA/lib/libB.dart'; | 646 String pkgFileB = '$pkgA/lib/libB.dart'; |
| 626 resourceProvider.newFile(pkgFileA, ''' | 647 resourceProvider.newFile( |
| 648 pkgFileA, |
| 649 ''' |
| 627 library lib_a; | 650 library lib_a; |
| 628 class A {} | 651 class A {} |
| 629 '''); | 652 '''); |
| 630 resourceProvider.newFile(pkgFileB, ''' | 653 resourceProvider.newFile( |
| 654 pkgFileB, |
| 655 ''' |
| 631 import 'package:pkgA/libA.dart'; | 656 import 'package:pkgA/libA.dart'; |
| 632 main() { | 657 main() { |
| 633 new A(); | 658 new A(); |
| 634 } | 659 } |
| 635 '''); | 660 '''); |
| 636 packageMapProvider.packageMap = { | 661 packageMapProvider.packageMap = { |
| 637 'pkgA': [ | 662 'pkgA': [ |
| 638 resourceProvider.newFolder('$pkgA/lib'), | 663 resourceProvider.newFolder('$pkgA/lib'), |
| 639 resourceProvider.newFolder('$pkgB/lib') | 664 resourceProvider.newFolder('$pkgB/lib') |
| 640 ] | 665 ] |
| 641 }; | 666 }; |
| 642 // add 'pkgA' and 'pkgB' as projects | 667 // add 'pkgA' and 'pkgB' as projects |
| 643 { | 668 { |
| 644 resourceProvider.newFolder(projectPath); | 669 resourceProvider.newFolder(projectPath); |
| 645 handleSuccessfulRequest( | 670 handleSuccessfulRequest( |
| 646 new AnalysisSetAnalysisRootsParams([pkgA, pkgB], []).toRequest('0')); | 671 new AnalysisSetAnalysisRootsParams([pkgA, pkgB], []).toRequest('0')); |
| 647 } | 672 } |
| 648 // wait for analysis, no results initially | 673 // wait for analysis, no results initially |
| 649 await waitForTasksFinished(); | 674 await waitForTasksFinished(); |
| 650 expect(filesHighlights[pkgFileA], isNull); | 675 expect(filesHighlights[pkgFileA], isNull); |
| 651 // subscribe | 676 // subscribe |
| 652 addAnalysisSubscription(AnalysisService.HIGHLIGHTS, pkgFileA); | 677 addAnalysisSubscription(AnalysisService.HIGHLIGHTS, pkgFileA); |
| 653 await server.onAnalysisComplete; | 678 await server.onAnalysisComplete; |
| 654 // there are results | 679 // there are results |
| 655 expect(filesHighlights[pkgFileA], isNotEmpty); | 680 expect(filesHighlights[pkgFileA], isNotEmpty); |
| 656 } | 681 } |
| 657 | 682 |
| 658 test_afterAnalysis_packageFile_notUsed() async { | 683 test_afterAnalysis_packageFile_notUsed() async { |
| 659 String pkgFile = '/packages/pkgA/lib/libA.dart'; | 684 String pkgFile = '/packages/pkgA/lib/libA.dart'; |
| 660 resourceProvider.newFile(pkgFile, ''' | 685 resourceProvider.newFile( |
| 686 pkgFile, |
| 687 ''' |
| 661 library lib_a; | 688 library lib_a; |
| 662 class A {} | 689 class A {} |
| 663 '''); | 690 '''); |
| 664 packageMapProvider.packageMap = { | 691 packageMapProvider.packageMap = { |
| 665 'pkgA': [(resourceProvider.newFolder('/packages/pkgA/lib'))] | 692 'pkgA': [(resourceProvider.newFolder('/packages/pkgA/lib'))] |
| 666 }; | 693 }; |
| 667 // | 694 // |
| 668 addTestFile('// no "pkgA" reference'); | 695 addTestFile('// no "pkgA" reference'); |
| 669 createProject(); | 696 createProject(); |
| 670 // wait for analysis, no results initially | 697 // wait for analysis, no results initially |
| (...skipping 25 matching lines...) Expand all Loading... |
| 696 test_beforeAnalysis() async { | 723 test_beforeAnalysis() async { |
| 697 addTestFile('int V = 42;'); | 724 addTestFile('int V = 42;'); |
| 698 createProject(); | 725 createProject(); |
| 699 // subscribe | 726 // subscribe |
| 700 addAnalysisSubscription(AnalysisService.HIGHLIGHTS, testFile); | 727 addAnalysisSubscription(AnalysisService.HIGHLIGHTS, testFile); |
| 701 // wait for analysis | 728 // wait for analysis |
| 702 await waitForTasksFinished(); | 729 await waitForTasksFinished(); |
| 703 expect(filesHighlights[testFile], isNotEmpty); | 730 expect(filesHighlights[testFile], isNotEmpty); |
| 704 } | 731 } |
| 705 } | 732 } |
| OLD | NEW |