blob: 5d0f806dbd3dfed5592ae3ba62da852e20988165 [file] [log] [blame]
library service_test;
import 'dart:async' show Future;
import 'package:protobuf/protobuf.dart';
import 'package:unittest/unittest.dart';
import '../out/protos/service.pb.dart' as pb;
class SearchService extends pb.SearchServiceBase {
Future<pb.SearchResponse> search(
ServerContext ctx, pb.SearchRequest request) async {
var out = new pb.SearchResponse();
if (request.query == 'hello' || request.query == 'world') {
out.result.add('hello, world!');
}
return out;
}
}
class FakeJsonServer {
final GeneratedService searchService;
FakeJsonServer(this.searchService);
Future<String> messageHandler(
String serviceName, String methodName, String requestJson) async {
if (serviceName == 'SearchService') {
GeneratedMessage request = searchService.createRequest(methodName);
request.mergeFromJson(requestJson);
var ctx = new ServerContext();
var reply = await searchService.handleCall(ctx, methodName, request);
return reply.writeToJson();
} else {
throw 'unknown service: $serviceName';
}
}
}
class FakeJsonClient implements RpcClient {
final FakeJsonServer server;
FakeJsonClient(this.server);
Future<GeneratedMessage> invoke(
ClientContext ctx, String serviceName, String methodName,
GeneratedMessage request, GeneratedMessage response) async {
String requestJson = request.writeToJson();
String replyJson =
await server.messageHandler(serviceName, methodName, requestJson);
response.mergeFromJson(replyJson);
return response;
}
}
void main() {
var server = new FakeJsonServer(new SearchService());
var api = new pb.SearchServiceApi(new FakeJsonClient(server));
test('end to end RPC using JSON', () async {
var request = new pb.SearchRequest()
..query = "hello";
var reply = await api.search(new ClientContext(), request);
expect(reply.result, ["hello, world!"]);
});
}