Index: pkg/json_rpc_2/test/peer_test.dart |
diff --git a/pkg/json_rpc_2/test/peer_test.dart b/pkg/json_rpc_2/test/peer_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a2d042db699a18a3755c82864c6892c5a31e9b9b |
--- /dev/null |
+++ b/pkg/json_rpc_2/test/peer_test.dart |
@@ -0,0 +1,202 @@ |
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library json_rpc_2.test.client.client_test; |
+ |
+import 'dart:async'; |
+import 'dart:convert'; |
+ |
+import 'package:unittest/unittest.dart'; |
+import 'package:json_rpc_2/error_code.dart' as error_code; |
+import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; |
+ |
+void main() { |
+ var incoming; |
+ var outgoing; |
+ var peer; |
+ setUp(() { |
+ var incomingController = new StreamController(); |
+ incoming = incomingController.sink; |
+ var outgoingController = new StreamController(); |
+ outgoing = outgoingController.stream; |
+ peer = new json_rpc.Peer.withoutJson(incomingController.stream, outgoingController); |
Bob Nystrom
2014/11/07 17:41:51
Long line. More below.
nweiz
2014/11/10 21:45:30
Done.
|
+ }); |
+ |
+ group("like a client,", () { |
+ test("can send a message and receive a response", () { |
+ expect(outgoing.first.then((request) { |
+ expect(request, equals({ |
+ "jsonrpc": "2.0", |
+ "method": "foo", |
+ "params": {"bar": "baz"}, |
+ "id": 0 |
+ })); |
+ incoming.add({ |
+ "jsonrpc": "2.0", |
+ "result": "qux", |
+ "id": 0 |
+ }); |
+ }), completes); |
+ |
+ peer.listen(); |
+ expect(peer.sendRequest("foo", {"bar": "baz"}), completion(equals("qux"))); |
+ }); |
+ |
+ test("can send a batch of messages and receive a batch of responses", () { |
+ expect(outgoing.first.then((request) { |
+ expect(request, equals([ |
+ { |
+ "jsonrpc": "2.0", |
+ "method": "foo", |
+ "params": {"bar": "baz"}, |
+ "id": 0 |
+ }, |
+ { |
+ "jsonrpc": "2.0", |
+ "method": "a", |
+ "params": {"b": "c"}, |
+ "id": 1 |
+ }, |
+ { |
+ "jsonrpc": "2.0", |
+ "method": "w", |
+ "params": {"x": "y"}, |
+ "id": 2 |
+ } |
+ ])); |
+ |
+ incoming.add([ |
+ { |
+ "jsonrpc": "2.0", |
+ "result": "qux", |
+ "id": 0 |
+ }, |
+ { |
+ "jsonrpc": "2.0", |
+ "result": "d", |
+ "id": 1 |
+ }, |
+ { |
+ "jsonrpc": "2.0", |
+ "result": "z", |
+ "id": 2 |
+ } |
+ ]); |
+ }), completes); |
+ |
+ peer.listen(); |
+ |
+ peer.withBatch(() { |
+ expect(peer.sendRequest("foo", {"bar": "baz"}), completion(equals("qux"))); |
+ expect(peer.sendRequest("a", {"b": "c"}), completion(equals("d"))); |
+ expect(peer.sendRequest("w", {"x": "y"}), completion(equals("z"))); |
+ }); |
+ }); |
+ }); |
+ |
+ group("like a server,", () { |
+ test("can receive a call and return a response", () { |
+ expect(outgoing.first, completion(equals({ |
+ "jsonrpc": "2.0", |
+ "result": "qux", |
+ "id": 0 |
+ }))); |
+ |
+ peer.registerMethod("foo", (_) => "qux"); |
+ peer.listen(); |
+ |
+ incoming.add({ |
+ "jsonrpc": "2.0", |
+ "method": "foo", |
+ "params": {"bar": "baz"}, |
+ "id": 0 |
+ }); |
+ }); |
+ |
+ test("can receive a batch of calls and return a batch of responses", () { |
+ expect(outgoing.first, completion(equals([ |
+ { |
+ "jsonrpc": "2.0", |
+ "result": "qux", |
+ "id": 0 |
+ }, |
+ { |
+ "jsonrpc": "2.0", |
+ "result": "d", |
+ "id": 1 |
+ }, |
+ { |
+ "jsonrpc": "2.0", |
+ "result": "z", |
+ "id": 2 |
+ } |
+ ]))); |
+ |
+ peer.registerMethod("foo", (_) => "qux"); |
+ peer.registerMethod("a", (_) => "d"); |
+ peer.registerMethod("w", (_) => "z"); |
+ peer.listen(); |
+ |
+ incoming.add([ |
+ { |
+ "jsonrpc": "2.0", |
+ "method": "foo", |
+ "params": {"bar": "baz"}, |
+ "id": 0 |
+ }, |
+ { |
+ "jsonrpc": "2.0", |
+ "method": "a", |
+ "params": {"b": "c"}, |
+ "id": 1 |
+ }, |
+ { |
+ "jsonrpc": "2.0", |
+ "method": "w", |
+ "params": {"x": "y"}, |
+ "id": 2 |
+ } |
+ ]); |
+ }); |
+ |
+ test("returns a response for malformed JSON", () { |
+ var incomingController = new StreamController(); |
+ var outgoingController = new StreamController(); |
+ var jsonPeer = new json_rpc.Peer( |
+ incomingController.stream, outgoingController); |
+ |
+ expect(outgoingController.stream.first.then(JSON.decode), completion({ |
+ "jsonrpc": "2.0", |
+ "error": { |
+ 'code': error_code.PARSE_ERROR, |
+ "message": startsWith("Invalid JSON: "), |
+ "data": {'request': '{invalid'} |
+ }, |
+ "id": null |
+ })); |
+ |
+ jsonPeer.listen(); |
+ |
+ incomingController.add("{invalid"); |
+ }); |
+ |
+ test("returns a response for incorrectly-structured JSON", () { |
+ expect(outgoing.first, completion({ |
+ "jsonrpc": "2.0", |
+ "error": { |
+ 'code': error_code.INVALID_REQUEST, |
+ "message": 'Request must contain a "jsonrpc" key.', |
+ "data": {'request': {'completely': 'wrong'}} |
+ }, |
+ "id": null |
+ })); |
+ |
+ peer.listen(); |
+ |
+ incoming.add({ |
+ "completely": "wrong" |
+ }); |
+ }); |
+ }); |
+} |