xref: /aosp_15_r20/external/pigweed/pw_rpc/fuzz/engine_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2023 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/fuzz/engine.h"
16*61c4878aSAndroid Build Coastguard Worker 
17*61c4878aSAndroid Build Coastguard Worker #include <chrono>
18*61c4878aSAndroid Build Coastguard Worker 
19*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/vector.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_log/log.h"
21*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/benchmark.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/internal/client_server_testing.h"
23*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/internal/client_server_testing_threaded.h"
24*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/internal/fake_channel_output.h"
25*61c4878aSAndroid Build Coastguard Worker #include "pw_thread/non_portable_test_thread_options.h"
26*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
27*61c4878aSAndroid Build Coastguard Worker 
28*61c4878aSAndroid Build Coastguard Worker namespace pw::rpc::fuzz {
29*61c4878aSAndroid Build Coastguard Worker namespace {
30*61c4878aSAndroid Build Coastguard Worker 
31*61c4878aSAndroid Build Coastguard Worker using namespace std::literals::chrono_literals;
32*61c4878aSAndroid Build Coastguard Worker 
33*61c4878aSAndroid Build Coastguard Worker // Maximum time, in milliseconds, that can elapse without a call completing or
34*61c4878aSAndroid Build Coastguard Worker // being dropped in some way..
35*61c4878aSAndroid Build Coastguard Worker const chrono::SystemClock::duration kTimeout = 5s;
36*61c4878aSAndroid Build Coastguard Worker 
37*61c4878aSAndroid Build Coastguard Worker // These are fairly tight constraints in order to fit within the default
38*61c4878aSAndroid Build Coastguard Worker // `PW_UNIT_TEST_CONFIG_MEMORY_POOL_SIZE`.
39*61c4878aSAndroid Build Coastguard Worker constexpr size_t kMaxPackets = 128;
40*61c4878aSAndroid Build Coastguard Worker constexpr size_t kMaxPayloadSize = 64;
41*61c4878aSAndroid Build Coastguard Worker 
42*61c4878aSAndroid Build Coastguard Worker using BufferedChannelOutputBase =
43*61c4878aSAndroid Build Coastguard Worker     internal::test::FakeChannelOutputBuffer<kMaxPackets, kMaxPayloadSize>;
44*61c4878aSAndroid Build Coastguard Worker 
45*61c4878aSAndroid Build Coastguard Worker /// Channel output backed by a fixed buffer.
46*61c4878aSAndroid Build Coastguard Worker class BufferedChannelOutput : public BufferedChannelOutputBase {
47*61c4878aSAndroid Build Coastguard Worker  public:
BufferedChannelOutput()48*61c4878aSAndroid Build Coastguard Worker   BufferedChannelOutput() : BufferedChannelOutputBase() {}
49*61c4878aSAndroid Build Coastguard Worker };
50*61c4878aSAndroid Build Coastguard Worker 
51*61c4878aSAndroid Build Coastguard Worker using FuzzerChannelOutputBase =
52*61c4878aSAndroid Build Coastguard Worker     internal::WatchableChannelOutput<BufferedChannelOutput,
53*61c4878aSAndroid Build Coastguard Worker                                      kMaxPayloadSize,
54*61c4878aSAndroid Build Coastguard Worker                                      kMaxPackets,
55*61c4878aSAndroid Build Coastguard Worker                                      kMaxPayloadSize>;
56*61c4878aSAndroid Build Coastguard Worker 
57*61c4878aSAndroid Build Coastguard Worker /// Channel output that can be waited on by the server.
58*61c4878aSAndroid Build Coastguard Worker class FuzzerChannelOutput : public FuzzerChannelOutputBase {
59*61c4878aSAndroid Build Coastguard Worker  public:
FuzzerChannelOutput(TestPacketProcessor && server_packet_processor=nullptr,TestPacketProcessor && client_packet_processor=nullptr)60*61c4878aSAndroid Build Coastguard Worker   explicit FuzzerChannelOutput(
61*61c4878aSAndroid Build Coastguard Worker       TestPacketProcessor&& server_packet_processor = nullptr,
62*61c4878aSAndroid Build Coastguard Worker       TestPacketProcessor&& client_packet_processor = nullptr)
63*61c4878aSAndroid Build Coastguard Worker       : FuzzerChannelOutputBase(std::move(server_packet_processor),
64*61c4878aSAndroid Build Coastguard Worker                                 std::move(client_packet_processor)) {}
65*61c4878aSAndroid Build Coastguard Worker };
66*61c4878aSAndroid Build Coastguard Worker 
67*61c4878aSAndroid Build Coastguard Worker using FuzzerContextBase =
68*61c4878aSAndroid Build Coastguard Worker     internal::ClientServerTestContextThreaded<FuzzerChannelOutput,
69*61c4878aSAndroid Build Coastguard Worker                                               kMaxPayloadSize,
70*61c4878aSAndroid Build Coastguard Worker                                               kMaxPackets,
71*61c4878aSAndroid Build Coastguard Worker                                               kMaxPayloadSize>;
72*61c4878aSAndroid Build Coastguard Worker class FuzzerContext : public FuzzerContextBase {
73*61c4878aSAndroid Build Coastguard Worker  public:
74*61c4878aSAndroid Build Coastguard Worker   static constexpr uint32_t kChannelId = 1;
75*61c4878aSAndroid Build Coastguard Worker 
FuzzerContext(TestPacketProcessor && server_packet_processor=nullptr,TestPacketProcessor && client_packet_processor=nullptr)76*61c4878aSAndroid Build Coastguard Worker   explicit FuzzerContext(
77*61c4878aSAndroid Build Coastguard Worker       TestPacketProcessor&& server_packet_processor = nullptr,
78*61c4878aSAndroid Build Coastguard Worker       TestPacketProcessor&& client_packet_processor = nullptr)
79*61c4878aSAndroid Build Coastguard Worker       // TODO: b/290860904 - Replace TestOptionsThread0 with TestThreadContext.
80*61c4878aSAndroid Build Coastguard Worker       : FuzzerContextBase(thread::test::TestOptionsThread0(),
81*61c4878aSAndroid Build Coastguard Worker                           std::move(server_packet_processor),
82*61c4878aSAndroid Build Coastguard Worker                           std::move(client_packet_processor)) {}
83*61c4878aSAndroid Build Coastguard Worker };
84*61c4878aSAndroid Build Coastguard Worker 
85*61c4878aSAndroid Build Coastguard Worker class RpcFuzzTestingTest : public testing::Test {
86*61c4878aSAndroid Build Coastguard Worker  protected:
SetUp()87*61c4878aSAndroid Build Coastguard Worker   void SetUp() override { context_.server().RegisterService(service_); }
88*61c4878aSAndroid Build Coastguard Worker 
Add(Action::Op op,size_t target,uint16_t value)89*61c4878aSAndroid Build Coastguard Worker   void Add(Action::Op op, size_t target, uint16_t value) {
90*61c4878aSAndroid Build Coastguard Worker     actions_.push_back(Action(op, target, value).Encode());
91*61c4878aSAndroid Build Coastguard Worker   }
92*61c4878aSAndroid Build Coastguard Worker 
Add(Action::Op op,size_t target,char val,size_t len)93*61c4878aSAndroid Build Coastguard Worker   void Add(Action::Op op, size_t target, char val, size_t len) {
94*61c4878aSAndroid Build Coastguard Worker     actions_.push_back(Action(op, target, val, len).Encode());
95*61c4878aSAndroid Build Coastguard Worker   }
96*61c4878aSAndroid Build Coastguard Worker 
NextThread()97*61c4878aSAndroid Build Coastguard Worker   void NextThread() { actions_.push_back(0); }
98*61c4878aSAndroid Build Coastguard Worker 
Run()99*61c4878aSAndroid Build Coastguard Worker   void Run() {
100*61c4878aSAndroid Build Coastguard Worker     Fuzzer fuzzer(context_.client(), FuzzerContext::kChannelId);
101*61c4878aSAndroid Build Coastguard Worker     fuzzer.set_verbose(true);
102*61c4878aSAndroid Build Coastguard Worker     fuzzer.set_timeout(kTimeout);
103*61c4878aSAndroid Build Coastguard Worker     fuzzer.Run(actions_);
104*61c4878aSAndroid Build Coastguard Worker   }
105*61c4878aSAndroid Build Coastguard Worker 
TearDown()106*61c4878aSAndroid Build Coastguard Worker   void TearDown() override { context_.server().UnregisterService(service_); }
107*61c4878aSAndroid Build Coastguard Worker 
108*61c4878aSAndroid Build Coastguard Worker  private:
109*61c4878aSAndroid Build Coastguard Worker   FuzzerContext context_;
110*61c4878aSAndroid Build Coastguard Worker   BenchmarkService service_;
111*61c4878aSAndroid Build Coastguard Worker   Vector<uint32_t, Fuzzer::kMaxActions> actions_;
112*61c4878aSAndroid Build Coastguard Worker };
113*61c4878aSAndroid Build Coastguard Worker 
114*61c4878aSAndroid Build Coastguard Worker // TODO: b/274437709 - Re-enable.
TEST_F(RpcFuzzTestingTest,DISABLED_SequentialRequests)115*61c4878aSAndroid Build Coastguard Worker TEST_F(RpcFuzzTestingTest, DISABLED_SequentialRequests) {
116*61c4878aSAndroid Build Coastguard Worker   // Callback thread
117*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWriteStream, 1, 'B', 1);
118*61c4878aSAndroid Build Coastguard Worker   Add(Action::kSkip, 0, 0);
119*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWriteStream, 2, 'B', 2);
120*61c4878aSAndroid Build Coastguard Worker   Add(Action::kSkip, 0, 0);
121*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWriteStream, 3, 'B', 3);
122*61c4878aSAndroid Build Coastguard Worker   Add(Action::kSkip, 0, 0);
123*61c4878aSAndroid Build Coastguard Worker   NextThread();
124*61c4878aSAndroid Build Coastguard Worker 
125*61c4878aSAndroid Build Coastguard Worker   // Thread 1
126*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWriteStream, 0, 'A', 2);
127*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 1, 0);
128*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWriteStream, 1, 'A', 4);
129*61c4878aSAndroid Build Coastguard Worker   NextThread();
130*61c4878aSAndroid Build Coastguard Worker 
131*61c4878aSAndroid Build Coastguard Worker   // Thread 2
132*61c4878aSAndroid Build Coastguard Worker   NextThread();
133*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 2, 0);
134*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWriteStream, 2, 'A', 6);
135*61c4878aSAndroid Build Coastguard Worker 
136*61c4878aSAndroid Build Coastguard Worker   // Thread 3
137*61c4878aSAndroid Build Coastguard Worker   NextThread();
138*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 3, 0);
139*61c4878aSAndroid Build Coastguard Worker 
140*61c4878aSAndroid Build Coastguard Worker   Run();
141*61c4878aSAndroid Build Coastguard Worker }
142*61c4878aSAndroid Build Coastguard Worker 
143*61c4878aSAndroid Build Coastguard Worker // TODO: b/274437709 - Re-enable.
TEST_F(RpcFuzzTestingTest,DISABLED_SimultaneousRequests)144*61c4878aSAndroid Build Coastguard Worker TEST_F(RpcFuzzTestingTest, DISABLED_SimultaneousRequests) {
145*61c4878aSAndroid Build Coastguard Worker   // Callback thread
146*61c4878aSAndroid Build Coastguard Worker   NextThread();
147*61c4878aSAndroid Build Coastguard Worker 
148*61c4878aSAndroid Build Coastguard Worker   // Thread 1
149*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWriteUnary, 1, 'A', 1);
150*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 2, 0);
151*61c4878aSAndroid Build Coastguard Worker   NextThread();
152*61c4878aSAndroid Build Coastguard Worker 
153*61c4878aSAndroid Build Coastguard Worker   // Thread 2
154*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWriteUnary, 2, 'B', 2);
155*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 3, 0);
156*61c4878aSAndroid Build Coastguard Worker   NextThread();
157*61c4878aSAndroid Build Coastguard Worker 
158*61c4878aSAndroid Build Coastguard Worker   // Thread 3
159*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWriteUnary, 3, 'C', 3);
160*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 1, 0);
161*61c4878aSAndroid Build Coastguard Worker   NextThread();
162*61c4878aSAndroid Build Coastguard Worker 
163*61c4878aSAndroid Build Coastguard Worker   Run();
164*61c4878aSAndroid Build Coastguard Worker }
165*61c4878aSAndroid Build Coastguard Worker 
166*61c4878aSAndroid Build Coastguard Worker // TODO: b/274437709 - This test currently does not pass as it exhausts the fake
167*61c4878aSAndroid Build Coastguard Worker // channel. It will be re-enabled when the underlying stream is swapped for
168*61c4878aSAndroid Build Coastguard Worker // a pw_ring_buffer-based approach.
TEST_F(RpcFuzzTestingTest,DISABLED_CanceledRequests)169*61c4878aSAndroid Build Coastguard Worker TEST_F(RpcFuzzTestingTest, DISABLED_CanceledRequests) {
170*61c4878aSAndroid Build Coastguard Worker   // Callback thread
171*61c4878aSAndroid Build Coastguard Worker   NextThread();
172*61c4878aSAndroid Build Coastguard Worker 
173*61c4878aSAndroid Build Coastguard Worker   // Thread 1
174*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 10; ++i) {
175*61c4878aSAndroid Build Coastguard Worker     Add(Action::kWriteUnary, i % 3, 'A', i);
176*61c4878aSAndroid Build Coastguard Worker   }
177*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 0, 0);
178*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 1, 0);
179*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 2, 0);
180*61c4878aSAndroid Build Coastguard Worker   NextThread();
181*61c4878aSAndroid Build Coastguard Worker 
182*61c4878aSAndroid Build Coastguard Worker   // Thread 2
183*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 10; ++i) {
184*61c4878aSAndroid Build Coastguard Worker     Add(Action::kCancel, i % 3, 0);
185*61c4878aSAndroid Build Coastguard Worker   }
186*61c4878aSAndroid Build Coastguard Worker   NextThread();
187*61c4878aSAndroid Build Coastguard Worker 
188*61c4878aSAndroid Build Coastguard Worker   // Thread 3
189*61c4878aSAndroid Build Coastguard Worker   NextThread();
190*61c4878aSAndroid Build Coastguard Worker 
191*61c4878aSAndroid Build Coastguard Worker   Run();
192*61c4878aSAndroid Build Coastguard Worker }
193*61c4878aSAndroid Build Coastguard Worker 
194*61c4878aSAndroid Build Coastguard Worker // TODO: b/274437709 - This test currently does not pass as it exhausts the fake
195*61c4878aSAndroid Build Coastguard Worker // channel. It will be re-enabled when the underlying stream is swapped for
196*61c4878aSAndroid Build Coastguard Worker // a pw_ring_buffer-based approach.
TEST_F(RpcFuzzTestingTest,DISABLED_AbandonedRequests)197*61c4878aSAndroid Build Coastguard Worker TEST_F(RpcFuzzTestingTest, DISABLED_AbandonedRequests) {
198*61c4878aSAndroid Build Coastguard Worker   // Callback thread
199*61c4878aSAndroid Build Coastguard Worker   NextThread();
200*61c4878aSAndroid Build Coastguard Worker 
201*61c4878aSAndroid Build Coastguard Worker   // Thread 1
202*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 10; ++i) {
203*61c4878aSAndroid Build Coastguard Worker     Add(Action::kWriteUnary, i % 3, 'A', i);
204*61c4878aSAndroid Build Coastguard Worker   }
205*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 0, 0);
206*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 1, 0);
207*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 2, 0);
208*61c4878aSAndroid Build Coastguard Worker   NextThread();
209*61c4878aSAndroid Build Coastguard Worker 
210*61c4878aSAndroid Build Coastguard Worker   // Thread 2
211*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 10; ++i) {
212*61c4878aSAndroid Build Coastguard Worker     Add(Action::kAbandon, i % 3, 0);
213*61c4878aSAndroid Build Coastguard Worker   }
214*61c4878aSAndroid Build Coastguard Worker   NextThread();
215*61c4878aSAndroid Build Coastguard Worker 
216*61c4878aSAndroid Build Coastguard Worker   // Thread 3
217*61c4878aSAndroid Build Coastguard Worker   NextThread();
218*61c4878aSAndroid Build Coastguard Worker 
219*61c4878aSAndroid Build Coastguard Worker   Run();
220*61c4878aSAndroid Build Coastguard Worker }
221*61c4878aSAndroid Build Coastguard Worker 
222*61c4878aSAndroid Build Coastguard Worker // TODO: b/274437709 - This test currently does not pass as it exhausts the fake
223*61c4878aSAndroid Build Coastguard Worker // channel. It will be re-enabled when the underlying stream is swapped for
224*61c4878aSAndroid Build Coastguard Worker // a pw_ring_buffer-based approach.
TEST_F(RpcFuzzTestingTest,DISABLED_SwappedRequests)225*61c4878aSAndroid Build Coastguard Worker TEST_F(RpcFuzzTestingTest, DISABLED_SwappedRequests) {
226*61c4878aSAndroid Build Coastguard Worker   Vector<uint32_t, Fuzzer::kMaxActions> actions;
227*61c4878aSAndroid Build Coastguard Worker   // Callback thread
228*61c4878aSAndroid Build Coastguard Worker   NextThread();
229*61c4878aSAndroid Build Coastguard Worker   // Thread 1
230*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 10; ++i) {
231*61c4878aSAndroid Build Coastguard Worker     Add(Action::kWriteUnary, i % 3, 'A', i);
232*61c4878aSAndroid Build Coastguard Worker   }
233*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 0, 0);
234*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 1, 0);
235*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 2, 0);
236*61c4878aSAndroid Build Coastguard Worker   NextThread();
237*61c4878aSAndroid Build Coastguard Worker   // Thread 2
238*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 100; ++i) {
239*61c4878aSAndroid Build Coastguard Worker     auto j = i % 3;
240*61c4878aSAndroid Build Coastguard Worker     Add(Action::kSwap, j, j + 1);
241*61c4878aSAndroid Build Coastguard Worker   }
242*61c4878aSAndroid Build Coastguard Worker   NextThread();
243*61c4878aSAndroid Build Coastguard Worker   // Thread 3
244*61c4878aSAndroid Build Coastguard Worker   NextThread();
245*61c4878aSAndroid Build Coastguard Worker 
246*61c4878aSAndroid Build Coastguard Worker   Run();
247*61c4878aSAndroid Build Coastguard Worker }
248*61c4878aSAndroid Build Coastguard Worker 
249*61c4878aSAndroid Build Coastguard Worker // TODO: b/274437709 - This test currently does not pass as it exhausts the fake
250*61c4878aSAndroid Build Coastguard Worker // channel. It will be re-enabled when the underlying stream is swapped for
251*61c4878aSAndroid Build Coastguard Worker // a pw_ring_buffer-based approach.
TEST_F(RpcFuzzTestingTest,DISABLED_DestroyedRequests)252*61c4878aSAndroid Build Coastguard Worker TEST_F(RpcFuzzTestingTest, DISABLED_DestroyedRequests) {
253*61c4878aSAndroid Build Coastguard Worker   // Callback thread
254*61c4878aSAndroid Build Coastguard Worker   NextThread();
255*61c4878aSAndroid Build Coastguard Worker 
256*61c4878aSAndroid Build Coastguard Worker   // Thread 1
257*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 100; ++i) {
258*61c4878aSAndroid Build Coastguard Worker     Add(Action::kWriteUnary, i % 3, 'A', i);
259*61c4878aSAndroid Build Coastguard Worker   }
260*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 0, 0);
261*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 1, 0);
262*61c4878aSAndroid Build Coastguard Worker   Add(Action::kWait, 2, 0);
263*61c4878aSAndroid Build Coastguard Worker   NextThread();
264*61c4878aSAndroid Build Coastguard Worker 
265*61c4878aSAndroid Build Coastguard Worker   // Thread 2
266*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 100; ++i) {
267*61c4878aSAndroid Build Coastguard Worker     Add(Action::kDestroy, i % 3, 0);
268*61c4878aSAndroid Build Coastguard Worker   }
269*61c4878aSAndroid Build Coastguard Worker   NextThread();
270*61c4878aSAndroid Build Coastguard Worker 
271*61c4878aSAndroid Build Coastguard Worker   // Thread 3
272*61c4878aSAndroid Build Coastguard Worker   NextThread();
273*61c4878aSAndroid Build Coastguard Worker 
274*61c4878aSAndroid Build Coastguard Worker   Run();
275*61c4878aSAndroid Build Coastguard Worker }
276*61c4878aSAndroid Build Coastguard Worker 
277*61c4878aSAndroid Build Coastguard Worker }  // namespace
278*61c4878aSAndroid Build Coastguard Worker }  // namespace pw::rpc::fuzz
279