blob: 5703dd7e94a73af6770d0cacff28498bcb3ead3f [file] [log] [blame] [edit]
// Copyright (c) 2023, 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 'package:dart_service_protocol_shared/src/client.dart';
import 'package:test/test.dart';
class TestClientManager extends ClientManager {}
class TestClient extends Client {
int closeCount = 0;
int sendRequestCount = 0;
int streamNotifyCount = 0;
@override
Future<void> close() {
closeCount++;
return Future.value();
}
@override
Future sendRequest({required String method, parameters}) {
sendRequestCount++;
return Future.value();
}
@override
void streamNotify(String stream, Object data) {
streamNotifyCount++;
}
}
void main() {
group('ClientManager', () {
late ClientManager clientManager;
setUp(() {
clientManager = TestClientManager();
});
test('add and remove client', () {
final client = TestClient();
expect(clientManager.clients.length, 0);
clientManager.addClient(client);
expect(clientManager.clients.length, 1);
expect(clientManager.clients.first, client);
clientManager.removeClient(client);
expect(clientManager.clients.length, 0);
});
test('client name', () {
final client = TestClient();
// Name unset until client is added to a manager
expect(client.name, isNull);
// Sets the client name to a default
clientManager.addClient(client);
final defaultClientName = client.name;
expect(client.name?.startsWith('client'), isTrue);
clientManager.setClientName(client, 'test');
expect(client.name, 'test');
clientManager.clearClientName(client);
expect(client.name, defaultClientName);
});
test('findClientThatHandlesServiceMethod', () {
final client1 = TestClient();
final client2 = TestClient();
client1.services['service1'] = ClientServiceInfo(
'service1', {'method': ClientServiceMethodInfo('method')});
client2.services['service2'] = ClientServiceInfo(
'service2', {'method': ClientServiceMethodInfo('method')});
clientManager.addClient(client1);
clientManager.addClient(client2);
expect(
clientManager.findClientThatHandlesServiceMethod('service1', 'method'),
client1,
);
expect(
clientManager.findClientThatHandlesServiceMethod('service1', 'xxxxx'),
isNull,
);
expect(
clientManager.findClientThatHandlesServiceMethod('service2', 'method'),
client2,
);
expect(
clientManager.findClientThatHandlesServiceMethod('xxxxx', 'method'),
isNull,
);
});
test('shutdown', () async {
final client1 = TestClient();
final client2 = TestClient();
final client3 = TestClient();
clientManager.addClient(client1);
clientManager.addClient(client2);
clientManager.addClient(client3);
expect(client1.closeCount, 0);
expect(client2.closeCount, 0);
expect(client3.closeCount, 0);
expect(
clientManager.clients,
unorderedEquals([
client1,
client2,
client3,
]),
);
await clientManager.shutdown();
expect(client1.closeCount, 1);
expect(client2.closeCount, 1);
expect(client3.closeCount, 1);
expect(
clientManager.clients,
[],
);
});
});
group('ClientServiceInfo', () {
test('toJson and fromJson', () {
final serviceInfo = ClientServiceInfo(
'testService',
{
'method1': ClientServiceMethodInfo('method1', {'capability': true}),
'method2': ClientServiceMethodInfo('method2'),
},
);
final json = serviceInfo.toJson();
final deserialized = ClientServiceInfo.fromJson(json);
expect(deserialized.name, 'testService');
expect(deserialized.methods.length, 2);
expect(deserialized.methods['method1']?.name, 'method1');
expect(
deserialized.methods['method1']?.capabilities,
{'capability': true},
);
expect(deserialized.methods['method2']?.name, 'method2');
expect(deserialized.methods['method2']?.capabilities, isNull);
});
test('fromJson throws with invalid json', () {
expect(
() => ClientServiceInfo.fromJson({
'name': 'testService',
'methods': [
{'bad': 'format'}
],
}),
throwsA(isA<ArgumentError>()),
);
expect(
() => ClientServiceInfo.fromJson({
'methods': [
{'name': 'method1'}
],
}),
throwsA(isA<ArgumentError>()),
reason: 'Missing "name" field in top-level map',
);
});
});
group('ClientServiceMethodInfo', () {
test('toJson and parse', () {
final methodInfo =
ClientServiceMethodInfo('testMethod', {'capability': 123});
final json = methodInfo.toJson();
final deserialized = ClientServiceMethodInfo.fromJson(json);
expect(deserialized.name, 'testMethod');
expect(deserialized.capabilities, {'capability': 123});
});
test('toJson and parse without capabilities', () {
final methodInfo = ClientServiceMethodInfo('testMethod');
final json = methodInfo.toJson();
final deserialized = ClientServiceMethodInfo.fromJson(json);
expect(deserialized.name, 'testMethod');
expect(deserialized.capabilities, isNull);
});
});
test('ClientServiceMethodInfo throws with invalid json', () {
expect(
() => ClientServiceMethodInfo.fromJson({
'bad': 'format',
}),
throwsA(isA<ArgumentError>()),
);
});
}