24 #include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h"
29 namespace experimental {
32 const intptr_t kTaskHandleSalt = 12345;
33 FuzzingEventEngine* g_fuzzing_event_engine =
nullptr;
38 : final_tick_length_(
options.final_tick_length) {
40 g_fuzzing_event_engine =
this;
44 tick_increments_.clear();
47 tasks_by_time_.clear();
59 auto update_delay = [](std::map<intptr_t, Duration>*
map,
61 auto&
value = (*map)[delay.id()];
66 Duration add = std::chrono::microseconds(delay.delay_us());
74 for (
const auto& delay : actions.tick_lengths()) {
75 update_delay(&tick_increments_, delay, std::chrono::hours(24));
77 for (
const auto& delay : actions.run_delay()) {
84 tick_increments_.clear();
89 g_fuzzing_event_engine =
nullptr;
96 const Duration d = now_.time_since_epoch();
97 auto secs = std::chrono::duration_cast<std::chrono::seconds>(d);
98 return {secs.count(),
static_cast<int32_t>((d - secs).
count()), clock_type};
102 GPR_ASSERT(g_fuzzing_event_engine !=
nullptr);
104 return g_fuzzing_event_engine->NowAsTimespec(clock_type);
112 auto tick_it = tick_increments_.find(current_tick_);
113 if (tick_it != tick_increments_.end()) {
114 now_ += tick_it->second;
115 GPR_ASSERT(now_.time_since_epoch().count() >= 0);
116 tick_increments_.erase(tick_it);
117 }
else if (tick_increments_.empty()) {
119 GPR_ASSERT(now_.time_since_epoch().count() >= 0);
123 while (!tasks_by_time_.empty() && tasks_by_time_.begin()->first <= now_) {
124 tasks_by_id_.erase(tasks_by_time_.begin()->second->id);
125 to_run.push_back(
std::move(tasks_by_time_.begin()->second->closure));
126 tasks_by_time_.erase(tasks_by_time_.begin());
143 std::unique_ptr<MemoryAllocatorFactory>) {
158 const DNSResolver::ResolverOptions&) {
180 const auto delay_it = task_delays_.find(
id);
182 if (delay_it != task_delays_.end()) {
183 when += delay_it->second;
184 task_delays_.erase(delay_it);
187 tasks_by_id_.emplace(
id, task);
188 tasks_by_time_.emplace(now_ + when,
std::move(task));
196 auto it = tasks_by_id_.find(
id);
197 if (
it == tasks_by_id_.end()) {
200 if (
it->second ==
nullptr) {
203 it->second =
nullptr;