| Index: components/scheduler/base/delayed_task_delegate_unittest.cc
|
| diff --git a/components/scheduler/base/delayed_task_delegate_unittest.cc b/components/scheduler/base/delayed_task_delegate_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..df25757bbaa4506a5ff4e97d60eefa6c474e97d0
|
| --- /dev/null
|
| +++ b/components/scheduler/base/delayed_task_delegate_unittest.cc
|
| @@ -0,0 +1,166 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/scheduler/base/delayed_task_delegate.h"
|
| +
|
| +#include "base/test/simple_test_tick_clock.h"
|
| +#include "cc/test/ordered_simple_task_runner.h"
|
| +#include "components/scheduler/base/task_queue_impl.h"
|
| +#include "components/scheduler/base/task_queue_manager.h"
|
| +#include "components/scheduler/base/task_queue_manager_delegate_for_test.h"
|
| +#include "components/scheduler/base/test_time_source.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +
|
| +using testing::_;
|
| +
|
| +namespace scheduler {
|
| +
|
| +class MockDelayedTaskDelegate : public DelayedTaskDelegate {
|
| + public:
|
| + MockDelayedTaskDelegate() : belongs_to_current_thread_(true) {}
|
| +
|
| + // TimeSource implementation:
|
| + base::TimeTicks CachedNow() override {
|
| + return now_;
|
| + }
|
| + void InvalidateNowCache() override {
|
| + }
|
| +
|
| + bool BelongsToCurrentThread() const override {
|
| + return belongs_to_current_thread_;
|
| + }
|
| +
|
| + MOCK_METHOD2(PostScheduleDelayedWorkTaskOnMainThread,
|
| + void(internal::TaskQueueImpl* queue,
|
| + base::TimeTicks delayed_run_time));
|
| + MOCK_METHOD1(ScheduleDoWork, void(base::TimeDelta delay));
|
| +
|
| + void SetNow(base::TimeTicks now) {
|
| + now_ = now;
|
| + }
|
| +
|
| + void SetBelongsToCurrentThread(bool belongs_to_current_thread) {
|
| + belongs_to_current_thread_ = belongs_to_current_thread;
|
| + }
|
| +
|
| + const DelayedWakeupMultimap& delayed_wakeup_multimap() const {
|
| + return delayed_wakeup_multimap_;
|
| + }
|
| +
|
| + private:
|
| + base::TimeTicks now_;
|
| + bool belongs_to_current_thread_;
|
| +
|
| + ~MockDelayedTaskDelegate() override {}
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MockDelayedTaskDelegate);
|
| +};
|
| +
|
| +class DelayedTaskDelegateTest : public testing::Test {
|
| + public:
|
| +
|
| + void SetUp() final {
|
| + delegate_= make_scoped_refptr(new MockDelayedTaskDelegate);
|
| + task_queue_ = make_scoped_refptr(
|
| + new internal::TaskQueueImpl(nullptr,
|
| + delegate_,
|
| + TaskQueue::Spec("test_queue"),
|
| + "test.category",
|
| + "test.category"));
|
| + }
|
| +
|
| + scoped_refptr<MockDelayedTaskDelegate> delegate_;
|
| + scoped_refptr<internal::TaskQueueImpl> task_queue_;
|
| +};
|
| +
|
| +TEST_F(DelayedTaskDelegateTest, ScheduleDelayedWork_SameThread) {
|
| + base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10);
|
| + base::TimeTicks delayed_runtime = delegate_->CachedNow() + delay;
|
| + EXPECT_CALL(*delegate_.get(), ScheduleDoWork(delay));
|
| + delegate_->ScheduleDelayedWork(task_queue_.get(),
|
| + delegate_->CachedNow() + delay);
|
| +
|
| + EXPECT_EQ(delayed_runtime,
|
| + delegate_->delayed_wakeup_multimap().begin()->first);
|
| + EXPECT_EQ(task_queue_.get(),
|
| + delegate_->delayed_wakeup_multimap().begin()->second);
|
| +}
|
| +
|
| +TEST_F(DelayedTaskDelegateTest, ScheduleDelayedWork_DifferentThread) {
|
| + delegate_->SetBelongsToCurrentThread(false);
|
| +
|
| + base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10);
|
| + base::TimeTicks delayed_runtime = delegate_->CachedNow() + delay;
|
| + EXPECT_CALL(*delegate_.get(),
|
| + PostScheduleDelayedWorkTaskOnMainThread(task_queue_.get(),
|
| + delayed_runtime));
|
| + delegate_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime);
|
| + EXPECT_TRUE(delegate_->delayed_wakeup_multimap().empty());
|
| +}
|
| +
|
| +TEST_F(DelayedTaskDelegateTest, CancelDelayedWork) {
|
| + scoped_refptr<internal::TaskQueueImpl> task_queue2_ =
|
| + make_scoped_refptr(
|
| + new internal::TaskQueueImpl(nullptr,
|
| + delegate_,
|
| + TaskQueue::Spec("test_queue2"),
|
| + "test.category",
|
| + "test.category"));
|
| +
|
| + EXPECT_CALL(*delegate_.get(), ScheduleDoWork(_)).Times(2);
|
| + delegate_->ScheduleDelayedWork(
|
| + task_queue_.get(),
|
| + delegate_->CachedNow() + base::TimeDelta::FromMilliseconds(10));
|
| + delegate_->ScheduleDelayedWork(
|
| + task_queue2_.get(),
|
| + delegate_->CachedNow() + base::TimeDelta::FromMilliseconds(100));
|
| +
|
| + EXPECT_EQ(task_queue_.get(),
|
| + delegate_->delayed_wakeup_multimap().begin()->second);
|
| +
|
| + delegate_->CancelDelayedWork(task_queue_.get());
|
| + EXPECT_EQ(task_queue2_.get(),
|
| + delegate_->delayed_wakeup_multimap().begin()->second);
|
| +
|
| + delegate_->CancelDelayedWork(task_queue2_.get());
|
| + EXPECT_TRUE(delegate_->delayed_wakeup_multimap().empty());
|
| +}
|
| +
|
| +TEST_F(DelayedTaskDelegateTest, WakeupReadyDelayedQueues) {
|
| + scoped_refptr<MockDelayedTaskDelegate> dummy_delegate(
|
| + new MockDelayedTaskDelegate);
|
| + base::SimpleTestTickClock dummy_time_source;
|
| + scoped_refptr<cc::OrderedSimpleTaskRunner> dummy_task_runner(
|
| + new cc::OrderedSimpleTaskRunner(&dummy_time_source, false));
|
| + TaskQueueManager task_queue_manager(
|
| + TaskQueueManagerDelegateForTest::Create(
|
| + dummy_task_runner,
|
| + make_scoped_ptr(new TestTimeSource(&dummy_time_source))),
|
| + "test.scheduler", "test.scheduler", "scheduler.debug");
|
| + scoped_refptr<internal::TaskQueueImpl> dummy_queue =
|
| + task_queue_manager.NewTaskQueue(TaskQueue::Spec("test_queue"));
|
| +
|
| + // Post a delayed task on |dummy_queue| and advance the queue's clock so that
|
| + // next time MoveReadyDelayedTasksToIncomingQueue is called, the task will
|
| + // get moved onto the incomming queue.
|
| + base::TimeDelta dummy_delay = base::TimeDelta::FromMilliseconds(10);
|
| + dummy_queue->PostDelayedTask(FROM_HERE, base::Closure(), dummy_delay);
|
| + dummy_time_source.Advance(dummy_delay);
|
| +
|
| + // Now we can test that WakeupReadyDelayedQueues triggers calls to
|
| + // MoveReadyDelayedTasksToIncomingQueue as expected.
|
| + base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50);
|
| + base::TimeTicks delayed_runtime = delegate_->CachedNow() + delay;
|
| + EXPECT_CALL(*delegate_.get(), ScheduleDoWork(delay));
|
| + delegate_->ScheduleDelayedWork(dummy_queue.get(), delayed_runtime);
|
| +
|
| + delegate_->WakeupReadyDelayedQueues();
|
| + EXPECT_EQ(0UL, dummy_queue->IncommingQueueSizeForTest());
|
| +
|
| + delegate_->SetNow(delayed_runtime);
|
| + delegate_->WakeupReadyDelayedQueues();
|
| + EXPECT_EQ(1UL, dummy_queue->IncommingQueueSizeForTest());
|
| +}
|
| +
|
| +} // namespace scheduler
|
|
|