22 #include "absl/status/status.h"
23 #include "absl/types/optional.h"
24 #include "absl/utility/utility.h"
36 #include "src/libfuzzer/libfuzzer_macro.h"
37 #include "test/core/promise/promise_fuzzer.pb.h"
54 void Run(
const promise_fuzzer::Msg&
msg) {
56 if (!
msg.has_promise()) {
62 return Seq(MakePromise(
msg.promise()),
63 [] { return absl::OkStatus(); });
80 switch (
action.action_type_case()) {
82 case promise_fuzzer::Action::kForceWakeup:
86 case promise_fuzzer::Action::kCancel:
91 case promise_fuzzer::Action::kFlushWakeup:
95 case promise_fuzzer::Action::kDropWaker: {
102 case promise_fuzzer::Action::kAwakeWaker: {
111 case promise_fuzzer::Action::ACTION_TYPE_NOT_SET:
126 template <
typename ActivityType>
127 void ScheduleWakeup(ActivityType* activity) {
130 fuzzer->wakeup_ = [activity]() { activity->RunScheduledWakeup(); };
136 void ExpectCancelled() {
143 PromiseFactory<IntHdl> MakePromiseFactory(
145 switch (
p.promise_factory_type_case()) {
146 case promise_fuzzer::PromiseFactory::kPromise:
147 return [
p,
this](
IntHdl) {
return MakePromise(
p.promise()); };
148 case promise_fuzzer::PromiseFactory::kLast:
149 return [](
IntHdl h) {
return [
h]() {
return h; }; };
150 case promise_fuzzer::PromiseFactory::PROMISE_FACTORY_TYPE_NOT_SET:
154 return []() -> Poll<IntHdl> {
return std::make_shared<int>(42); };
160 switch (
p.promise_type_case()) {
161 case promise_fuzzer::Promise::kSeq:
162 switch (
p.seq().promise_factories_size()) {
164 return Seq(MakePromise(
p.seq().first()),
165 MakePromiseFactory(
p.seq().promise_factories(0)));
167 return Seq(MakePromise(
p.seq().first()),
168 MakePromiseFactory(
p.seq().promise_factories(0)),
169 MakePromiseFactory(
p.seq().promise_factories(1)));
171 return Seq(MakePromise(
p.seq().first()),
172 MakePromiseFactory(
p.seq().promise_factories(0)),
173 MakePromiseFactory(
p.seq().promise_factories(1)),
174 MakePromiseFactory(
p.seq().promise_factories(2)));
176 return Seq(MakePromise(
p.seq().first()),
177 MakePromiseFactory(
p.seq().promise_factories(0)),
178 MakePromiseFactory(
p.seq().promise_factories(1)),
179 MakePromiseFactory(
p.seq().promise_factories(2)),
180 MakePromiseFactory(
p.seq().promise_factories(3)));
182 return Seq(MakePromise(
p.seq().first()),
183 MakePromiseFactory(
p.seq().promise_factories(0)),
184 MakePromiseFactory(
p.seq().promise_factories(1)),
185 MakePromiseFactory(
p.seq().promise_factories(2)),
186 MakePromiseFactory(
p.seq().promise_factories(3)),
187 MakePromiseFactory(
p.seq().promise_factories(4)));
189 return Seq(MakePromise(
p.seq().first()),
190 MakePromiseFactory(
p.seq().promise_factories(0)),
191 MakePromiseFactory(
p.seq().promise_factories(1)),
192 MakePromiseFactory(
p.seq().promise_factories(2)),
193 MakePromiseFactory(
p.seq().promise_factories(3)),
194 MakePromiseFactory(
p.seq().promise_factories(4)),
195 MakePromiseFactory(
p.seq().promise_factories(5)));
198 case promise_fuzzer::Promise::kJoin:
199 switch (
p.join().promises_size()) {
201 return Map(
Join(MakePromise(
p.join().promises(0))),
202 [](std::tuple<IntHdl> t) { return std::get<0>(t); });
205 Join(MakePromise(
p.join().promises(0)),
206 MakePromise(
p.join().promises(1))),
207 [](std::tuple<IntHdl, IntHdl> t) { return std::get<0>(t); });
209 return Map(
Join(MakePromise(
p.join().promises(0)),
210 MakePromise(
p.join().promises(1)),
211 MakePromise(
p.join().promises(2))),
212 [](std::tuple<IntHdl, IntHdl, IntHdl> t) {
213 return std::get<0>(t);
216 return Map(
Join(MakePromise(
p.join().promises(0)),
217 MakePromise(
p.join().promises(1)),
218 MakePromise(
p.join().promises(2)),
219 MakePromise(
p.join().promises(3))),
220 [](std::tuple<IntHdl, IntHdl, IntHdl, IntHdl> t) {
221 return std::get<0>(t);
225 Join(MakePromise(
p.join().promises(0)),
226 MakePromise(
p.join().promises(1)),
227 MakePromise(
p.join().promises(2)),
228 MakePromise(
p.join().promises(3)),
229 MakePromise(
p.join().promises(4))),
230 [](std::tuple<IntHdl, IntHdl, IntHdl, IntHdl, IntHdl> t) {
231 return std::get<0>(t);
235 Join(MakePromise(
p.join().promises(0)),
236 MakePromise(
p.join().promises(1)),
237 MakePromise(
p.join().promises(2)),
238 MakePromise(
p.join().promises(3)),
239 MakePromise(
p.join().promises(4)),
240 MakePromise(
p.join().promises(5))),
241 [](std::tuple<IntHdl, IntHdl, IntHdl, IntHdl, IntHdl, IntHdl>
242 t) { return std::get<0>(t); });
245 case promise_fuzzer::Promise::kRace:
246 switch (
p.race().promises_size()) {
248 return Race(MakePromise(
p.race().promises(0)));
250 return Race(MakePromise(
p.race().promises(0)),
251 MakePromise(
p.race().promises(1)));
253 return Race(MakePromise(
p.race().promises(0)),
254 MakePromise(
p.race().promises(1)),
255 MakePromise(
p.race().promises(2)));
257 return Race(MakePromise(
p.race().promises(0)),
258 MakePromise(
p.race().promises(1)),
259 MakePromise(
p.race().promises(2)),
260 MakePromise(
p.race().promises(3)));
262 return Race(MakePromise(
p.race().promises(0)),
263 MakePromise(
p.race().promises(1)),
264 MakePromise(
p.race().promises(2)),
265 MakePromise(
p.race().promises(3)),
266 MakePromise(
p.race().promises(4)));
268 return Race(MakePromise(
p.race().promises(0)),
269 MakePromise(
p.race().promises(1)),
270 MakePromise(
p.race().promises(2)),
271 MakePromise(
p.race().promises(3)),
272 MakePromise(
p.race().promises(4)),
273 MakePromise(
p.race().promises(5)));
276 case promise_fuzzer::Promise::kNever:
277 return Never<IntHdl>();
278 case promise_fuzzer::Promise::kSleepFirstN: {
279 int n =
p.sleep_first_n();
280 return [
n]()
mutable -> Poll<IntHdl> {
281 if (n <= 0)
return std::make_shared<int>(0);
286 case promise_fuzzer::Promise::kCancelFromInside:
287 return [
this]() -> Poll<IntHdl> {
291 case promise_fuzzer::Promise::kWaitOnceOnWaker: {
293 auto config =
p.wait_once_on_waker();
294 return [
this,
config, called]()
mutable -> Poll<IntHdl> {
305 return std::make_shared<int>(3);
308 case promise_fuzzer::Promise::PromiseTypeCase::PROMISE_TYPE_NOT_SET:
311 return [] {
return std::make_shared<int>(42); };