| 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.analysis_server; | 5 library test.analysis_server; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analyzer/src/generated/engine.dart'; |
| 10 import 'package:analyzer/src/generated/source_io.dart'; |
| 11 import 'package:analyzer/src/generated/java_io.dart'; |
| 12 import 'package:analyzer/src/generated/error.dart'; |
| 9 import 'package:analysis_server/src/analysis_server.dart'; | 13 import 'package:analysis_server/src/analysis_server.dart'; |
| 10 import 'package:analysis_server/src/domain_server.dart'; | 14 import 'package:analysis_server/src/domain_server.dart'; |
| 11 import 'package:analysis_server/src/protocol.dart'; | 15 import 'package:analysis_server/src/protocol.dart'; |
| 12 import 'package:unittest/unittest.dart'; | 16 import 'package:unittest/unittest.dart'; |
| 13 | 17 |
| 14 import 'mocks.dart'; | 18 import 'mocks.dart'; |
| 15 | 19 |
| 16 main() { | 20 main() { |
| 17 group('AnalysisServer', () { | 21 group('AnalysisServer', () { |
| 18 setUp(AnalysisServerTest.setUp); | 22 setUp(AnalysisServerTest.setUp); |
| 23 test('addContextToWorkQueue_twice', |
| 24 AnalysisServerTest.addContextToWorkQueue_twice); |
| 25 test('addContextToWorkQueue_whenNotRunning', |
| 26 AnalysisServerTest.addContextToWorkQueue_whenNotRunning); |
| 27 test('addContextToWorkQueue_whenRunning', |
| 28 AnalysisServerTest.addContextToWorkQueue_whenRunning); |
| 19 test('createContext', AnalysisServerTest.createContext); | 29 test('createContext', AnalysisServerTest.createContext); |
| 20 test('echo', AnalysisServerTest.echo); | 30 test('echo', AnalysisServerTest.echo); |
| 31 test('performTask_whenNotRunning', |
| 32 AnalysisServerTest.performTask_whenNotRunning); |
| 21 test('shutdown', AnalysisServerTest.shutdown); | 33 test('shutdown', AnalysisServerTest.shutdown); |
| 22 test('unknownRequest', AnalysisServerTest.unknownRequest); | 34 test('unknownRequest', AnalysisServerTest.unknownRequest); |
| 23 }); | 35 }); |
| 24 } | 36 } |
| 25 | 37 |
| 38 class MockAnalysisContext_withPerformAnalysisTask extends MockAnalysisContext { |
| 39 List<AnalysisResult> results = []; |
| 40 |
| 41 @override |
| 42 AnalysisResult performAnalysisTask() => results.removeAt(0); |
| 43 } |
| 44 |
| 26 class AnalysisServerTest { | 45 class AnalysisServerTest { |
| 27 static MockServerChannel channel; | 46 static MockServerChannel channel; |
| 28 static AnalysisServer server; | 47 static AnalysisServer server; |
| 48 static MockAnalysisLogger logger; |
| 29 | 49 |
| 30 static void setUp() { | 50 static void setUp() { |
| 31 channel = new MockServerChannel(); | 51 channel = new MockServerChannel(); |
| 32 server = new AnalysisServer(channel); | 52 server = new AnalysisServer(channel); |
| 53 logger = new MockAnalysisLogger(); |
| 54 AnalysisEngine.instance.logger = logger; |
| 55 } |
| 56 |
| 57 static Future addContextToWorkQueue_whenNotRunning() { |
| 58 server.running = false; |
| 59 MockAnalysisContext context = new MockAnalysisContext(); |
| 60 server.addContextToWorkQueue(context); |
| 61 // Pump the event queue to make sure the server doesn't try to do any |
| 62 // analysis. |
| 63 return pumpEventQueue(); |
| 64 } |
| 65 |
| 66 static Future addContextToWorkQueue_whenRunning() { |
| 67 MockAnalysisContext_withPerformAnalysisTask context = |
| 68 new MockAnalysisContext_withPerformAnalysisTask(); |
| 69 server.addContextToWorkQueue(context); |
| 70 Source source = new FileBasedSource.con1(new JavaFile('/foo.dart')); |
| 71 ChangeNoticeImpl changeNoticeImpl = new ChangeNoticeImpl(source); |
| 72 LineInfo lineInfo = new LineInfo([0]); |
| 73 AnalysisError analysisError = new AnalysisError.con1(source, |
| 74 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, []); |
| 75 changeNoticeImpl.setErrors([analysisError], lineInfo); |
| 76 context.results.add(new AnalysisResult([changeNoticeImpl], 0, 'myClass', 0) |
| 77 ); |
| 78 context.results.add(new AnalysisResult(null, 0, null, 0)); |
| 79 return pumpEventQueue().then((_) { |
| 80 expect(context.results, isEmpty); |
| 81 expect(channel.notificationsReceived, hasLength(2)); |
| 82 expect(channel.notificationsReceived[0].event, equals('server.connected') |
| 83 ); |
| 84 expect(channel.notificationsReceived[1].event, equals('context.errors')); |
| 85 expect(channel.notificationsReceived[1].params['source'], equals( |
| 86 '102file:///foo.dart')); // Issue 18739 |
| 87 List<AnalysisError> errors = |
| 88 channel.notificationsReceived[1].params['errors']; |
| 89 expect(errors, hasLength(1)); |
| 90 expect(errors[0], equals(analysisError)); |
| 91 }); |
| 92 } |
| 93 |
| 94 static Future addContextToWorkQueue_twice() { |
| 95 // The context should only be asked to perform its analysis task once. |
| 96 MockAnalysisContext_withPerformAnalysisTask context = |
| 97 new MockAnalysisContext_withPerformAnalysisTask(); |
| 98 server.addContextToWorkQueue(context); |
| 99 server.addContextToWorkQueue(context); |
| 100 context.results.add(new AnalysisResult(null, 0, null, 0)); |
| 101 return pumpEventQueue().then((_) => expect(context.results, isEmpty)); |
| 33 } | 102 } |
| 34 | 103 |
| 35 static Future createContext() { | 104 static Future createContext() { |
| 36 server.handlers = [new ServerDomainHandler(server)]; | 105 server.handlers = [new ServerDomainHandler(server)]; |
| 37 var request = new Request('my27', ServerDomainHandler.CREATE_CONTEXT_METHOD)
; | 106 var request = new Request('my27', ServerDomainHandler.CREATE_CONTEXT_METHOD)
; |
| 38 request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath); | 107 request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath); |
| 39 request.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, 'ctx'); | 108 request.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, 'ctx'); |
| 40 return channel.sendRequest(request) | 109 return channel.sendRequest(request) |
| 41 .then((Response response) { | 110 .then((Response response) { |
| 42 expect(response.id, equals('my27')); | 111 expect(response.id, equals('my27')); |
| 43 expect(response.error, isNull); | 112 expect(response.error, isNull); |
| 44 }); | 113 }); |
| 45 } | 114 } |
| 46 | 115 |
| 47 static Future echo() { | 116 static Future echo() { |
| 48 server.handlers = [new EchoHandler()]; | 117 server.handlers = [new EchoHandler()]; |
| 49 var request = new Request('my22', 'echo'); | 118 var request = new Request('my22', 'echo'); |
| 50 return channel.sendRequest(request) | 119 return channel.sendRequest(request) |
| 51 .then((Response response) { | 120 .then((Response response) { |
| 52 expect(response.id, equals('my22')); | 121 expect(response.id, equals('my22')); |
| 53 expect(response.error, isNull); | 122 expect(response.error, isNull); |
| 54 }); | 123 }); |
| 55 } | 124 } |
| 56 | 125 |
| 126 static Future performTask_whenNotRunning() { |
| 127 // If the server is shut down while there is analysis still pending, |
| 128 // performTask() should notice that the server is no longer running and |
| 129 // do no analysis. |
| 130 MockAnalysisContext context = new MockAnalysisContext(); |
| 131 server.addContextToWorkQueue(context); |
| 132 server.running = false; |
| 133 // Pump the event queue to make sure the server doesn't try to do any |
| 134 // analysis. |
| 135 return pumpEventQueue(); |
| 136 } |
| 137 |
| 57 static Future shutdown() { | 138 static Future shutdown() { |
| 58 server.handlers = [new ServerDomainHandler(server)]; | 139 server.handlers = [new ServerDomainHandler(server)]; |
| 59 var request = new Request('my28', ServerDomainHandler.SHUTDOWN_METHOD); | 140 var request = new Request('my28', ServerDomainHandler.SHUTDOWN_METHOD); |
| 60 request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, ''); | 141 request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, ''); |
| 61 return channel.sendRequest(request) | 142 return channel.sendRequest(request) |
| 62 .then((Response response) { | 143 .then((Response response) { |
| 63 expect(response.id, equals('my28')); | 144 expect(response.id, equals('my28')); |
| 64 expect(response.error, isNull); | 145 expect(response.error, isNull); |
| 65 }); | 146 }); |
| 66 } | 147 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 81 @override | 162 @override |
| 82 Response handleRequest(Request request) { | 163 Response handleRequest(Request request) { |
| 83 if (request.method == 'echo') { | 164 if (request.method == 'echo') { |
| 84 var response = new Response(request.id); | 165 var response = new Response(request.id); |
| 85 response.setResult('echo', true); | 166 response.setResult('echo', true); |
| 86 return response; | 167 return response; |
| 87 } | 168 } |
| 88 return null; | 169 return null; |
| 89 } | 170 } |
| 90 } | 171 } |
| OLD | NEW |