| Index: base/timer/timer_unittest.cc
|
| diff --git a/base/timer/timer_unittest.cc b/base/timer/timer_unittest.cc
|
| index 1172110ce1faaf062a01e92c1792c108f734c414..35e4315ea46368b392fd7e861398ba0440eb8a79 100644
|
| --- a/base/timer/timer_unittest.cc
|
| +++ b/base/timer/timer_unittest.cc
|
| @@ -2,19 +2,14 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "base/bind_helpers.h"
|
| -#include "base/callback.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| -#include "base/test/sequenced_worker_pool_owner.h"
|
| #include "base/test/test_simple_task_runner.h"
|
| #include "base/timer/timer.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| -using base::DoNothing;
|
| -using base::SequencedTaskRunner;
|
| using base::TimeDelta;
|
| +using base::SingleThreadTaskRunner;
|
|
|
| namespace {
|
|
|
| @@ -42,7 +37,7 @@
|
| &OneShotTimerTester::Run);
|
| }
|
|
|
| - void SetTaskRunner(scoped_refptr<SequencedTaskRunner> task_runner) {
|
| + void SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner) {
|
| quit_message_loop_ = false;
|
| timer_.SetTaskRunner(task_runner);
|
| }
|
| @@ -533,201 +528,4 @@
|
| }
|
| }
|
|
|
| -const size_t kNumWorkerThreads = 3;
|
| -
|
| -// Fixture for tests requiring a worker pool. Includes a WaitableEvent so
|
| -// that cases may Wait() on one thread and Signal() (explicitly, or implicitly
|
| -// via helper methods) on another.
|
| -class TimerSequenceTest : public testing::Test {
|
| - public:
|
| - TimerSequenceTest()
|
| - : event_(false /* manual_reset */, false /* initially_signaled */) {}
|
| -
|
| - void SetUp() override { ResetPools(); }
|
| -
|
| - void TearDown() override {
|
| - pool1()->Shutdown();
|
| - pool2()->Shutdown();
|
| - }
|
| -
|
| - // Block until Signal() is called on another thread.
|
| - void Wait() { event_.Wait(); }
|
| -
|
| - void Signal() { event_.Signal(); }
|
| -
|
| - // Helper to augment a task with a subsequent call to Signal().
|
| - base::Closure TaskWithSignal(const base::Closure& task) {
|
| - return base::Bind(&TimerSequenceTest::RunTaskAndSignal,
|
| - base::Unretained(this), task);
|
| - }
|
| -
|
| - // Create the timer.
|
| - void CreateTimer() { timer_.reset(new base::OneShotTimer); }
|
| -
|
| - // Schedule an event on the timer.
|
| - void StartTimer(TimeDelta delay, const base::Closure& task) {
|
| - timer_->Start(FROM_HERE, delay, task);
|
| - }
|
| -
|
| - void SetTaskRunnerForTimer(SequencedTaskRunner* task_runner) {
|
| - timer_->SetTaskRunner(task_runner);
|
| - }
|
| -
|
| - // Tell the timer to abandon the task.
|
| - void AbandonTask() {
|
| - ASSERT_TRUE(timer_->IsRunning());
|
| - // Reset() to call Timer::AbandonScheduledTask()
|
| - timer_->Reset();
|
| - ASSERT_TRUE(timer_->IsRunning());
|
| - timer_->Stop();
|
| - ASSERT_FALSE(timer_->IsRunning());
|
| - }
|
| -
|
| - static void VerifyAffinity(SequencedTaskRunner* task_runner) {
|
| - ASSERT_TRUE(task_runner->RunsTasksOnCurrentThread());
|
| - }
|
| -
|
| - // Delete the timer.
|
| - void DeleteTimer() { timer_.reset(); }
|
| -
|
| - protected:
|
| - const scoped_refptr<base::SequencedWorkerPool>& pool1() {
|
| - return pool1_owner_->pool();
|
| - }
|
| - const scoped_refptr<base::SequencedWorkerPool>& pool2() {
|
| - return pool2_owner_->pool();
|
| - }
|
| -
|
| - // Destroys the SequencedWorkerPool instance, blocking until it is fully shut
|
| - // down, and creates a new instance.
|
| - void ResetPools() {
|
| - pool1_owner_.reset(
|
| - new base::SequencedWorkerPoolOwner(kNumWorkerThreads, "test1"));
|
| - pool2_owner_.reset(
|
| - new base::SequencedWorkerPoolOwner(kNumWorkerThreads, "test2"));
|
| - }
|
| -
|
| - private:
|
| - void RunTaskAndSignal(const base::Closure& task) {
|
| - task.Run();
|
| - Signal();
|
| - }
|
| -
|
| - base::WaitableEvent event_;
|
| -
|
| - base::MessageLoop message_loop_;
|
| - scoped_ptr<base::SequencedWorkerPoolOwner> pool1_owner_;
|
| - scoped_ptr<base::SequencedWorkerPoolOwner> pool2_owner_;
|
| -
|
| - scoped_ptr<base::OneShotTimer> timer_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TimerSequenceTest);
|
| -};
|
| -
|
| -TEST_F(TimerSequenceTest, OneShotTimerTaskOnPoolThread) {
|
| - scoped_refptr<SequencedTaskRunner> task_runner =
|
| - pool1()->GetSequencedTaskRunner(pool1()->GetSequenceToken());
|
| -
|
| - // Timer is created on this thread.
|
| - CreateTimer();
|
| -
|
| - // Task will execute on a pool thread.
|
| - SetTaskRunnerForTimer(task_runner.get());
|
| - StartTimer(TimeDelta::FromMilliseconds(1),
|
| - base::Bind(&TimerSequenceTest::Signal, base::Unretained(this)));
|
| - Wait();
|
| -
|
| - // Timer will be destroyed on this thread.
|
| - DeleteTimer();
|
| -}
|
| -
|
| -TEST_F(TimerSequenceTest, OneShotTimerUsedOnPoolThread) {
|
| - scoped_refptr<SequencedTaskRunner> task_runner =
|
| - pool1()->GetSequencedTaskRunner(pool1()->GetSequenceToken());
|
| -
|
| - // Timer is created on this thread.
|
| - CreateTimer();
|
| -
|
| - // Task will be scheduled from a pool thread.
|
| - task_runner->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &TimerSequenceTest::StartTimer, base::Unretained(this),
|
| - TimeDelta::FromMilliseconds(1),
|
| - base::Bind(&TimerSequenceTest::Signal, base::Unretained(this))));
|
| - Wait();
|
| -
|
| - // Timer must be destroyed on pool thread, too.
|
| - task_runner->PostTask(
|
| - FROM_HERE, TaskWithSignal(base::Bind(&TimerSequenceTest::DeleteTimer,
|
| - base::Unretained(this))));
|
| - Wait();
|
| -}
|
| -
|
| -TEST_F(TimerSequenceTest, OneShotTimerTwoPoolsAbandonTask) {
|
| - scoped_refptr<SequencedTaskRunner> task_runner1 =
|
| - pool1()->GetSequencedTaskRunner(pool1()->GetSequenceToken());
|
| - scoped_refptr<SequencedTaskRunner> task_runner2 =
|
| - pool2()->GetSequencedTaskRunner(pool2()->GetSequenceToken());
|
| -
|
| - // Create timer on pool #1.
|
| - task_runner1->PostTask(
|
| - FROM_HERE, TaskWithSignal(base::Bind(&TimerSequenceTest::CreateTimer,
|
| - base::Unretained(this))));
|
| - Wait();
|
| -
|
| - // Task will execute on a different pool (#2).
|
| - SetTaskRunnerForTimer(task_runner2.get());
|
| -
|
| - // Task will be scheduled from pool #1.
|
| - task_runner1->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&TimerSequenceTest::StartTimer, base::Unretained(this),
|
| - TimeDelta::FromHours(1), base::Bind(&DoNothing)));
|
| -
|
| - // Abandon task - must be called from scheduling pool (#1).
|
| - task_runner1->PostTask(
|
| - FROM_HERE, TaskWithSignal(base::Bind(&TimerSequenceTest::AbandonTask,
|
| - base::Unretained(this))));
|
| - Wait();
|
| -
|
| - // Timer must be destroyed on the pool it was scheduled from (#1).
|
| - task_runner1->PostTask(
|
| - FROM_HERE, TaskWithSignal(base::Bind(&TimerSequenceTest::DeleteTimer,
|
| - base::Unretained(this))));
|
| - Wait();
|
| -}
|
| -
|
| -TEST_F(TimerSequenceTest, OneShotTimerUsedAndTaskedOnDifferentPools) {
|
| - scoped_refptr<SequencedTaskRunner> task_runner1 =
|
| - pool1()->GetSequencedTaskRunner(pool1()->GetSequenceToken());
|
| - scoped_refptr<SequencedTaskRunner> task_runner2 =
|
| - pool2()->GetSequencedTaskRunner(pool2()->GetSequenceToken());
|
| -
|
| - // Create timer on pool #1.
|
| - task_runner1->PostTask(
|
| - FROM_HERE, TaskWithSignal(base::Bind(&TimerSequenceTest::CreateTimer,
|
| - base::Unretained(this))));
|
| - Wait();
|
| -
|
| - // Task will execute on a different pool (#2).
|
| - SetTaskRunnerForTimer(task_runner2.get());
|
| -
|
| - // Task will be scheduled from pool #1.
|
| - task_runner1->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&TimerSequenceTest::StartTimer, base::Unretained(this),
|
| - TimeDelta::FromMilliseconds(1),
|
| - TaskWithSignal(base::Bind(&TimerSequenceTest::VerifyAffinity,
|
| - task_runner2))));
|
| -
|
| - Wait();
|
| -
|
| - // Timer must be destroyed on the pool it was scheduled from (#1).
|
| - task_runner1->PostTask(
|
| - FROM_HERE, TaskWithSignal(base::Bind(&TimerSequenceTest::DeleteTimer,
|
| - base::Unretained(this))));
|
| - Wait();
|
| -}
|
| -
|
| } // namespace
|
|
|