xref: /aosp_15_r20/external/pigweed/pw_rpc/fuzz/client_fuzzer.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 // 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 // clang-format on
18*61c4878aSAndroid Build Coastguard Worker 
19*61c4878aSAndroid Build Coastguard Worker #include <cstring>
20*61c4878aSAndroid Build Coastguard Worker 
21*61c4878aSAndroid Build Coastguard Worker #include "pw_log/log.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/fuzz/argparse.h"
23*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/fuzz/engine.h"
24*61c4878aSAndroid Build Coastguard Worker #include "pw_rpc/integration_testing.h"
25*61c4878aSAndroid Build Coastguard Worker 
26*61c4878aSAndroid Build Coastguard Worker namespace pw::rpc::fuzz {
27*61c4878aSAndroid Build Coastguard Worker namespace {
28*61c4878aSAndroid Build Coastguard Worker 
FuzzClient(int argc,char ** argv)29*61c4878aSAndroid Build Coastguard Worker int FuzzClient(int argc, char** argv) {
30*61c4878aSAndroid Build Coastguard Worker   // TODO(aarongreen): Incorporate descriptions into usage message.
31*61c4878aSAndroid Build Coastguard Worker   Vector<ArgParserVariant, 5> parsers{
32*61c4878aSAndroid Build Coastguard Worker       // Enables additional logging.
33*61c4878aSAndroid Build Coastguard Worker       BoolParser("-v", "--verbose").set_default(false),
34*61c4878aSAndroid Build Coastguard Worker 
35*61c4878aSAndroid Build Coastguard Worker       // The number of actions to perform as part of the test. A value of 0 runs
36*61c4878aSAndroid Build Coastguard Worker       // indefinitely.
37*61c4878aSAndroid Build Coastguard Worker       UnsignedParser<size_t>("-n", "--num-actions").set_default(256),
38*61c4878aSAndroid Build Coastguard Worker 
39*61c4878aSAndroid Build Coastguard Worker       // The seed value for the PRNG. A value of 0 generates a seed.
40*61c4878aSAndroid Build Coastguard Worker       UnsignedParser<uint64_t>("-s", "--seed").set_default(0),
41*61c4878aSAndroid Build Coastguard Worker 
42*61c4878aSAndroid Build Coastguard Worker       // The time, in milliseconds, that can elapse without triggering an error.
43*61c4878aSAndroid Build Coastguard Worker       UnsignedParser<size_t>("-t", "--timeout").set_default(5000),
44*61c4878aSAndroid Build Coastguard Worker 
45*61c4878aSAndroid Build Coastguard Worker       // The port use to connect to the `test_rpc_server`.
46*61c4878aSAndroid Build Coastguard Worker       UnsignedParser<uint16_t>("port").set_default(48000)};
47*61c4878aSAndroid Build Coastguard Worker 
48*61c4878aSAndroid Build Coastguard Worker   if (!ParseArgs(parsers, argc, argv).ok()) {
49*61c4878aSAndroid Build Coastguard Worker     PrintUsage(parsers, argv[0]);
50*61c4878aSAndroid Build Coastguard Worker     return 1;
51*61c4878aSAndroid Build Coastguard Worker   }
52*61c4878aSAndroid Build Coastguard Worker 
53*61c4878aSAndroid Build Coastguard Worker   bool verbose;
54*61c4878aSAndroid Build Coastguard Worker   size_t num_actions;
55*61c4878aSAndroid Build Coastguard Worker   uint64_t seed;
56*61c4878aSAndroid Build Coastguard Worker   size_t timeout_ms;
57*61c4878aSAndroid Build Coastguard Worker   uint16_t port;
58*61c4878aSAndroid Build Coastguard Worker   if (!GetArg(parsers, "--verbose", &verbose).ok() ||
59*61c4878aSAndroid Build Coastguard Worker       !GetArg(parsers, "--num-actions", &num_actions).ok() ||
60*61c4878aSAndroid Build Coastguard Worker       !GetArg(parsers, "--seed", &seed).ok() ||
61*61c4878aSAndroid Build Coastguard Worker       !GetArg(parsers, "--timeout", &timeout_ms).ok() ||
62*61c4878aSAndroid Build Coastguard Worker       !GetArg(parsers, "port", &port).ok()) {
63*61c4878aSAndroid Build Coastguard Worker     return 1;
64*61c4878aSAndroid Build Coastguard Worker   }
65*61c4878aSAndroid Build Coastguard Worker 
66*61c4878aSAndroid Build Coastguard Worker   if (!seed) {
67*61c4878aSAndroid Build Coastguard Worker     seed = chrono::SystemClock::now().time_since_epoch().count();
68*61c4878aSAndroid Build Coastguard Worker   }
69*61c4878aSAndroid Build Coastguard Worker 
70*61c4878aSAndroid Build Coastguard Worker   if (auto status = integration_test::InitializeClient(port); !status.ok()) {
71*61c4878aSAndroid Build Coastguard Worker     PW_LOG_ERROR("Failed to initialize client: %s", pw_StatusString(status));
72*61c4878aSAndroid Build Coastguard Worker     return 1;
73*61c4878aSAndroid Build Coastguard Worker   }
74*61c4878aSAndroid Build Coastguard Worker 
75*61c4878aSAndroid Build Coastguard Worker   if (num_actions == 0) {
76*61c4878aSAndroid Build Coastguard Worker     num_actions = std::numeric_limits<size_t>::max();
77*61c4878aSAndroid Build Coastguard Worker   }
78*61c4878aSAndroid Build Coastguard Worker 
79*61c4878aSAndroid Build Coastguard Worker   Fuzzer fuzzer(integration_test::client(), integration_test::kChannelId);
80*61c4878aSAndroid Build Coastguard Worker   fuzzer.set_verbose(verbose);
81*61c4878aSAndroid Build Coastguard Worker   fuzzer.set_timeout(std::chrono::milliseconds(timeout_ms));
82*61c4878aSAndroid Build Coastguard Worker   fuzzer.Run(seed, num_actions);
83*61c4878aSAndroid Build Coastguard Worker   integration_test::TerminateClient();
84*61c4878aSAndroid Build Coastguard Worker   return 0;
85*61c4878aSAndroid Build Coastguard Worker }
86*61c4878aSAndroid Build Coastguard Worker 
87*61c4878aSAndroid Build Coastguard Worker }  // namespace
88*61c4878aSAndroid Build Coastguard Worker }  // namespace pw::rpc::fuzz
89*61c4878aSAndroid Build Coastguard Worker 
main(int argc,char ** argv)90*61c4878aSAndroid Build Coastguard Worker int main(int argc, char** argv) {
91*61c4878aSAndroid Build Coastguard Worker   return pw::rpc::fuzz::FuzzClient(argc, argv);
92*61c4878aSAndroid Build Coastguard Worker }
93