| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 library json_rpc_2.test.client.client_test; | |
| 6 | |
| 7 import 'dart:async'; | |
| 8 import 'dart:convert'; | |
| 9 | |
| 10 import 'package:unittest/unittest.dart'; | |
| 11 import 'package:json_rpc_2/error_code.dart' as error_code; | |
| 12 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; | |
| 13 | |
| 14 import 'utils.dart'; | |
| 15 | |
| 16 void main() { | |
| 17 var controller; | |
| 18 setUp(() => controller = new ClientController()); | |
| 19 | |
| 20 test("sends a message and returns the response", () { | |
| 21 controller.expectRequest((request) { | |
| 22 expect(request, allOf([ | |
| 23 containsPair('jsonrpc', '2.0'), | |
| 24 containsPair('method', 'foo'), | |
| 25 containsPair('params', {'param': 'value'}) | |
| 26 ])); | |
| 27 | |
| 28 return { | |
| 29 'jsonrpc': '2.0', | |
| 30 'result': 'bar', | |
| 31 'id': request['id'] | |
| 32 }; | |
| 33 }); | |
| 34 | |
| 35 expect(controller.client.sendRequest("foo", {'param': 'value'}), | |
| 36 completion(equals('bar'))); | |
| 37 }); | |
| 38 | |
| 39 test("sends a notification and expects no response", () { | |
| 40 controller.expectRequest((request) { | |
| 41 expect(request, equals({ | |
| 42 'jsonrpc': '2.0', | |
| 43 'method': 'foo', | |
| 44 'params': {'param': 'value'} | |
| 45 })); | |
| 46 }); | |
| 47 | |
| 48 controller.client.sendNotification("foo", {'param': 'value'}); | |
| 49 }); | |
| 50 | |
| 51 test("sends a notification with positional parameters", () { | |
| 52 controller.expectRequest((request) { | |
| 53 expect(request, equals({ | |
| 54 'jsonrpc': '2.0', | |
| 55 'method': 'foo', | |
| 56 'params': ['value1', 'value2'] | |
| 57 })); | |
| 58 }); | |
| 59 | |
| 60 controller.client.sendNotification("foo", ['value1', 'value2']); | |
| 61 }); | |
| 62 | |
| 63 test("sends a notification with no parameters", () { | |
| 64 controller.expectRequest((request) { | |
| 65 expect(request, equals({ | |
| 66 'jsonrpc': '2.0', | |
| 67 'method': 'foo' | |
| 68 })); | |
| 69 }); | |
| 70 | |
| 71 controller.client.sendNotification("foo"); | |
| 72 }); | |
| 73 | |
| 74 test("sends a synchronous batch of requests", () { | |
| 75 controller.expectRequest((request) { | |
| 76 expect(request, new isInstanceOf<List>()); | |
| 77 expect(request, hasLength(3)); | |
| 78 expect(request[0], equals({ | |
| 79 'jsonrpc': '2.0', | |
| 80 'method': 'foo' | |
| 81 })); | |
| 82 expect(request[1], allOf([ | |
| 83 containsPair('jsonrpc', '2.0'), | |
| 84 containsPair('method', 'bar'), | |
| 85 containsPair('params', {'param': 'value'}) | |
| 86 ])); | |
| 87 expect(request[2], allOf([ | |
| 88 containsPair('jsonrpc', '2.0'), | |
| 89 containsPair('method', 'baz') | |
| 90 ])); | |
| 91 | |
| 92 return [ | |
| 93 { | |
| 94 'jsonrpc': '2.0', | |
| 95 'result': 'baz response', | |
| 96 'id': request[2]['id'] | |
| 97 }, | |
| 98 { | |
| 99 'jsonrpc': '2.0', | |
| 100 'result': 'bar response', | |
| 101 'id': request[1]['id'] | |
| 102 } | |
| 103 ]; | |
| 104 }); | |
| 105 | |
| 106 controller.client.withBatch(() { | |
| 107 controller.client.sendNotification("foo"); | |
| 108 expect(controller.client.sendRequest("bar", {'param': 'value'}), | |
| 109 completion(equals("bar response"))); | |
| 110 expect(controller.client.sendRequest("baz"), | |
| 111 completion(equals("baz response"))); | |
| 112 }); | |
| 113 }); | |
| 114 | |
| 115 test("sends an asynchronous batch of requests", () { | |
| 116 controller.expectRequest((request) { | |
| 117 expect(request, new isInstanceOf<List>()); | |
| 118 expect(request, hasLength(3)); | |
| 119 expect(request[0], equals({ | |
| 120 'jsonrpc': '2.0', | |
| 121 'method': 'foo' | |
| 122 })); | |
| 123 expect(request[1], allOf([ | |
| 124 containsPair('jsonrpc', '2.0'), | |
| 125 containsPair('method', 'bar'), | |
| 126 containsPair('params', {'param': 'value'}) | |
| 127 ])); | |
| 128 expect(request[2], allOf([ | |
| 129 containsPair('jsonrpc', '2.0'), | |
| 130 containsPair('method', 'baz') | |
| 131 ])); | |
| 132 | |
| 133 return [ | |
| 134 { | |
| 135 'jsonrpc': '2.0', | |
| 136 'result': 'baz response', | |
| 137 'id': request[2]['id'] | |
| 138 }, | |
| 139 { | |
| 140 'jsonrpc': '2.0', | |
| 141 'result': 'bar response', | |
| 142 'id': request[1]['id'] | |
| 143 } | |
| 144 ]; | |
| 145 }); | |
| 146 | |
| 147 controller.client.withBatch(() { | |
| 148 return new Future.value().then((_) { | |
| 149 controller.client.sendNotification("foo"); | |
| 150 return new Future.value(); | |
| 151 }).then((_) { | |
| 152 expect(controller.client.sendRequest("bar", {'param': 'value'}), | |
| 153 completion(equals("bar response"))); | |
| 154 return new Future.value(); | |
| 155 }).then((_) { | |
| 156 expect(controller.client.sendRequest("baz"), | |
| 157 completion(equals("baz response"))); | |
| 158 }); | |
| 159 }); | |
| 160 }); | |
| 161 | |
| 162 test("reports an error from the server", () { | |
| 163 controller.expectRequest((request) { | |
| 164 expect(request, allOf([ | |
| 165 containsPair('jsonrpc', '2.0'), | |
| 166 containsPair('method', 'foo') | |
| 167 ])); | |
| 168 | |
| 169 return { | |
| 170 'jsonrpc': '2.0', | |
| 171 'error': { | |
| 172 'code': error_code.SERVER_ERROR, | |
| 173 'message': 'you are bad at requests', | |
| 174 'data': 'some junk' | |
| 175 }, | |
| 176 'id': request['id'] | |
| 177 }; | |
| 178 }); | |
| 179 | |
| 180 expect(controller.client.sendRequest("foo", {'param': 'value'}), | |
| 181 throwsA(predicate((exception) { | |
| 182 expect(exception, new isInstanceOf<json_rpc.RpcException>()); | |
| 183 expect(exception.code, equals(error_code.SERVER_ERROR)); | |
| 184 expect(exception.message, equals('you are bad at requests')); | |
| 185 expect(exception.data, equals('some junk')); | |
| 186 return true; | |
| 187 }))); | |
| 188 }); | |
| 189 | |
| 190 test("ignores bogus responses", () { | |
| 191 // Make a request so we have something to respond to. | |
| 192 controller.expectRequest((request) { | |
| 193 controller.sendJsonResponse("{invalid"); | |
| 194 controller.sendResponse("not a map"); | |
| 195 controller.sendResponse({ | |
| 196 'jsonrpc': 'wrong version', | |
| 197 'result': 'wrong', | |
| 198 'id': request['id'] | |
| 199 }); | |
| 200 controller.sendResponse({ | |
| 201 'jsonrpc': '2.0', | |
| 202 'result': 'wrong' | |
| 203 }); | |
| 204 controller.sendResponse({ | |
| 205 'jsonrpc': '2.0', | |
| 206 'id': request['id'] | |
| 207 }); | |
| 208 controller.sendResponse({ | |
| 209 'jsonrpc': '2.0', | |
| 210 'error': 'not a map', | |
| 211 'id': request['id'] | |
| 212 }); | |
| 213 controller.sendResponse({ | |
| 214 'jsonrpc': '2.0', | |
| 215 'error': { | |
| 216 'code': 'not an int', | |
| 217 'message': 'dang yo' | |
| 218 }, | |
| 219 'id': request['id'] | |
| 220 }); | |
| 221 controller.sendResponse({ | |
| 222 'jsonrpc': '2.0', | |
| 223 'error': { | |
| 224 'code': 123, | |
| 225 'message': 0xDEADBEEF | |
| 226 }, | |
| 227 'id': request['id'] | |
| 228 }); | |
| 229 | |
| 230 return pumpEventQueue().then((_) => { | |
| 231 'jsonrpc': '2.0', | |
| 232 'result': 'right', | |
| 233 'id': request['id'] | |
| 234 }); | |
| 235 }); | |
| 236 | |
| 237 expect(controller.client.sendRequest("foo"), completion(equals('right'))); | |
| 238 }); | |
| 239 } | |
| OLD | NEW |