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

Side by Side Diff: pkg/analysis_server/test/analysis_server_test.dart

Issue 252373003: Rework some analysis server tests using mocks. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Mock Sources too. Created 6 years, 8 months 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/analysis_server/test/mocks.dart » ('j') | pkg/analysis_server/test/mocks.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/test/mocks.dart » ('j') | pkg/analysis_server/test/mocks.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698