blob: 966339caf50b385e04afdc1e683a33c8b52cd37c [file] [log] [blame]
// 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 'dart:async';
import 'package:test/test.dart';
import 'package:vm_service/vm_service.dart';
import 'package:vm_service/vm_service_io.dart';
import 'common/service_test_common.dart';
import 'common/test_helper.dart';
const successServiceName = 'successService';
const errorServiceName = 'errorService';
const serviceAlias = 'serviceAlias';
const paramKey = 'pkey';
const paramValue = 'pvalue';
const resultKey = 'rkey';
const resultValue = 'rvalue';
const errorCode = 5000;
const errorKey = 'ekey';
const errorValue = 'evalue';
const repetition = 5;
const errorMessage = 'Error message';
Future<void> testSuccessService(
VmService primaryClient,
VmService secondaryClient,
) async {
int requestCount = 0;
final successServiceMethod = await registerServiceHelper(
primaryClient,
secondaryClient,
successServiceName,
(params) async {
final i = requestCount.toString();
expect(params[paramKey + i], paramValue + i);
++requestCount;
return {
'result': {
resultKey + i: resultValue + i,
},
};
},
);
// Testing serial invocation of service which succeeds
{
for (int i = 0; i < repetition; ++i) {
final response = await primaryClient.callServiceExtension(
successServiceMethod,
args: {
paramKey + i.toString(): paramValue + i.toString(),
},
);
expect(
response.json![resultKey + i.toString()],
resultValue + i.toString(),
);
}
}
}
Future<void> testErrorService(
VmService primaryClient,
VmService secondaryClient,
) async {
int requestCount = 0;
final errorServiceMethod = await registerServiceHelper(
primaryClient,
secondaryClient,
errorServiceName,
(params) async {
final i = requestCount++;
final iStr = i.toString();
return {
'error': {
'code': errorCode + i,
'data': {errorKey + iStr: errorValue + iStr},
'message': errorMessage,
},
};
},
);
// Testing serial invocation of service which returns an error
for (int i = 0; i < repetition; ++i) {
try {
await primaryClient.callServiceExtension(
errorServiceMethod,
args: {
paramKey + i.toString(): paramValue + i.toString(),
},
);
fail('Response should be an error');
} on RPCError catch (e) {
expect(e.code, errorCode + i);
expect(e.data![errorKey + i.toString()], errorValue + i.toString());
expect(e.message, errorMessage);
}
}
}
final tests = <IsolateTest>[
(VmService primaryClient, IsolateRef isolateRef) async {
final secondaryClient = await vmServiceConnectUri(primaryClient.wsUri!);
await testSuccessService(primaryClient, secondaryClient);
await testErrorService(primaryClient, secondaryClient);
},
];
void main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'external_service_asynchronous_invocation_test.dart',
);