xref: /aosp_15_r20/external/pigweed/pw_rpc/client_server_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker 
15*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/client_server.h"
16*61c4878aSAndroid Build Coastguard Worker 
17*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/internal/packet.h"
18*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/internal/test_utils.h"
19*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/raw/fake_channel_output.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/raw/internal/method_union.h"
21*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/service.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
23*61c4878aSAndroid Build Coastguard Worker 
24*61c4878aSAndroid Build Coastguard Worker namespace pw::rpc::internal {
25*61c4878aSAndroid Build Coastguard Worker namespace {
26*61c4878aSAndroid Build Coastguard Worker 
27*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kFakeChannelId = 1;
28*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kFakeServiceId = 3;
29*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kFakeMethodId = 10;
30*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kFakeCallId = 239;
31*61c4878aSAndroid Build Coastguard Worker 
32*61c4878aSAndroid Build Coastguard Worker RawFakeChannelOutput<1> output;
33*61c4878aSAndroid Build Coastguard Worker rpc::Channel channels[] = {Channel::Create<kFakeChannelId>(&output)};
34*61c4878aSAndroid Build Coastguard Worker 
FakeMethod(ConstByteSpan,RawUnaryResponder & responder)35*61c4878aSAndroid Build Coastguard Worker void FakeMethod(ConstByteSpan, RawUnaryResponder& responder) {
36*61c4878aSAndroid Build Coastguard Worker   ASSERT_EQ(OkStatus(), responder.Finish({}, Status::Unimplemented()));
37*61c4878aSAndroid Build Coastguard Worker }
38*61c4878aSAndroid Build Coastguard Worker 
39*61c4878aSAndroid Build Coastguard Worker class FakeService : public Service {
40*61c4878aSAndroid Build Coastguard Worker  public:
FakeService(uint32_t id)41*61c4878aSAndroid Build Coastguard Worker   FakeService(uint32_t id) : Service(id, kMethods) {}
42*61c4878aSAndroid Build Coastguard Worker 
43*61c4878aSAndroid Build Coastguard Worker   static constexpr std::array<RawMethodUnion, 1> kMethods = {
44*61c4878aSAndroid Build Coastguard Worker       RawMethod::AsynchronousUnary<FakeMethod>(kFakeMethodId),
45*61c4878aSAndroid Build Coastguard Worker   };
46*61c4878aSAndroid Build Coastguard Worker };
47*61c4878aSAndroid Build Coastguard Worker 
48*61c4878aSAndroid Build Coastguard Worker FakeService service(kFakeServiceId);
49*61c4878aSAndroid Build Coastguard Worker 
TEST(ClientServer,ProcessPacket_CallsServer)50*61c4878aSAndroid Build Coastguard Worker TEST(ClientServer, ProcessPacket_CallsServer) {
51*61c4878aSAndroid Build Coastguard Worker   ClientServer client_server(channels);
52*61c4878aSAndroid Build Coastguard Worker   client_server.server().RegisterService(service);
53*61c4878aSAndroid Build Coastguard Worker 
54*61c4878aSAndroid Build Coastguard Worker   Packet packet(pwpb::PacketType::REQUEST,
55*61c4878aSAndroid Build Coastguard Worker                 kFakeChannelId,
56*61c4878aSAndroid Build Coastguard Worker                 kFakeServiceId,
57*61c4878aSAndroid Build Coastguard Worker                 kFakeMethodId,
58*61c4878aSAndroid Build Coastguard Worker                 kFakeCallId);
59*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 32> buffer;
60*61c4878aSAndroid Build Coastguard Worker   Result result = packet.Encode(buffer);
61*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.status(), OkStatus());
62*61c4878aSAndroid Build Coastguard Worker 
63*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(client_server.ProcessPacket(result.value()), OkStatus());
64*61c4878aSAndroid Build Coastguard Worker }
65*61c4878aSAndroid Build Coastguard Worker 
TEST(ClientServer,ProcessPacket_CallsClient)66*61c4878aSAndroid Build Coastguard Worker TEST(ClientServer, ProcessPacket_CallsClient) {
67*61c4878aSAndroid Build Coastguard Worker   ClientServer client_server(channels);
68*61c4878aSAndroid Build Coastguard Worker   client_server.server().RegisterService(service);
69*61c4878aSAndroid Build Coastguard Worker 
70*61c4878aSAndroid Build Coastguard Worker   // Same packet as above, but type RESPONSE will skip the server and call into
71*61c4878aSAndroid Build Coastguard Worker   // the client.
72*61c4878aSAndroid Build Coastguard Worker   Packet packet(pwpb::PacketType::RESPONSE,
73*61c4878aSAndroid Build Coastguard Worker                 kFakeChannelId,
74*61c4878aSAndroid Build Coastguard Worker                 kFakeServiceId,
75*61c4878aSAndroid Build Coastguard Worker                 kFakeMethodId,
76*61c4878aSAndroid Build Coastguard Worker                 kFakeCallId);
77*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 32> buffer;
78*61c4878aSAndroid Build Coastguard Worker   Result result = packet.Encode(buffer);
79*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.status(), OkStatus());
80*61c4878aSAndroid Build Coastguard Worker 
81*61c4878aSAndroid Build Coastguard Worker   // No calls are registered on the client, so nothing should happen. The
82*61c4878aSAndroid Build Coastguard Worker   // ProcessPacket call still returns OK since the client handled it.
83*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(client_server.ProcessPacket(result.value()), OkStatus());
84*61c4878aSAndroid Build Coastguard Worker }
85*61c4878aSAndroid Build Coastguard Worker 
TEST(ClientServer,ProcessPacket_BadData)86*61c4878aSAndroid Build Coastguard Worker TEST(ClientServer, ProcessPacket_BadData) {
87*61c4878aSAndroid Build Coastguard Worker   ClientServer client_server(channels);
88*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(client_server.ProcessPacket({}), Status::DataLoss());
89*61c4878aSAndroid Build Coastguard Worker }
90*61c4878aSAndroid Build Coastguard Worker 
91*61c4878aSAndroid Build Coastguard Worker }  // namespace
92*61c4878aSAndroid Build Coastguard Worker }  // namespace pw::rpc::internal
93