Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Unified Diff: third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc

Issue 2718293003: scheduler: Ensure consistent delayed task ordering between task queues (Closed)
Patch Set: Review comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/platform/scheduler/base/time_domain.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc
diff --git a/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc
index c8b6acb109dd3a8c69641a95dda2ffb7d4cbbcc4..1c47328ee3da2aae8f1fdf7ae01d81c1de47b342 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc
@@ -94,7 +94,7 @@ TEST_F(TimeDomainTest, ScheduleDelayedWork) {
base::TimeTicks delayed_runtime = time_domain_->Now() + delay;
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime));
base::TimeTicks now = time_domain_->Now();
- time_domain_->ScheduleDelayedWork(task_queue_.get(), now + delay, now);
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay, 0}, now);
base::TimeTicks next_scheduled_runtime;
EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
@@ -115,7 +115,8 @@ TEST_F(TimeDomainTest, ScheduleDelayedWorkSupersedesPreviousWakeup) {
base::TimeTicks delayed_runtime2 = time_domain_->Now() + delay2;
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime1));
base::TimeTicks now = time_domain_->Now();
- time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime1, now);
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime1, 0},
+ now);
base::TimeTicks next_scheduled_runtime;
EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
@@ -126,7 +127,8 @@ TEST_F(TimeDomainTest, ScheduleDelayedWorkSupersedesPreviousWakeup) {
// Now scheduler a later wakeup, which should replace the previously requested
// one.
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime2));
- time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime2, now);
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime2, 0},
+ now);
EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
EXPECT_EQ(delayed_runtime2, next_scheduled_runtime);
@@ -159,19 +161,19 @@ TEST_F(TimeDomainTest, RequestWakeupAt_OnlyCalledForEarlierTasks) {
// RequestWakeupAt should always be called if there are no other wakeups.
base::TimeTicks now = time_domain_->Now();
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, now + delay1));
- time_domain_->ScheduleDelayedWork(task_queue_.get(), now + delay1, now);
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay1, 0}, now);
Mock::VerifyAndClearExpectations(time_domain_.get());
// RequestWakeupAt should not be called when scheduling later tasks.
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(0);
- time_domain_->ScheduleDelayedWork(task_queue2.get(), now + delay2, now);
- time_domain_->ScheduleDelayedWork(task_queue3.get(), now + delay3, now);
+ time_domain_->ScheduleDelayedWork(task_queue2.get(), {now + delay2, 0}, now);
+ time_domain_->ScheduleDelayedWork(task_queue3.get(), {now + delay3, 0}, now);
// RequestWakeupAt should be called when scheduling earlier tasks.
Mock::VerifyAndClearExpectations(time_domain_.get());
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, now + delay4));
- time_domain_->ScheduleDelayedWork(task_queue4.get(), now + delay4, now);
+ time_domain_->ScheduleDelayedWork(task_queue4.get(), {now + delay4, 0}, now);
Mock::VerifyAndClearExpectations(time_domain_.get());
@@ -191,9 +193,9 @@ TEST_F(TimeDomainTest, UnregisterQueue) {
base::TimeTicks now = time_domain_->Now();
base::TimeTicks wakeup1 = now + base::TimeDelta::FromMilliseconds(10);
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, wakeup1)).Times(1);
- time_domain_->ScheduleDelayedWork(task_queue_.get(), wakeup1, now);
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), {wakeup1, 0}, now);
base::TimeTicks wakeup2 = now + base::TimeDelta::FromMilliseconds(100);
- time_domain_->ScheduleDelayedWork(task_queue2_.get(), wakeup2, now);
+ time_domain_->ScheduleDelayedWork(task_queue2_.get(), {wakeup2, 0}, now);
TaskQueue* next_task_queue;
EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
@@ -222,7 +224,8 @@ TEST_F(TimeDomainTest, WakeupReadyDelayedQueues) {
base::TimeTicks now = time_domain_->Now();
base::TimeTicks delayed_runtime = now + delay;
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime));
- time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime, now);
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime, 0},
+ now);
base::TimeTicks next_run_time;
ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
@@ -239,12 +242,42 @@ TEST_F(TimeDomainTest, WakeupReadyDelayedQueues) {
ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time));
}
+TEST_F(TimeDomainTest, WakeupReadyDelayedQueuesWithIdenticalRuntimes) {
+ int sequence_num = 0;
+ base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50);
+ base::TimeTicks now = time_domain_->Now();
+ base::TimeTicks delayed_runtime = now + delay;
+ EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime));
+ EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(delayed_runtime));
+
+ scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr(
+ new internal::TaskQueueImpl(nullptr, time_domain_.get(),
+ TaskQueue::Spec(TaskQueue::QueueType::TEST),
+ "test.category", "test.category"));
+
+ time_domain_->ScheduleDelayedWork(task_queue2.get(),
+ {delayed_runtime, ++sequence_num}, now);
+ time_domain_->ScheduleDelayedWork(task_queue_.get(),
+ {delayed_runtime, ++sequence_num}, now);
+
+ LazyNow lazy_now = time_domain_->CreateLazyNow();
+ time_domain_->WakeupReadyDelayedQueues(&lazy_now);
+
+ // The second task queue should wake up first since it has a lower sequence
+ // number.
+ TaskQueue* next_task_queue;
+ EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
+ EXPECT_EQ(task_queue2.get(), next_task_queue);
+
+ task_queue2->UnregisterTaskQueue();
+}
+
TEST_F(TimeDomainTest, CancelDelayedWork) {
base::TimeTicks now = time_domain_->Now();
base::TimeTicks run_time = now + base::TimeDelta::FromMilliseconds(20);
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, run_time));
- time_domain_->ScheduleDelayedWork(task_queue_.get(), run_time, now);
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time, 0}, now);
TaskQueue* next_task_queue;
EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
@@ -265,11 +298,11 @@ TEST_F(TimeDomainTest, CancelDelayedWork_TwoQueues) {
base::TimeTicks run_time1 = now + base::TimeDelta::FromMilliseconds(20);
base::TimeTicks run_time2 = now + base::TimeDelta::FromMilliseconds(40);
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, run_time1));
- time_domain_->ScheduleDelayedWork(task_queue_.get(), run_time1, now);
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time1, 0}, now);
Mock::VerifyAndClearExpectations(time_domain_.get());
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(0);
- time_domain_->ScheduleDelayedWork(task_queue2.get(), run_time2, now);
+ time_domain_->ScheduleDelayedWork(task_queue2.get(), {run_time2, 0}, now);
Mock::VerifyAndClearExpectations(time_domain_.get());
TaskQueue* next_task_queue;
@@ -327,7 +360,7 @@ TEST_F(TimeDomainWithObserverTest, OnTimeDomainHasDelayedWork) {
EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _));
base::TimeTicks now = time_domain_->Now();
time_domain_->ScheduleDelayedWork(
- task_queue_.get(), now + base::TimeDelta::FromMilliseconds(10), now);
+ task_queue_.get(), {now + base::TimeDelta::FromMilliseconds(10), 0}, now);
}
} // namespace scheduler
« no previous file with comments | « third_party/WebKit/Source/platform/scheduler/base/time_domain.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698