summaryrefslogtreecommitdiffstats
path: root/base/sequence_checker_impl_unittest.cc
diff options
context:
space:
mode:
authortommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-26 14:23:56 +0000
committertommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-26 14:23:56 +0000
commit5c0b44355d76bc88064b1363fe1591668b536da5 (patch)
tree40ad7a3881c473a356dc8b7653b2420fb49f22e2 /base/sequence_checker_impl_unittest.cc
parent7a4fa4725a1b557b178c8053c5c7dd7ea8db9141 (diff)
downloadchromium_src-5c0b44355d76bc88064b1363fe1591668b536da5.zip
chromium_src-5c0b44355d76bc88064b1363fe1591668b536da5.tar.gz
chromium_src-5c0b44355d76bc88064b1363fe1591668b536da5.tar.bz2
base: Re-apply WeakPtr support for SequencedWorkerPools, fixing deadlock
This reverts the revert found here: https://codereview.chromium.org/19882002 It also fixes the deadlock that caused the revert, reported here: http://crbug.com/261448 Patchset 1 is simply what was originally committed (and reverted). Subsequent patchsets show the fix of the deadlock problem. BUG=165590 TBR=darin Review URL: https://chromiumcodereview.appspot.com/20163004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@213906 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/sequence_checker_impl_unittest.cc')
-rw-r--r--base/sequence_checker_impl_unittest.cc218
1 files changed, 0 insertions, 218 deletions
diff --git a/base/sequence_checker_impl_unittest.cc b/base/sequence_checker_impl_unittest.cc
deleted file mode 100644
index b05da11..0000000
--- a/base/sequence_checker_impl_unittest.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2013 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 "base/sequence_checker_impl.h"
-
-#include <cstddef>
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/location.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/sequenced_task_runner.h"
-#include "base/threading/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// Implementation of SequencedTaskRunner that lets us control what
-// RunsTasksOnCurrentThread() returns.
-class FakeTaskRunner : public SequencedTaskRunner {
- public:
- FakeTaskRunner() : runs_tasks_on_current_thread_(false) {}
-
- void SetRunsTasksOnCurrentThread(bool runs_tasks_on_current_thread) {
- runs_tasks_on_current_thread_ = runs_tasks_on_current_thread;
- }
-
- // SequencedTaskRunner implementation.
- virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
- const Closure& task,
- TimeDelta delay) OVERRIDE {
- ADD_FAILURE();
- return false;
- }
-
- virtual bool PostNonNestableDelayedTask(
- const tracked_objects::Location& from_here,
- const Closure& task,
- TimeDelta delay) OVERRIDE {
- ADD_FAILURE();
- return false;
- }
-
- virtual bool RunsTasksOnCurrentThread() const OVERRIDE {
- return runs_tasks_on_current_thread_;
- }
-
- protected:
- virtual ~FakeTaskRunner() {}
-
- private:
- bool runs_tasks_on_current_thread_;
-};
-
-class SequenceCheckerImplTest : public ::testing::Test {
-};
-
-// Create a SequenceCheckerImpl with a SequencedTaskRunner and make
-// sure that CalledOnValidSequence() returns what that SequencedTaskRunner
-// returns for RunsTasksOnCurrentThread().
-TEST_F(SequenceCheckerImplTest, CalledOnValidSequenceNonNull) {
- const scoped_refptr<FakeTaskRunner> fake_sequenced_task_runner(
- new FakeTaskRunner());
-
- const SequenceCheckerImpl sequence_checker_impl(fake_sequenced_task_runner);
- EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
-
- fake_sequenced_task_runner->SetRunsTasksOnCurrentThread(true);
- EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
-
- fake_sequenced_task_runner->SetRunsTasksOnCurrentThread(false);
- EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
-}
-
-void ExpectCalledOnValidSequence(
- const tracked_objects::Location& location,
- const SequenceCheckerImpl* sequence_checker_impl,
- bool expected_value) {
- EXPECT_EQ(expected_value, sequence_checker_impl->CalledOnValidSequence())
- << location.ToString();
-}
-
-// Create a SequenceCheckerImpl with no SequencedTaskRunner and make
-// sure that CalledOnValidSequence() behaves like
-// ThreadChecker::CalledOnValidThread().
-TEST_F(SequenceCheckerImplTest, CalledOnValidSequenceNull) {
- const SequenceCheckerImpl sequence_checker_impl(NULL);
- EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
-
- {
- Thread thread("thread 1");
- ASSERT_TRUE(thread.Start());
- thread.message_loop()->PostTask(
- FROM_HERE, Bind(&ExpectCalledOnValidSequence,
- FROM_HERE,
- Unretained(&sequence_checker_impl),
- false));
- }
-
- EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
-}
-
-// Create a SequenceCheckerImpl with a SequencedTaskRunner and switch
-// it to another one. CalledOnValidSequence() should return what its
-// underlying SequencedTaskRunner returns for
-// RunsTasksOnCurrentThread().
-TEST_F(SequenceCheckerImplTest, ChangeSequenceNonNull) {
- const scoped_refptr<FakeTaskRunner> fake_sequenced_task_runner1(
- new FakeTaskRunner());
-
- const scoped_refptr<FakeTaskRunner> fake_sequenced_task_runner2(
- new FakeTaskRunner());
-
- SequenceCheckerImpl sequence_checker_impl(fake_sequenced_task_runner1);
- EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
-
- fake_sequenced_task_runner2->SetRunsTasksOnCurrentThread(true);
- EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
-
- sequence_checker_impl.ChangeSequence(fake_sequenced_task_runner2);
- EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
-
- sequence_checker_impl.ChangeSequence(fake_sequenced_task_runner1);
- EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
-}
-
-// Create a SequenceCheckerImpl with a SequencedTaskRunner and switch
-// it to a NULL one. CalledOnValidSequence() should then behave like
-// ThreadChecker::CalledOnValidThread().
-TEST_F(SequenceCheckerImplTest, ChangeSequenceNull) {
- const scoped_refptr<FakeTaskRunner> fake_sequenced_task_runner(
- new FakeTaskRunner());
-
- SequenceCheckerImpl sequence_checker_impl(fake_sequenced_task_runner);
- EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
-
- sequence_checker_impl.ChangeSequence(NULL);
- // Binds to current thread.
- EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
- {
- Thread thread("thread 1");
- ASSERT_TRUE(thread.Start());
- thread.message_loop()->PostTask(
- FROM_HERE, Bind(&ExpectCalledOnValidSequence,
- FROM_HERE,
- Unretained(&sequence_checker_impl),
- false));
- }
-
- EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
-
- sequence_checker_impl.ChangeSequence(NULL);
- // Binds to worker thread.
- {
- Thread thread("thread 2");
- ASSERT_TRUE(thread.Start());
- thread.message_loop()->PostTask(
- FROM_HERE, Bind(&ExpectCalledOnValidSequence,
- FROM_HERE,
- Unretained(&sequence_checker_impl),
- true));
- }
- EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
-}
-
-// Create a SequenceCheckerImpl with the current thread's task runner
-// and switch it to other task runners. CalledOnValidSequence() should
-// return true only when it's on the correct thread.
-TEST_F(SequenceCheckerImplTest, MultipleThreads) {
- MessageLoop loop;
-
- SequenceCheckerImpl sequence_checker_impl(loop.message_loop_proxy());
- EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
-
- {
- Thread thread("thread 1");
- ASSERT_TRUE(thread.Start());
- thread.message_loop()->PostTask(
- FROM_HERE, Bind(&ExpectCalledOnValidSequence,
- FROM_HERE,
- Unretained(&sequence_checker_impl),
- false));
- thread.message_loop()->PostTask(
- FROM_HERE, Bind(&SequenceCheckerImpl::ChangeSequence,
- Unretained(&sequence_checker_impl),
- thread.message_loop_proxy()));
- thread.message_loop()->PostTask(
- FROM_HERE, Bind(&ExpectCalledOnValidSequence,
- FROM_HERE,
- Unretained(&sequence_checker_impl),
- true));
- }
-
- EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
-
- sequence_checker_impl.ChangeSequence(loop.message_loop_proxy());
- EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
-
- {
- Thread thread("thread 2");
- ASSERT_TRUE(thread.Start());
- thread.message_loop()->PostTask(
- FROM_HERE, Bind(&ExpectCalledOnValidSequence,
- FROM_HERE,
- Unretained(&sequence_checker_impl),
- false));
- }
-
- EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
-}
-
-} // namespace
-
-} // namespace base