xref: /aosp_15_r20/external/pigweed/pw_rpc/raw/client_testing.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2021 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 // clang-format off
16*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/internal/log_config.h" // PW_LOG_* macros must be first.
17*61c4878aSAndroid Build Coastguard Worker 
18*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/raw/client_testing.h"
19*61c4878aSAndroid Build Coastguard Worker // clang-format on
20*61c4878aSAndroid Build Coastguard Worker 
21*61c4878aSAndroid Build Coastguard Worker #include <mutex>
22*61c4878aSAndroid Build Coastguard Worker 
23*61c4878aSAndroid Build Coastguard Worker #include "pw_assert/check.h"
24*61c4878aSAndroid Build Coastguard Worker #include "pw_log/log.h"
25*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/client.h"
26*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/internal/lock.h"
27*61c4878aSAndroid Build Coastguard Worker 
28*61c4878aSAndroid Build Coastguard Worker namespace pw::rpc {
29*61c4878aSAndroid Build Coastguard Worker 
CheckProcessPacket(internal::pwpb::PacketType type,uint32_t service_id,uint32_t method_id,std::optional<uint32_t> call_id,ConstByteSpan payload,Status status) const30*61c4878aSAndroid Build Coastguard Worker void FakeServer::CheckProcessPacket(internal::pwpb::PacketType type,
31*61c4878aSAndroid Build Coastguard Worker                                     uint32_t service_id,
32*61c4878aSAndroid Build Coastguard Worker                                     uint32_t method_id,
33*61c4878aSAndroid Build Coastguard Worker                                     std::optional<uint32_t> call_id,
34*61c4878aSAndroid Build Coastguard Worker                                     ConstByteSpan payload,
35*61c4878aSAndroid Build Coastguard Worker                                     Status status) const {
36*61c4878aSAndroid Build Coastguard Worker   if (Status process_packet_status =
37*61c4878aSAndroid Build Coastguard Worker           ProcessPacket(type, service_id, method_id, call_id, payload, status);
38*61c4878aSAndroid Build Coastguard Worker       !process_packet_status.ok()) {
39*61c4878aSAndroid Build Coastguard Worker     PW_LOG_CRITICAL("Failed to process packet in pw::rpc::FakeServer");
40*61c4878aSAndroid Build Coastguard Worker     PW_LOG_CRITICAL(
41*61c4878aSAndroid Build Coastguard Worker         "Packet contents\ntype: %u\nchannel_id: %u\nservice_id: %08x\n"
42*61c4878aSAndroid Build Coastguard Worker         "method_id: %08x\npayload: %u bytes\nstatus: %s",
43*61c4878aSAndroid Build Coastguard Worker         static_cast<unsigned>(type),
44*61c4878aSAndroid Build Coastguard Worker         static_cast<unsigned>(channel_id_),
45*61c4878aSAndroid Build Coastguard Worker         static_cast<unsigned>(service_id),
46*61c4878aSAndroid Build Coastguard Worker         static_cast<unsigned>(method_id),
47*61c4878aSAndroid Build Coastguard Worker         static_cast<unsigned>(payload.size()),
48*61c4878aSAndroid Build Coastguard Worker         status.str());
49*61c4878aSAndroid Build Coastguard Worker     PW_CHECK_OK(process_packet_status);
50*61c4878aSAndroid Build Coastguard Worker   }
51*61c4878aSAndroid Build Coastguard Worker }
52*61c4878aSAndroid Build Coastguard Worker 
ProcessPacket(internal::pwpb::PacketType type,uint32_t service_id,uint32_t method_id,std::optional<uint32_t> call_id,ConstByteSpan payload,Status status) const53*61c4878aSAndroid Build Coastguard Worker Status FakeServer::ProcessPacket(internal::pwpb::PacketType type,
54*61c4878aSAndroid Build Coastguard Worker                                  uint32_t service_id,
55*61c4878aSAndroid Build Coastguard Worker                                  uint32_t method_id,
56*61c4878aSAndroid Build Coastguard Worker                                  std::optional<uint32_t> call_id,
57*61c4878aSAndroid Build Coastguard Worker                                  ConstByteSpan payload,
58*61c4878aSAndroid Build Coastguard Worker                                  Status status) const {
59*61c4878aSAndroid Build Coastguard Worker   if (!call_id.has_value()) {
60*61c4878aSAndroid Build Coastguard Worker     std::lock_guard lock(output_.mutex_);
61*61c4878aSAndroid Build Coastguard Worker     auto view = internal::test::PacketsView(
62*61c4878aSAndroid Build Coastguard Worker         output_.packets(),
63*61c4878aSAndroid Build Coastguard Worker         internal::test::PacketFilter(internal::pwpb::PacketType::REQUEST,
64*61c4878aSAndroid Build Coastguard Worker                                      internal::pwpb::PacketType::RESPONSE,
65*61c4878aSAndroid Build Coastguard Worker                                      channel_id_,
66*61c4878aSAndroid Build Coastguard Worker                                      service_id,
67*61c4878aSAndroid Build Coastguard Worker                                      method_id));
68*61c4878aSAndroid Build Coastguard Worker 
69*61c4878aSAndroid Build Coastguard Worker     // Re-use the call ID of the most recent packet for this RPC.
70*61c4878aSAndroid Build Coastguard Worker     if (!view.empty()) {
71*61c4878aSAndroid Build Coastguard Worker       call_id = view.back().call_id();
72*61c4878aSAndroid Build Coastguard Worker     }
73*61c4878aSAndroid Build Coastguard Worker   }
74*61c4878aSAndroid Build Coastguard Worker 
75*61c4878aSAndroid Build Coastguard Worker   auto packet_encoding_result =
76*61c4878aSAndroid Build Coastguard Worker       internal::Packet(type,
77*61c4878aSAndroid Build Coastguard Worker                        channel_id_,
78*61c4878aSAndroid Build Coastguard Worker                        service_id,
79*61c4878aSAndroid Build Coastguard Worker                        method_id,
80*61c4878aSAndroid Build Coastguard Worker                        call_id.value_or(internal::Packet::kUnassignedId),
81*61c4878aSAndroid Build Coastguard Worker                        payload,
82*61c4878aSAndroid Build Coastguard Worker                        status)
83*61c4878aSAndroid Build Coastguard Worker           .Encode(packet_buffer_);
84*61c4878aSAndroid Build Coastguard Worker   PW_CHECK_OK(packet_encoding_result.status());
85*61c4878aSAndroid Build Coastguard Worker   return client_.ProcessPacket(*packet_encoding_result);
86*61c4878aSAndroid Build Coastguard Worker }
87*61c4878aSAndroid Build Coastguard Worker 
88*61c4878aSAndroid Build Coastguard Worker }  // namespace pw::rpc
89