16 #include <sys/types.h>
24 #include "absl/strings/str_cat.h"
25 #include "absl/types/optional.h"
38 #include "src/libfuzzer/libfuzzer_macro.h"
40 #include "test/core/resource_quota/memory_quota_fuzzer.pb.h"
48 ReclamationPass MapReclamationPass(memory_quota_fuzzer::Reclaimer::Pass pass) {
50 case memory_quota_fuzzer::Reclaimer::BENIGN:
52 case memory_quota_fuzzer::Reclaimer::IDLE:
54 case memory_quota_fuzzer::Reclaimer::DESTRUCTIVE:
63 void Run(
const memory_quota_fuzzer::Msg&
msg) {
76 void RunMsg(
const memory_quota_fuzzer::Msg&
msg) {
77 for (
int i = 0;
i <
msg.actions_size(); ++
i) {
79 switch (
action.action_type_case()) {
80 case memory_quota_fuzzer::Action::kFlushExecCtx:
83 case memory_quota_fuzzer::Action::kCreateQuota:
87 case memory_quota_fuzzer::Action::kDeleteQuota:
90 case memory_quota_fuzzer::Action::kCreateAllocator:
92 memory_allocators_.emplace(
94 q->CreateMemoryOwner(absl::StrCat(
"allocator-step-", i)));
97 case memory_quota_fuzzer::Action::kDeleteAllocator:
100 case memory_quota_fuzzer::Action::kSetQuotaSize:
102 q->SetSize(Clamp(action.set_quota_size(), uint64_t{0},
103 uint64_t{std::numeric_limits<ssize_t>::max()}));
106 case memory_quota_fuzzer::Action::kCreateAllocation: {
107 auto min =
action.create_allocation().min();
108 auto max =
action.create_allocation().max();
114 auto alloc = a->MakeReservation(req);
115 allocations_.emplace(action.allocation(), std::move(alloc));
118 case memory_quota_fuzzer::Action::kDeleteAllocation:
121 case memory_quota_fuzzer::Action::kPostReclaimer: {
123 auto cfg =
action.post_reclaimer();
124 if (cfg.synchronous()) {
132 memory_quota_fuzzer::Msg
msg;
145 auto pass = MapReclamationPass(cfg.pass());
147 action.allocator(), [pass, reclaimer](MemoryOwner*
a) {
149 auto call_checker = CallChecker::MakeOptional();
150 a->PostReclaimer(pass,
151 [reclaimer, call_checker](
152 absl::optional<ReclamationSweep> sweep) {
153 call_checker->Called();
154 reclaimer(std::move(sweep));
159 case memory_quota_fuzzer::Action::ACTION_TYPE_NOT_SET:
165 template <
typename F>
166 void WithQuota(
int quota,
F f) {
172 template <
typename F>
173 void WithAllocator(
int allocator,
F f) {
194 grpc_core::testing::Fuzzer().Run(
msg);