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

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

Issue 245113006: Consistently type check analysis server request parameters. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: 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
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.protocol; 5 library test.protocol;
6 6
7 import 'dart:convert'; 7 import 'dart:convert';
8 8
9 import 'package:analysis_server/src/protocol.dart'; 9 import 'package:analysis_server/src/protocol.dart';
10 import 'package:unittest/unittest.dart'; 10 import 'package:unittest/unittest.dart';
11 11
12 import 'declarative_tests.dart'; 12 import 'declarative_tests.dart';
13 13
14 main() { 14 main() {
15 addTestSuite(NotificationTest); 15 addTestSuite(NotificationTest);
16 addTestSuite(RequestTest); 16 addTestSuite(RequestTest);
17 addTestSuite(RequestErrorTest); 17 addTestSuite(RequestErrorTest);
18 addTestSuite(RequestDatumTest);
18 addTestSuite(ResponseTest); 19 addTestSuite(ResponseTest);
19 } 20 }
20 21
21 class NotificationTest { 22 class NotificationTest {
22 @runTest 23 @runTest
23 static void getParameter_defined() { 24 static void getParameter_defined() {
24 Notification notification = new Notification('foo'); 25 Notification notification = new Notification('foo');
25 notification.setParameter('x', 'y'); 26 notification.setParameter('x', 'y');
26 expect(notification.event, equals('foo')); 27 expect(notification.event, equals('foo'));
27 expect(notification.params.length, equals(1)); 28 expect(notification.params.length, equals(1));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 } 64 }
64 } 65 }
65 66
66 class RequestTest { 67 class RequestTest {
67 @runTest 68 @runTest
68 static void getParameter_defined() { 69 static void getParameter_defined() {
69 String name = 'name'; 70 String name = 'name';
70 String value = 'value'; 71 String value = 'value';
71 Request request = new Request('0', ''); 72 Request request = new Request('0', '');
72 request.setParameter(name, value); 73 request.setParameter(name, value);
73 expect(request.getParameter(name), equals(value)); 74 expect(request.getParameter(name, null).datum, equals(value));
74 } 75 }
75 76
76 @runTest 77 @runTest
77 static void getParameter_undefined() { 78 static void getParameter_undefined() {
78 String name = 'name'; 79 String name = 'name';
80 String defaultValue = 'default value';
79 Request request = new Request('0', ''); 81 Request request = new Request('0', '');
80 expect(request.getParameter(name), isNull); 82 expect(request.getParameter(name, defaultValue).datum, equals(defaultValue)) ;
81 } 83 }
82 84
83 @runTest 85 @runTest
84 static void getRequiredParameter_defined() { 86 static void getRequiredParameter_defined() {
85 String name = 'name'; 87 String name = 'name';
86 String value = 'value'; 88 String value = 'value';
87 Request request = new Request('0', ''); 89 Request request = new Request('0', '');
88 request.setParameter(name, value); 90 request.setParameter(name, value);
89 expect(request.getRequiredParameter(name), equals(value)); 91 expect(request.getRequiredParameter(name).datum, equals(value));
90 } 92 }
91 93
92 @runTest 94 @runTest
93 static void getRequiredParameter_undefined() { 95 static void getRequiredParameter_undefined() {
94 String name = 'name'; 96 String name = 'name';
95 Request request = new Request('0', ''); 97 Request request = new Request('0', '');
96 expect(() => request.getRequiredParameter(name), _throwsRequestFailure); 98 expect(() => request.getRequiredParameter(name), _throwsRequestFailure);
97 } 99 }
98 100
99 @runTest 101 @runTest
(...skipping 27 matching lines...) Expand all
127 } 129 }
128 130
129 @runTest 131 @runTest
130 static void fromJson_withParams() { 132 static void fromJson_withParams() {
131 Request original = new Request('one', 'aMethod'); 133 Request original = new Request('one', 'aMethod');
132 original.setParameter('foo', 'bar'); 134 original.setParameter('foo', 'bar');
133 String json = JSON.encode(original.toJson()); 135 String json = JSON.encode(original.toJson());
134 Request request = new Request.fromString(json); 136 Request request = new Request.fromString(json);
135 expect(request.id, equals('one')); 137 expect(request.id, equals('one'));
136 expect(request.method, equals('aMethod')); 138 expect(request.method, equals('aMethod'));
137 expect(request.getParameter('foo'), equals('bar')); 139 expect(request.getParameter('foo', null).asString(), equals('bar'));
138 } 140 }
139 141
140 @runTest 142 @runTest
141 static void toBool() {
142 Request request = new Request('0', '');
143 expect(request.toBool(true), isTrue);
144 expect(request.toBool(false), isFalse);
145 expect(request.toBool('true'), isTrue);
146 expect(request.toBool('false'), isFalse);
147 expect(request.toBool('abc'), isFalse);
148 expect(() => request.toBool(42), _throwsRequestFailure);
149 }
150
151 @runTest
152 static void toInt() {
153 Request request = new Request('0', '');
154 expect(request.toInt(1), equals(1));
155 expect(request.toInt('2'), equals(2));
156 expect(() => request.toInt('xxx'), _throwsRequestFailure);
157 expect(() => request.toInt(request), _throwsRequestFailure);
158 }
159
160 @runTest
161 static void toJson() { 143 static void toJson() {
162 Request request = new Request('one', 'aMethod'); 144 Request request = new Request('one', 'aMethod');
163 expect(request.toJson(), equals({ 145 expect(request.toJson(), equals({
164 Request.ID : 'one', 146 Request.ID : 'one',
165 Request.METHOD : 'aMethod' 147 Request.METHOD : 'aMethod'
166 })); 148 }));
167 } 149 }
168 150
169 @runTest 151 @runTest
170 static void toJson_withParams() { 152 static void toJson_withParams() {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 error.setData('answer', 42); 234 error.setData('answer', 42);
253 error.setData('question', 'unknown'); 235 error.setData('question', 'unknown');
254 expect(error.toJson(), { 236 expect(error.toJson(), {
255 RequestError.CODE: 0, 237 RequestError.CODE: 0,
256 RequestError.MESSAGE: 'msg', 238 RequestError.MESSAGE: 'msg',
257 RequestError.DATA: {'answer': 42, 'question': 'unknown'} 239 RequestError.DATA: {'answer': 42, 'question': 'unknown'}
258 }); 240 });
259 } 241 }
260 } 242 }
261 243
244 class InvalidParameterResponseMatcher extends Matcher {
245 static const int ERROR_CODE = -2;
246
247 @override
248 Description describe(Description description) =>
249 description.add("an 'invalid parameter' response (code $ERROR_CODE)");
250
251 @override
252 bool matches(item, Map matchState) {
253 if (item is! Response) {
254 return false;
255 }
256 Response response = item;
257 if (response.error is! RequestError) {
258 return false;
259 }
260 RequestError requestError = response.error;
261 if (requestError.code != ERROR_CODE) {
262 return false;
263 }
264 return true;
265 }
266 }
267
268 class RequestDatumTest {
269 static Request request;
270
271 static Matcher _throwsInvalidParameter = throwsA(
272 new InvalidParameterResponseMatcher());
273 static Matcher isRequestDatum = new isInstanceOf<RequestDatum>("RequestDatum"
274 );
275
276 static void setUp() {
277 request = new Request('myId', 'myMethod');
278 }
279
280 static RequestDatum makeDatum(dynamic datum) {
281 return new RequestDatum(request, 'myPath', datum);
282 }
283
284 static void indexOperator_nonMap() {
285 expect(() => makeDatum(1)['foo'], _throwsInvalidParameter);
286 }
287
288 static void indexOperator_missingKey() {
289 expect(() => makeDatum({
290 'foo': 'bar'
291 })['baz'], _throwsInvalidParameter);
292 }
293
294 static void indexOperator_hasKey() {
295 var indexResult = makeDatum({
296 'foo': 'bar'
297 })['foo'];
298 expect(indexResult, isRequestDatum);
299 expect(indexResult.datum, equals('bar'));
300 expect(indexResult.path, equals('myPath.bar'));
301 }
302
303 static void forEachMap_nonMap() {
304 expect(() => makeDatum(1).forEachMap((key, value) {
305 fail('Non-map should not be iterated');
306 }), _throwsInvalidParameter);
307 }
308
309 static void forEachMap_emptyMap() {
310 makeDatum({}).forEachMap((key, value) {
311 fail('Empty map should not be iterated');
312 });
313 }
314
315 static void forEachMap_oneElementMap() {
316 int callCount = 0;
317 makeDatum({
318 'key': 'value'
319 }).forEachMap((key, value) {
320 callCount++;
321 expect(key, equals('key'));
322 expect(value, isRequestDatum);
323 expect(value.datum, equals('value'));
324 });
325 expect(callCount, equals(1));
326 }
327
328 static void forEachMap_twoElementMap() {
329 int callCount = 0;
330 Map<String, String> map = {
331 'key1': 'value1',
332 'key2': 'value2'
333 };
334 Map iterationResult = {};
335 makeDatum(map).forEachMap((key, value) {
336 callCount++;
337 iterationResult[key] = value;
338 });
339 expect(callCount, equals(2));
340 expect(iterationResult, equals(map));
341 }
342
343 static void asBool() {
344 expect(makeDatum(true).asBool(), isTrue);
345 expect(makeDatum(false).asBool(), isFalse);
346 expect(makeDatum('true').asBool(), isTrue);
347 expect(makeDatum('false').asBool(), isFalse);
348 expect(() => makeDatum('abc').asBool(), _throwsInvalidParameter);
349 }
350
351 static void asInt() {
352 expect(makeDatum(1).asInt(), equals(1));
353 expect(makeDatum('2').asInt(), equals(2));
354 expect(() => makeDatum('xxx').asInt(), _throwsInvalidParameter);
355 expect(() => makeDatum(true).asInt(), _throwsInvalidParameter);
356 }
357
358 static void asString() {
359 expect(makeDatum('foo').asString(), equals('foo'));
360 expect(() => makeDatum(3).asString(), _throwsInvalidParameter);
361 }
362
363 static void asStringList() {
364 expect(makeDatum(['foo', 'bar']).asStringList(), equals(['foo', 'bar']));
365 expect(makeDatum([]).asStringList(), equals([]));
366 expect(() => makeDatum(['foo', 1]).asStringList(), _throwsInvalidParameter);
367 expect(() => makeDatum({}).asStringList(), _throwsInvalidParameter);
368 }
369
370 static void asStringMap() {
371 expect(makeDatum({
372 'key1': 'value1',
373 'key2': 'value2'
374 }).asStringMap(), equals({
375 'key1': 'value1',
376 'key2': 'value2'
377 }));
378 expect(makeDatum({}).asStringMap(), equals({}));
379 expect(() => makeDatum({
380 'key1': 'value1',
381 'key2': 2
382 }).asStringMap(), _throwsInvalidParameter);
383 expect(() => makeDatum({
384 'key1': 1,
385 'key2': 2
386 }).asStringMap(), _throwsInvalidParameter);
387 expect(() => makeDatum({
388 1: 'value1',
389 2: 'value2'
390 }).asStringMap(), _throwsInvalidParameter);
391 expect(() => makeDatum([]).asStringMap(), _throwsInvalidParameter);
392 }
393 }
394
262 class ResponseTest { 395 class ResponseTest {
263 @runTest 396 @runTest
264 static void create_contextDoesNotExist() { 397 static void create_contextDoesNotExist() {
265 Response response = new Response.contextDoesNotExist(new Request('0', '')); 398 Response response = new Response.contextDoesNotExist(new Request('0', ''));
266 expect(response.id, equals('0')); 399 expect(response.id, equals('0'));
267 expect(response.error, isNotNull); 400 expect(response.error, isNotNull);
268 expect(response.toJson(), equals({ 401 expect(response.toJson(), equals({
269 Response.ID: '0', 402 Response.ID: '0',
270 Response.ERROR: {'code': -1, 'message': 'Context does not exist'} 403 Response.ERROR: {'code': -1, 'message': 'Context does not exist'}
271 })); 404 }));
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 original.setResult('foo', 'bar'); 488 original.setResult('foo', 'bar');
356 Response response = new Response.fromJson(original.toJson()); 489 Response response = new Response.fromJson(original.toJson());
357 expect(response.id, equals('myId')); 490 expect(response.id, equals('myId'));
358 Map<String, Object> result = response.result; 491 Map<String, Object> result = response.result;
359 expect(result.length, equals(1)); 492 expect(result.length, equals(1));
360 expect(result['foo'], equals('bar')); 493 expect(result['foo'], equals('bar'));
361 } 494 }
362 } 495 }
363 496
364 Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>()); 497 Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698