Skip to content

Commit 3daab72

Browse files
authored
Add generic service client (#389)
1 parent 2175a31 commit 3daab72

File tree

6 files changed

+195
-3
lines changed

6 files changed

+195
-3
lines changed

lib/src/services/generic.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import 'package:grpc/grpc_connection_interface.dart';
2+
3+
import '../../protos/common/common.dart';
4+
import '../gen/common/v1/common.pb.dart';
5+
import '../gen/service/generic/v1/generic.pbgrpc.dart' as generic_pb;
6+
import '../resource/base.dart';
7+
import '../utils.dart';
8+
9+
/// {@category Services}
10+
class GenericServiceClient extends Resource with RPCDebugLoggerMixin implements ResourceRPCClient {
11+
static const Subtype subtype = Subtype(resourceNamespaceRDK, resourceTypeService, 'generic');
12+
13+
@override
14+
final String name;
15+
16+
@override
17+
ClientChannelBase channel;
18+
19+
@override
20+
generic_pb.GenericServiceClient get client => generic_pb.GenericServiceClient(channel);
21+
22+
GenericServiceClient(this.name, this.channel);
23+
24+
@override
25+
Future<Map<String, dynamic>> doCommand(Map<String, dynamic> command) async {
26+
final request = DoCommandRequest()
27+
..name = name
28+
..command = command.toStruct();
29+
final response = await client.doCommand(request, options: callOptions);
30+
return response.result.toMap();
31+
}
32+
}

lib/viam_sdk.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export 'src/rpc/dial.dart';
5757

5858
/// Services
5959
export 'src/services/discovery.dart';
60+
export 'src/services/generic.dart';
6061
export 'src/services/vision.dart';
6162

6263
/// Misc

test/unit_test/components/generic_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:flutter_test/flutter_test.dart';
22
import 'package:grpc/grpc.dart';
33
import 'package:viam_sdk/src/components/generic/service.dart';
4-
import 'package:viam_sdk/src/gen/component/generic/v1/generic.pbgrpc.dart';
4+
import 'package:viam_sdk/src/gen/component/generic/v1/generic.pbgrpc.dart' as generic_pb;
55
import 'package:viam_sdk/src/resource/manager.dart';
66
import 'package:viam_sdk/src/utils.dart';
77
import 'package:viam_sdk/viam_sdk.dart';
@@ -61,7 +61,7 @@ void main() {
6161
test('doCommand', () async {
6262
final cmd = {'foo': 'bar'};
6363

64-
final client = GenericServiceClient(channel);
64+
final client = generic_pb.GenericServiceClient(channel);
6565
final resp = await client.doCommand(DoCommandRequest()
6666
..name = name
6767
..command = cmd.toStruct());

test/unit_test/mocks/service_clients_mocks.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ import 'package:viam_sdk/src/gen/app/v1/billing.pbgrpc.dart';
88
import 'package:viam_sdk/src/gen/app/v1/robot.pbgrpc.dart' as app_robot;
99
import 'package:viam_sdk/src/gen/provisioning/v1/provisioning.pbgrpc.dart';
1010
import 'package:viam_sdk/src/gen/robot/v1/robot.pbgrpc.dart';
11-
import 'package:viam_sdk/src/gen/service/vision/v1/vision.pbgrpc.dart';
1211
import 'package:viam_sdk/src/gen/service/discovery/v1/discovery.pbgrpc.dart';
12+
import 'package:viam_sdk/src/gen/service/generic/v1/generic.pbgrpc.dart';
13+
import 'package:viam_sdk/src/gen/service/vision/v1/vision.pbgrpc.dart';
1314

1415
@GenerateNiceMocks([
1516
MockSpec<ClientChannelBase>(),
@@ -23,5 +24,6 @@ import 'package:viam_sdk/src/gen/service/discovery/v1/discovery.pbgrpc.dart';
2324
MockSpec<MLTrainingServiceClient>(),
2425
MockSpec<DatasetServiceClient>(),
2526
MockSpec<DiscoveryServiceClient>(),
27+
MockSpec<GenericServiceClient>(as: Symbol('MockGenericServiceClient')),
2628
])
2729
void main() {}

test/unit_test/mocks/service_clients_mocks.mocks.dart

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import 'package:viam_sdk/src/gen/service/discovery/v1/discovery.pb.dart'
3434
as _i28;
3535
import 'package:viam_sdk/src/gen/service/discovery/v1/discovery.pbgrpc.dart'
3636
as _i27;
37+
import 'package:viam_sdk/src/gen/service/generic/v1/generic.pbgrpc.dart'
38+
as _i29;
3739
import 'package:viam_sdk/src/gen/service/vision/v1/vision.pb.dart' as _i19;
3840
import 'package:viam_sdk/src/gen/service/vision/v1/vision.pbgrpc.dart' as _i18;
3941

@@ -6498,3 +6500,121 @@ class MockDiscoveryServiceClient extends _i1.Mock
64986500
)
64996501
as _i4.ResponseStream<R>);
65006502
}
6503+
6504+
/// A class which mocks [GenericServiceClient].
6505+
///
6506+
/// See the documentation for Mockito's code generation for more information.
6507+
class MockGenericServiceClient extends _i1.Mock
6508+
implements _i29.GenericServiceClient {
6509+
@override
6510+
_i4.ResponseFuture<_i20.DoCommandResponse> doCommand(
6511+
_i20.DoCommandRequest? request, {
6512+
_i3.CallOptions? options,
6513+
}) =>
6514+
(super.noSuchMethod(
6515+
Invocation.method(#doCommand, [request], {#options: options}),
6516+
returnValue: _FakeResponseFuture_2<_i20.DoCommandResponse>(
6517+
this,
6518+
Invocation.method(#doCommand, [request], {#options: options}),
6519+
),
6520+
returnValueForMissingStub:
6521+
_FakeResponseFuture_2<_i20.DoCommandResponse>(
6522+
this,
6523+
Invocation.method(#doCommand, [request], {#options: options}),
6524+
),
6525+
)
6526+
as _i4.ResponseFuture<_i20.DoCommandResponse>);
6527+
6528+
@override
6529+
_i3.ClientCall<Q, R> $createCall<Q, R>(
6530+
_i7.ClientMethod<Q, R>? method,
6531+
_i6.Stream<Q>? requests, {
6532+
_i3.CallOptions? options,
6533+
}) =>
6534+
(super.noSuchMethod(
6535+
Invocation.method(
6536+
#$createCall,
6537+
[method, requests],
6538+
{#options: options},
6539+
),
6540+
returnValue: _FakeClientCall_1<Q, R>(
6541+
this,
6542+
Invocation.method(
6543+
#$createCall,
6544+
[method, requests],
6545+
{#options: options},
6546+
),
6547+
),
6548+
returnValueForMissingStub: _FakeClientCall_1<Q, R>(
6549+
this,
6550+
Invocation.method(
6551+
#$createCall,
6552+
[method, requests],
6553+
{#options: options},
6554+
),
6555+
),
6556+
)
6557+
as _i3.ClientCall<Q, R>);
6558+
6559+
@override
6560+
_i4.ResponseFuture<R> $createUnaryCall<Q, R>(
6561+
_i7.ClientMethod<Q, R>? method,
6562+
Q? request, {
6563+
_i3.CallOptions? options,
6564+
}) =>
6565+
(super.noSuchMethod(
6566+
Invocation.method(
6567+
#$createUnaryCall,
6568+
[method, request],
6569+
{#options: options},
6570+
),
6571+
returnValue: _FakeResponseFuture_2<R>(
6572+
this,
6573+
Invocation.method(
6574+
#$createUnaryCall,
6575+
[method, request],
6576+
{#options: options},
6577+
),
6578+
),
6579+
returnValueForMissingStub: _FakeResponseFuture_2<R>(
6580+
this,
6581+
Invocation.method(
6582+
#$createUnaryCall,
6583+
[method, request],
6584+
{#options: options},
6585+
),
6586+
),
6587+
)
6588+
as _i4.ResponseFuture<R>);
6589+
6590+
@override
6591+
_i4.ResponseStream<R> $createStreamingCall<Q, R>(
6592+
_i7.ClientMethod<Q, R>? method,
6593+
_i6.Stream<Q>? requests, {
6594+
_i3.CallOptions? options,
6595+
}) =>
6596+
(super.noSuchMethod(
6597+
Invocation.method(
6598+
#$createStreamingCall,
6599+
[method, requests],
6600+
{#options: options},
6601+
),
6602+
returnValue: _FakeResponseStream_3<R>(
6603+
this,
6604+
Invocation.method(
6605+
#$createStreamingCall,
6606+
[method, requests],
6607+
{#options: options},
6608+
),
6609+
),
6610+
returnValueForMissingStub: _FakeResponseStream_3<R>(
6611+
this,
6612+
Invocation.method(
6613+
#$createStreamingCall,
6614+
[method, requests],
6615+
{#options: options},
6616+
),
6617+
),
6618+
)
6619+
as _i4.ResponseStream<R>);
6620+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:mockito/mockito.dart';
3+
import 'package:viam_sdk/protos/service/generic.dart' as generic_pb;
4+
import 'package:viam_sdk/src/utils.dart';
5+
import 'package:viam_sdk/viam_sdk.dart';
6+
7+
import '../mocks/mock_response_future.dart';
8+
import '../mocks/service_clients_mocks.mocks.dart';
9+
10+
class FakeGenericClient extends GenericServiceClient {
11+
@override
12+
generic_pb.GenericServiceClient get client => _client;
13+
14+
final MockGenericServiceClient _client;
15+
16+
FakeGenericClient(super.name, super.channel, this._client);
17+
}
18+
19+
void main() {
20+
late GenericServiceClient client;
21+
late MockGenericServiceClient serviceClient;
22+
23+
setUp(() {
24+
serviceClient = MockGenericServiceClient();
25+
client = FakeGenericClient('generic', MockClientChannelBase(), serviceClient);
26+
});
27+
28+
group('Generic Service RPC Client Tests', () {
29+
test('doCommand', () async {
30+
final expected = {'foo': 'bar'};
31+
when(serviceClient.doCommand(any, options: anyNamed('options')))
32+
.thenAnswer((_) => MockResponseFuture.value(DoCommandResponse(result: expected.toStruct())));
33+
final response = await client.doCommand(expected);
34+
expect(response, equals(expected));
35+
});
36+
});
37+
}

0 commit comments

Comments
 (0)