| 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'; | 9 import 'package:analyzer/src/generated/engine.dart'; |
| 10 import 'package:analyzer/src/generated/source_io.dart'; | 10 import 'package:analyzer/src/generated/source_io.dart'; |
| 11 import 'package:analyzer/src/generated/java_io.dart'; | 11 import 'package:analyzer/src/generated/java_io.dart'; |
| 12 import 'package:analyzer/src/generated/error.dart'; | 12 import 'package:analyzer/src/generated/error.dart'; |
| 13 import 'package:analysis_server/src/analysis_server.dart'; | 13 import 'package:analysis_server/src/analysis_server.dart'; |
| 14 import 'package:analysis_server/src/domain_server.dart'; | 14 import 'package:analysis_server/src/domain_server.dart'; |
| 15 import 'package:analysis_server/src/protocol.dart'; | 15 import 'package:analysis_server/src/protocol.dart'; |
| 16 import 'package:mock/mock.dart'; |
| 16 import 'package:unittest/unittest.dart'; | 17 import 'package:unittest/unittest.dart'; |
| 17 | 18 |
| 18 import 'mocks.dart'; | 19 import 'mocks.dart'; |
| 19 | 20 |
| 20 main() { | 21 main() { |
| 21 group('AnalysisServer', () { | 22 group('AnalysisServer', () { |
| 22 setUp(AnalysisServerTest.setUp); | 23 setUp(AnalysisServerTest.setUp); |
| 23 test('addContextToWorkQueue_twice', | 24 test('addContextToWorkQueue_twice', |
| 24 AnalysisServerTest.addContextToWorkQueue_twice); | 25 AnalysisServerTest.addContextToWorkQueue_twice); |
| 25 test('addContextToWorkQueue_whenNotRunning', | 26 test('addContextToWorkQueue_whenNotRunning', |
| 26 AnalysisServerTest.addContextToWorkQueue_whenNotRunning); | 27 AnalysisServerTest.addContextToWorkQueue_whenNotRunning); |
| 27 test('addContextToWorkQueue_whenRunning', | 28 test('addContextToWorkQueue_whenRunning', |
| 28 AnalysisServerTest.addContextToWorkQueue_whenRunning); | 29 AnalysisServerTest.addContextToWorkQueue_whenRunning); |
| 29 test('createContext', AnalysisServerTest.createContext); | 30 test('createContext', AnalysisServerTest.createContext); |
| 30 test('echo', AnalysisServerTest.echo); | 31 test('echo', AnalysisServerTest.echo); |
| 31 test('errorToJson_formattingApplied', | 32 test('errorToJson_formattingApplied', |
| 32 AnalysisServerTest.errorToJson_formattingApplied); | 33 AnalysisServerTest.errorToJson_formattingApplied); |
| 33 test('errorToJson_noCorrection', | 34 test('errorToJson_noCorrection', |
| 34 AnalysisServerTest.errorToJson_noCorrection); | 35 AnalysisServerTest.errorToJson_noCorrection); |
| 35 test('errorToJson_withCorrection', | 36 test('errorToJson_withCorrection', |
| 36 AnalysisServerTest.errorToJson_withCorrection); | 37 AnalysisServerTest.errorToJson_withCorrection); |
| 37 test('performTask_whenNotRunning', | 38 test('performTask_whenNotRunning', |
| 38 AnalysisServerTest.performTask_whenNotRunning); | 39 AnalysisServerTest.performTask_whenNotRunning); |
| 39 test('shutdown', AnalysisServerTest.shutdown); | 40 test('shutdown', AnalysisServerTest.shutdown); |
| 40 test('unknownRequest', AnalysisServerTest.unknownRequest); | 41 test('unknownRequest', AnalysisServerTest.unknownRequest); |
| 41 }); | 42 }); |
| 42 } | 43 } |
| 43 | 44 |
| 44 class MockAnalysisContext_withPerformAnalysisTask extends MockAnalysisContext { | |
| 45 List<AnalysisResult> results = []; | |
| 46 | |
| 47 @override | |
| 48 AnalysisResult performAnalysisTask() => results.removeAt(0); | |
| 49 | |
| 50 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
| 51 } | |
| 52 | |
| 53 class AnalysisServerTest { | 45 class AnalysisServerTest { |
| 54 static MockServerChannel channel; | 46 static MockServerChannel channel; |
| 55 static AnalysisServer server; | 47 static AnalysisServer server; |
| 56 static MockAnalysisLogger logger; | 48 static MockAnalysisLogger logger; |
| 57 | 49 |
| 58 static void setUp() { | 50 static void setUp() { |
| 59 channel = new MockServerChannel(); | 51 channel = new MockServerChannel(); |
| 60 server = new AnalysisServer(channel); | 52 server = new AnalysisServer(channel); |
| 61 logger = new MockAnalysisLogger(); | 53 logger = new MockAnalysisLogger(); |
| 62 AnalysisEngine.instance.logger = logger; | 54 AnalysisEngine.instance.logger = logger; |
| 63 } | 55 } |
| 64 | 56 |
| 65 static Future addContextToWorkQueue_whenNotRunning() { | 57 static Future addContextToWorkQueue_whenNotRunning() { |
| 66 server.running = false; | 58 server.running = false; |
| 67 MockAnalysisContext context = new MockAnalysisContext(); | 59 MockAnalysisContext context = new MockAnalysisContext(); |
| 68 server.addContextToWorkQueue(context); | 60 server.addContextToWorkQueue(context); |
| 69 // Pump the event queue to make sure the server doesn't try to do any | 61 // Pump the event queue to make sure the server doesn't try to do any |
| 70 // analysis. | 62 // analysis. |
| 71 return pumpEventQueue(); | 63 return pumpEventQueue(); |
| 72 } | 64 } |
| 73 | 65 |
| 74 static Future addContextToWorkQueue_whenRunning() { | 66 static Future addContextToWorkQueue_whenRunning() { |
| 75 MockAnalysisContext_withPerformAnalysisTask context = | 67 MockAnalysisContext context = new MockAnalysisContext(); |
| 76 new MockAnalysisContext_withPerformAnalysisTask(); | |
| 77 server.addContextToWorkQueue(context); | 68 server.addContextToWorkQueue(context); |
| 78 Source source = new FileBasedSource.con1(new JavaFile('/foo.dart')); | 69 MockSource source = new MockSource(); |
| 70 source.when(callsTo('get encoding')).alwaysReturn('foo.dart'); |
| 79 ChangeNoticeImpl changeNoticeImpl = new ChangeNoticeImpl(source); | 71 ChangeNoticeImpl changeNoticeImpl = new ChangeNoticeImpl(source); |
| 80 LineInfo lineInfo = new LineInfo([0]); | 72 LineInfo lineInfo = new LineInfo([0]); |
| 81 AnalysisError analysisError = new AnalysisError.con1(source, | 73 AnalysisError analysisError = new AnalysisError.con1(source, |
| 82 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, []); | 74 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, []); |
| 83 changeNoticeImpl.setErrors([analysisError], lineInfo); | 75 changeNoticeImpl.setErrors([analysisError], lineInfo); |
| 84 context.results.add(new AnalysisResult([changeNoticeImpl], 0, 'myClass', 0) | 76 context.when(callsTo('performAnalysisTask')).thenReturn( |
| 85 ); | 77 new AnalysisResult([changeNoticeImpl], 0, 'myClass', 0)); |
| 86 context.results.add(new AnalysisResult(null, 0, null, 0)); | 78 context.when(callsTo('performAnalysisTask')).thenReturn( |
| 79 new AnalysisResult(null, 0, null, 0)); |
| 87 return pumpEventQueue().then((_) { | 80 return pumpEventQueue().then((_) { |
| 88 expect(context.results, isEmpty); | 81 context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(2))
; |
| 89 expect(channel.notificationsReceived, hasLength(2)); | 82 expect(channel.notificationsReceived, hasLength(2)); |
| 90 expect(channel.notificationsReceived[0].event, equals('server.connected') | 83 expect(channel.notificationsReceived[0].event, equals('server.connected') |
| 91 ); | 84 ); |
| 92 expect(channel.notificationsReceived[1].event, equals('context.errors')); | 85 expect(channel.notificationsReceived[1].event, equals('context.errors')); |
| 93 expect(channel.notificationsReceived[1].params['source'], equals( | 86 expect(channel.notificationsReceived[1].params['source'], equals( |
| 94 source.encoding)); | 87 'foo.dart')); |
| 95 List<AnalysisError> errors = | 88 List<AnalysisError> errors = |
| 96 channel.notificationsReceived[1].params['errors']; | 89 channel.notificationsReceived[1].params['errors']; |
| 97 expect(errors, hasLength(1)); | 90 expect(errors, hasLength(1)); |
| 98 expect(errors[0], equals(AnalysisServer.errorToJson(analysisError))); | 91 expect(errors[0], equals(AnalysisServer.errorToJson(analysisError))); |
| 99 }); | 92 }); |
| 100 } | 93 } |
| 101 | 94 |
| 102 static Future addContextToWorkQueue_twice() { | 95 static Future addContextToWorkQueue_twice() { |
| 103 // The context should only be asked to perform its analysis task once. | 96 // The context should only be asked to perform its analysis task once. |
| 104 MockAnalysisContext_withPerformAnalysisTask context = | 97 MockAnalysisContext context = new MockAnalysisContext(); |
| 105 new MockAnalysisContext_withPerformAnalysisTask(); | |
| 106 server.addContextToWorkQueue(context); | 98 server.addContextToWorkQueue(context); |
| 107 server.addContextToWorkQueue(context); | 99 server.addContextToWorkQueue(context); |
| 108 context.results.add(new AnalysisResult(null, 0, null, 0)); | 100 context.when(callsTo('performAnalysisTask')).thenReturn( |
| 109 return pumpEventQueue().then((_) => expect(context.results, isEmpty)); | 101 new AnalysisResult(null, 0, null, 0)); |
| 102 return pumpEventQueue().then((_) => |
| 103 context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(1
))); |
| 110 } | 104 } |
| 111 | 105 |
| 112 static Future createContext() { | 106 static Future createContext() { |
| 113 server.handlers = [new ServerDomainHandler(server)]; | 107 server.handlers = [new ServerDomainHandler(server)]; |
| 114 var request = new Request('my27', ServerDomainHandler.CREATE_CONTEXT_METHOD)
; | 108 var request = new Request('my27', ServerDomainHandler.CREATE_CONTEXT_METHOD)
; |
| 115 request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath); | 109 request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath); |
| 116 request.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, 'ctx'); | 110 request.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, 'ctx'); |
| 117 return channel.sendRequest(request) | 111 return channel.sendRequest(request) |
| 118 .then((Response response) { | 112 .then((Response response) { |
| 119 expect(response.id, equals('my27')); | 113 expect(response.id, equals('my27')); |
| 120 expect(response.error, isNull); | 114 expect(response.error, isNull); |
| 121 }); | 115 }); |
| 122 } | 116 } |
| 123 | 117 |
| 124 static Future echo() { | 118 static Future echo() { |
| 125 server.handlers = [new EchoHandler()]; | 119 server.handlers = [new EchoHandler()]; |
| 126 var request = new Request('my22', 'echo'); | 120 var request = new Request('my22', 'echo'); |
| 127 return channel.sendRequest(request) | 121 return channel.sendRequest(request) |
| 128 .then((Response response) { | 122 .then((Response response) { |
| 129 expect(response.id, equals('my22')); | 123 expect(response.id, equals('my22')); |
| 130 expect(response.error, isNull); | 124 expect(response.error, isNull); |
| 131 }); | 125 }); |
| 132 } | 126 } |
| 133 | 127 |
| 134 static void errorToJson_formattingApplied() { | 128 static void errorToJson_formattingApplied() { |
| 135 Source source = new FileBasedSource.con1(new JavaFile('/foo.dart')); | 129 MockSource source = new MockSource(); |
| 130 source.when(callsTo('get encoding')).alwaysReturn('foo.dart'); |
| 136 CompileTimeErrorCode errorCode = CompileTimeErrorCode.AMBIGUOUS_EXPORT; | 131 CompileTimeErrorCode errorCode = CompileTimeErrorCode.AMBIGUOUS_EXPORT; |
| 137 AnalysisError analysisError = | 132 AnalysisError analysisError = |
| 138 new AnalysisError.con1(source, errorCode, ['foo', 'bar', 'baz']); | 133 new AnalysisError.con1(source, errorCode, ['foo', 'bar', 'baz']); |
| 139 Map<String, Object> json = AnalysisServer.errorToJson(analysisError); | 134 Map<String, Object> json = AnalysisServer.errorToJson(analysisError); |
| 140 | 135 |
| 141 expect(json['message'], | 136 expect(json['message'], |
| 142 equals("The element 'foo' is defined in the libraries 'bar' and 'baz'"))
; | 137 equals("The element 'foo' is defined in the libraries 'bar' and 'baz'"))
; |
| 143 } | 138 } |
| 144 | 139 |
| 145 static void errorToJson_noCorrection() { | 140 static void errorToJson_noCorrection() { |
| 146 Source source = new FileBasedSource.con1(new JavaFile('/foo.dart')); | 141 MockSource source = new MockSource(); |
| 142 source.when(callsTo('get encoding')).alwaysReturn('foo.dart'); |
| 147 CompileTimeErrorCode errorCode = | 143 CompileTimeErrorCode errorCode = |
| 148 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER; | 144 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER; |
| 149 AnalysisError analysisError = | 145 AnalysisError analysisError = |
| 150 new AnalysisError.con2(source, 10, 5, errorCode, []); | 146 new AnalysisError.con2(source, 10, 5, errorCode, []); |
| 151 Map<String, Object> json = AnalysisServer.errorToJson(analysisError); | 147 Map<String, Object> json = AnalysisServer.errorToJson(analysisError); |
| 152 expect(json, hasLength(5)); | 148 expect(json, hasLength(5)); |
| 153 expect(json['source'], equals(source.encoding)); | 149 expect(json['source'], equals('foo.dart')); |
| 154 expect(json['errorCode'], equals(errorCode.ordinal)); | 150 expect(json['errorCode'], equals(errorCode.ordinal)); |
| 155 expect(json['offset'], equals(analysisError.offset)); | 151 expect(json['offset'], equals(analysisError.offset)); |
| 156 expect(json['length'], equals(analysisError.length)); | 152 expect(json['length'], equals(analysisError.length)); |
| 157 expect(json['message'], equals(errorCode.message)); | 153 expect(json['message'], equals(errorCode.message)); |
| 158 } | 154 } |
| 159 | 155 |
| 160 static void errorToJson_withCorrection() { | 156 static void errorToJson_withCorrection() { |
| 161 Source source = new FileBasedSource.con1(new JavaFile('/foo.dart')); | 157 MockSource source = new MockSource(); |
| 158 source.when(callsTo('get encoding')).alwaysReturn('foo.dart'); |
| 162 | 159 |
| 163 // TODO(paulberry): in principle we should test an error or hint that uses | 160 // TODO(paulberry): in principle we should test an error or hint that uses |
| 164 // %s formatting in its correction string. But no such errors or hints | 161 // %s formatting in its correction string. But no such errors or hints |
| 165 // currently exist! | 162 // currently exist! |
| 166 HintCode errorCode = HintCode.MISSING_RETURN; | 163 HintCode errorCode = HintCode.MISSING_RETURN; |
| 167 | 164 |
| 168 AnalysisError analysisError = | 165 AnalysisError analysisError = |
| 169 new AnalysisError.con2(source, 10, 5, errorCode, ['int']); | 166 new AnalysisError.con2(source, 10, 5, errorCode, ['int']); |
| 170 Map<String, Object> json = AnalysisServer.errorToJson(analysisError); | 167 Map<String, Object> json = AnalysisServer.errorToJson(analysisError); |
| 171 expect(json['correction'], equals(errorCode.correction)); | 168 expect(json['correction'], equals(errorCode.correction)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 @override | 207 @override |
| 211 Response handleRequest(Request request) { | 208 Response handleRequest(Request request) { |
| 212 if (request.method == 'echo') { | 209 if (request.method == 'echo') { |
| 213 var response = new Response(request.id); | 210 var response = new Response(request.id); |
| 214 response.setResult('echo', true); | 211 response.setResult('echo', true); |
| 215 return response; | 212 return response; |
| 216 } | 213 } |
| 217 return null; | 214 return null; |
| 218 } | 215 } |
| 219 } | 216 } |
| OLD | NEW |