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 |