blob: 67d43fb4718755499f9f7d5ba3db9ca4a80047dc [file] [log] [blame] [edit]
// Copyright (c) 2025, 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:io' as io;
import 'package:path/path.dart' as p;
import 'package:perf_witness/src/common.dart';
import 'package:perf_witness/src/json_rpc.dart';
import 'package:test/test.dart';
void main() {
group('JsonRpc', () {
late JsonRpcServer server;
late JsonRpcPeer client;
late String socketPath;
setUp(() async {
socketPath = p.join(
io.Directory.systemTemp.createTempSync().path,
'test.sock',
);
server = JsonRpcServer(await UnixDomainSocket.bind(socketPath), {
'testMethod': (requestor, params) => 'Hello, ${params!['name']}',
'errorMethod': (requestor, params) => throw 'Something went wrong',
'ping': (requestor, params) => 'pong',
'checkEndpoint': (requestor, params) {
expect(server.endpoints, contains(requestor));
return 'ok';
},
});
client =
jsonRpcPeerFromSocket(await UnixDomainSocket.connect(socketPath), {
'reverse': (requestor, params) =>
(params!['text'] as String).split('').reversed.join(),
});
});
tearDown(() async {
await client.close();
await server.close();
final file = io.File(socketPath);
if (file.existsSync()) {
file.deleteSync();
}
});
test('can make a successful request', () async {
final result = await client.sendRequest('testMethod', {'name': 'World'});
expect(result, 'Hello, World');
});
test('handles method not found', () async {
try {
await client.sendRequest('nonExistentMethod');
fail('Expected an error');
} catch (e) {
expect(e, isA<JsonRpcException>());
expect(
(e as JsonRpcException).message,
'Unknown method "nonExistentMethod".',
);
}
});
test('handles internal server error', () async {
try {
await client.sendRequest('errorMethod');
fail('Expected an error');
} catch (e) {
expect(e, isA<JsonRpcException>());
expect((e as JsonRpcException).message, 'Something went wrong');
}
});
test('can make bidirectional requests', () async {
// Client calls server
expect(await client.sendRequest('ping'), 'pong');
// Server calls client
// Wait for the server to accept the connection.
while (server.endpoints.isEmpty) {
await Future.delayed(const Duration(milliseconds: 10));
}
final endpoint = server.endpoints.first;
expect(await endpoint.sendRequest('reverse', {'text': 'hello'}), 'olleh');
});
test('method receives correct endpoint', () async {
expect(await client.sendRequest('checkEndpoint'), equals('ok'));
});
});
}