blob: 94c49e6bbf1f81e1f223a12611f53cc2b0a4f104 [file] [log] [blame]
// 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.
import 'dart:async';
import 'dart:convert';
import 'package:stream_channel/stream_channel.dart';
import 'package:test/test.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(
new StreamChannel(incomingController.stream, outgoingController));
});
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<String>();
var outgoingController = new StreamController<String>();
var jsonPeer = new json_rpc.Peer(
new StreamChannel(incomingController.stream, outgoingController));
expect(
outgoingController.stream.first.then(jsonDecode),
completion({
"jsonrpc": "2.0",
"error": {
'code': error_code.PARSE_ERROR,
"message": startsWith("Invalid JSON: "),
// TODO(nweiz): Always expect the source when sdk#25655 is fixed.
"data": {
'request': anyOf([isNull, '{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"});
});
});
}