| // 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 'package:stream_channel/stream_channel.dart'; |
| import 'package:test/test.dart'; |
| |
| import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; |
| |
| import 'utils.dart'; |
| |
| void main() { |
| var responseController; |
| var requestController; |
| var client; |
| setUp(() { |
| responseController = new StreamController(); |
| requestController = new StreamController(); |
| client = new json_rpc.Client.withoutJson( |
| new StreamChannel(responseController.stream, requestController.sink)); |
| }); |
| |
| test(".withoutJson supports decoded stream and sink", () { |
| client.listen(); |
| |
| expect(requestController.stream.first.then((request) { |
| expect(request, allOf([ |
| containsPair('jsonrpc', '2.0'), |
| containsPair('method', 'foo') |
| ])); |
| |
| responseController.add({ |
| 'jsonrpc': '2.0', |
| 'result': 'bar', |
| 'id': request['id'] |
| }); |
| }), completes); |
| |
| client.sendRequest('foo'); |
| }); |
| |
| test(".listen returns when the controller is closed", () { |
| var hasListenCompeted = false; |
| expect(client.listen().then((_) => hasListenCompeted = true), completes); |
| |
| return pumpEventQueue().then((_) { |
| expect(hasListenCompeted, isFalse); |
| |
| // This should cause listen to complete. |
| return responseController.close(); |
| }); |
| }); |
| |
| test(".listen returns a stream error", () { |
| expect(client.listen(), throwsA('oh no')); |
| responseController.addError('oh no'); |
| }); |
| |
| test(".listen can't be called twice", () { |
| client.listen(); |
| expect(() => client.listen(), throwsStateError); |
| }); |
| |
| test(".close cancels the stream subscription and closes the sink", () { |
| // Work around sdk#19095. |
| requestController.stream.listen(null); |
| |
| expect(client.listen(), completes); |
| |
| expect(client.isClosed, isFalse); |
| expect(client.close(), completes); |
| expect(client.isClosed, isTrue); |
| |
| expect(() => responseController.stream.listen((_) {}), throwsStateError); |
| expect(requestController.isClosed, isTrue); |
| }); |
| |
| group("a stream error", () { |
| test("is reported through .done", () { |
| expect(client.listen(), throwsA("oh no!")); |
| expect(client.done, throwsA("oh no!")); |
| responseController.addError("oh no!"); |
| }); |
| |
| test("cause a pending request to throw a StateError", () { |
| expect(client.listen(), throwsA("oh no!")); |
| expect(client.sendRequest('foo'), throwsStateError); |
| responseController.addError("oh no!"); |
| }); |
| |
| test("causes future requests to throw StateErrors", () async { |
| expect(client.listen(), throwsA("oh no!")); |
| responseController.addError("oh no!"); |
| await pumpEventQueue(); |
| |
| expect(() => client.sendRequest('foo'), throwsStateError); |
| expect(() => client.sendNotification('foo'), throwsStateError); |
| }); |
| }); |
| } |