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

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

Issue 2359493002: Prevent redundant DoWorks due to canceled delayed tasks (v2) (Closed)
Patch Set: Changes for Sami Created 4 years, 3 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
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 610b95b304f5838222707ad1153108d352959a3d..80db099be1699e5be41e9546bbb2afeb3e531fe3 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
@@ -30,8 +30,6 @@ class MockTimeDomain : public TimeDomain {
~MockTimeDomain() override {}
- using TimeDomain::CancelDelayedWork;
- using TimeDomain::ClearExpiredWakeups;
using TimeDomain::NextScheduledRunTime;
using TimeDomain::NextScheduledTaskQueue;
using TimeDomain::ScheduleDelayedWork;
@@ -99,7 +97,46 @@ TEST_F(TimeDomainTest, ScheduleDelayedWork) {
EXPECT_EQ(task_queue_.get(), next_task_queue);
}
+TEST_F(TimeDomainTest, ScheduleDelayedWorkSupersedesPreviousWakeup) {
+ base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10);
+ base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(100);
+ base::TimeTicks delayed_runtime1 = time_domain_->Now() + delay1;
+ base::TimeTicks delayed_runtime2 = time_domain_->Now() + delay2;
+ EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay1));
+ base::TimeTicks now = time_domain_->Now();
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime1, now);
+
+ base::TimeTicks next_scheduled_runtime;
+ EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
+ EXPECT_EQ(delayed_runtime1, next_scheduled_runtime);
+
+ Mock::VerifyAndClearExpectations(time_domain_.get());
+
+ // Now scheduler a later wakeup, which should replace the previously requested
+ // one.
+ EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay2));
+ time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime2, now);
+
+ EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
+ EXPECT_EQ(delayed_runtime2, next_scheduled_runtime);
+}
+
TEST_F(TimeDomainTest, RequestWakeup_OnlyCalledForEarlierTasks) {
+ scoped_refptr<internal::TaskQueueImpl> task_queue2 =
+ make_scoped_refptr(new internal::TaskQueueImpl(
+ nullptr, time_domain_.get(), TaskQueue::Spec("test_queue2"),
+ "test.category", "test.category"));
+
+ scoped_refptr<internal::TaskQueueImpl> task_queue3 =
+ make_scoped_refptr(new internal::TaskQueueImpl(
+ nullptr, time_domain_.get(), TaskQueue::Spec("test_queue3"),
+ "test.category", "test.category"));
+
+ scoped_refptr<internal::TaskQueueImpl> task_queue4 =
+ make_scoped_refptr(new internal::TaskQueueImpl(
+ nullptr, time_domain_.get(), TaskQueue::Spec("test_queue4"),
+ "test.category", "test.category"));
+
base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10);
base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20);
base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(30);
@@ -114,13 +151,13 @@ TEST_F(TimeDomainTest, RequestWakeup_OnlyCalledForEarlierTasks) {
// RequestWakeup should not be called when scheduling later tasks.
EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, _)).Times(0);
- time_domain_->ScheduleDelayedWork(task_queue_.get(), now + delay2, now);
- time_domain_->ScheduleDelayedWork(task_queue_.get(), now + delay3, now);
+ time_domain_->ScheduleDelayedWork(task_queue2.get(), now + delay2, now);
+ time_domain_->ScheduleDelayedWork(task_queue3.get(), now + delay3, now);
// RequestWakeup should be called when scheduling earlier tasks.
Mock::VerifyAndClearExpectations(time_domain_.get());
EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay4));
- time_domain_->ScheduleDelayedWork(task_queue_.get(), now + delay4, now);
+ time_domain_->ScheduleDelayedWork(task_queue4.get(), now + delay4, now);
}
TEST_F(TimeDomainTest, UnregisterQueue) {
@@ -171,109 +208,6 @@ TEST_F(TimeDomainTest, UpdateWorkQueues) {
ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time));
}
-TEST_F(TimeDomainTest, ClearExpiredWakeups) {
- base::TimeTicks now = time_domain_->Now();
- base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10);
- base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20);
- base::TimeTicks run_time1 = now + delay1;
- base::TimeTicks run_time2 = now + delay2;
-
- EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, _)).Times(AnyNumber());
- time_domain_->ScheduleDelayedWork(task_queue_.get(), run_time1, now);
- time_domain_->ScheduleDelayedWork(task_queue_.get(), run_time2, now);
-
- base::TimeTicks next_run_time;
- ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
- EXPECT_EQ(run_time1, next_run_time);
-
- time_domain_->SetNow(run_time1);
- time_domain_->ClearExpiredWakeups();
-
- ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
- EXPECT_EQ(run_time2, next_run_time);
-
- time_domain_->SetNow(run_time2);
- time_domain_->ClearExpiredWakeups();
- ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time));
-}
-
-TEST_F(TimeDomainTest, CancelDelayedWork) {
- base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50);
- EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay));
- base::TimeTicks now = time_domain_->Now();
- base::TimeTicks delayed_runtime = now + delay;
- time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime, now);
-
- base::TimeTicks next_run_time;
- ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
- EXPECT_EQ(delayed_runtime, next_run_time);
-
- time_domain_->CancelDelayedWork(task_queue_.get(), delayed_runtime);
- EXPECT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time));
-}
-
-TEST_F(TimeDomainTest, CancelDelayedWorkTaskQueueDoesntMatch) {
- base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50);
- EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay));
- base::TimeTicks now = time_domain_->Now();
- base::TimeTicks delayed_runtime = now + delay;
- time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime, now);
-
- base::TimeTicks next_run_time;
- ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
- EXPECT_EQ(delayed_runtime, next_run_time);
-
- time_domain_->CancelDelayedWork(nullptr, delayed_runtime);
- ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
- EXPECT_EQ(delayed_runtime, next_run_time);
-}
-
-TEST_F(TimeDomainTest, CancelDelayedWorkTwoWakeUpsCancelFirst) {
- base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(50);
- base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(150);
- EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay1));
- base::TimeTicks now = time_domain_->Now();
- base::TimeTicks delayed_runtime1 = now + delay1;
- base::TimeTicks delayed_runtime2 = now + delay2;
- time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime1, now);
- time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime2, now);
-
- base::TimeTicks next_run_time;
- ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
- EXPECT_EQ(delayed_runtime1, next_run_time);
- Mock::VerifyAndClearExpectations(time_domain_.get());
-
- EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay2));
- time_domain_->CancelDelayedWork(task_queue_.get(), delayed_runtime1);
- ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
- EXPECT_EQ(delayed_runtime2, next_run_time);
-}
-
-TEST_F(TimeDomainTest, CancelDelayedWorkTwoWakeUpsCancelSecond) {
- base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(50);
- base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(150);
- EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay1));
- base::TimeTicks now = time_domain_->Now();
- base::TimeTicks delayed_runtime1 = now + delay1;
- base::TimeTicks delayed_runtime2 = now + delay2;
- time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime1, now);
- time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime2, now);
-
- base::TimeTicks next_run_time;
- ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
- EXPECT_EQ(delayed_runtime1, next_run_time);
- Mock::VerifyAndClearExpectations(time_domain_.get());
-
- time_domain_->CancelDelayedWork(task_queue_.get(), delayed_runtime2);
- ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
- EXPECT_EQ(delayed_runtime1, next_run_time);
-
- time_domain_->SetNow(delayed_runtime1);
- LazyNow lazy_now = time_domain_->CreateLazyNow();
- time_domain_->UpdateWorkQueues(lazy_now);
- ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time));
-}
-
namespace {
class MockObserver : public TimeDomain::Observer {
public:

Powered by Google App Engine
This is Rietveld 408576698