49TEST(TaskRunnerTest, MaybeExecuteTaskWithExactOrder) {
50 std::vector<uint64_t> executed_task_order;
52 MockTaskRunner(MockGetCurrentTime,
53 [&executed_task_order](
const FlutterTask* expired_task) {
54 executed_task_order.push_back(expired_task->
task);
57 uint64_t time_now = MockGetCurrentTime();
59 runner.PostFlutterTask(
FlutterTask{
nullptr, 1}, time_now);
60 runner.PostFlutterTask(
FlutterTask{
nullptr, 2}, time_now);
62 [&executed_task_order]() { executed_task_order.push_back(3); });
64 [&executed_task_order]() { executed_task_order.push_back(4); });
66 runner.SimulateTimerAwake();
68 std::vector<uint64_t> posted_task_order{1, 2, 3, 4};
69 EXPECT_EQ(executed_task_order, posted_task_order);
72TEST(TaskRunnerTest, MaybeExecuteTaskOnlyExpired) {
73 std::set<uint64_t> executed_task;
74 auto runner = MockTaskRunner(
75 MockGetCurrentTime, [&executed_task](
const FlutterTask* expired_task) {
76 executed_task.insert(expired_task->
task);
79 uint64_t task_expired_before_now = 1;
80 uint64_t time_before_now = 0;
81 runner.PostFlutterTask(
FlutterTask{
nullptr, task_expired_before_now},
84 uint64_t task_expired_after_now = 2;
85 uint64_t time_after_now = MockGetCurrentTime() * 2;
86 runner.PostFlutterTask(
FlutterTask{
nullptr, task_expired_after_now},
89 runner.SimulateTimerAwake();
91 std::set<uint64_t> only_task_expired_before_now{task_expired_before_now};
92 EXPECT_EQ(executed_task, only_task_expired_before_now);
95TEST(TaskRunnerTest, TimerThreadDoesNotCancelEarlierScheduledTasks) {
96 std::atomic_bool signaled =
false;
97 std::optional<std::chrono::high_resolution_clock::time_point> callback_time;
99 callback_time = std::chrono::high_resolution_clock::now();
102 timer_thread.
Start();
103 auto now = std::chrono::high_resolution_clock::now();
106 timer_thread.ScheduleAt(now + std::chrono::milliseconds(20));
107 timer_thread.ScheduleAt(now + std::chrono::seconds(10));
109 while (!signaled.load()) {
110 std::this_thread::sleep_for(std::chrono::milliseconds(5));
113 EXPECT_TRUE(callback_time.has_value());
114 EXPECT_GE(*callback_time, now + std::chrono::milliseconds(20));
124TEST(TaskRunnerTest, TaskRunnerWindowCoalescesWakeUpMessages) {
129 std::chrono::nanoseconds ProcessTasks()
override {
130 process_tasks_call_count_++;
131 return std::chrono::nanoseconds::max();
134 int process_tasks_call_count_ = 0;
146 while (PeekMessage(&msg,
nullptr, 0, 0, PM_REMOVE)) {
147 TranslateMessage(&msg);
151 EXPECT_EQ(delegate.process_tasks_call_count_, 1);