diff options
Diffstat (limited to 'base/threading/thread_task_runner_handle_unittest.cc')
-rw-r--r-- | base/threading/thread_task_runner_handle_unittest.cc | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/base/threading/thread_task_runner_handle_unittest.cc b/base/threading/thread_task_runner_handle_unittest.cc new file mode 100644 index 0000000000..1aa02d151d --- /dev/null +++ b/base/threading/thread_task_runner_handle_unittest.cc @@ -0,0 +1,122 @@ +// Copyright 2017 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/threading/thread_task_runner_handle.h" + +#include "base/memory/ref_counted.h" +#include "base/test/gtest_util.h" +#include "base/test/test_simple_task_runner.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace base { + +TEST(ThreadTaskRunnerHandleTest, Basic) { + scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner); + + EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet()); + { + ThreadTaskRunnerHandle ttrh1(task_runner); + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner, ThreadTaskRunnerHandle::Get()); + } + EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet()); +} + +TEST(ThreadTaskRunnerHandleTest, DeathOnImplicitOverride) { + scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner); + scoped_refptr<SingleThreadTaskRunner> overidding_task_runner( + new TestSimpleTaskRunner); + + ThreadTaskRunnerHandle ttrh(task_runner); + EXPECT_DCHECK_DEATH( + { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); }); +} + +TEST(ThreadTaskRunnerHandleTest, OverrideForTestingExistingTTRH) { + scoped_refptr<SingleThreadTaskRunner> task_runner_1(new TestSimpleTaskRunner); + scoped_refptr<SingleThreadTaskRunner> task_runner_2(new TestSimpleTaskRunner); + scoped_refptr<SingleThreadTaskRunner> task_runner_3(new TestSimpleTaskRunner); + scoped_refptr<SingleThreadTaskRunner> task_runner_4(new TestSimpleTaskRunner); + + EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet()); + { + // TTRH in place prior to override. + ThreadTaskRunnerHandle ttrh1(task_runner_1); + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get()); + + { + // Override. + ScopedClosureRunner undo_override_2 = + ThreadTaskRunnerHandle::OverrideForTesting(task_runner_2); + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get()); + + { + // Nested override. + ScopedClosureRunner undo_override_3 = + ThreadTaskRunnerHandle::OverrideForTesting(task_runner_3); + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner_3, ThreadTaskRunnerHandle::Get()); + } + + // Back to single override. + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get()); + + { + // Backup to double override with another TTRH. + ScopedClosureRunner undo_override_4 = + ThreadTaskRunnerHandle::OverrideForTesting(task_runner_4); + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner_4, ThreadTaskRunnerHandle::Get()); + } + } + + // Back to simple TTRH. + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get()); + } + EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet()); +} + +TEST(ThreadTaskRunnerHandleTest, OverrideForTestingNoExistingTTRH) { + scoped_refptr<SingleThreadTaskRunner> task_runner_1(new TestSimpleTaskRunner); + scoped_refptr<SingleThreadTaskRunner> task_runner_2(new TestSimpleTaskRunner); + + EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet()); + { + // Override with no TTRH in place. + ScopedClosureRunner undo_override_1 = + ThreadTaskRunnerHandle::OverrideForTesting(task_runner_1); + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get()); + + { + // Nested override works the same. + ScopedClosureRunner undo_override_2 = + ThreadTaskRunnerHandle::OverrideForTesting(task_runner_2); + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get()); + } + + // Back to single override. + EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet()); + EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get()); + } + EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet()); +} + +TEST(ThreadTaskRunnerHandleTest, DeathOnTTRHOverOverride) { + scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner); + scoped_refptr<SingleThreadTaskRunner> overidding_task_runner( + new TestSimpleTaskRunner); + + ScopedClosureRunner undo_override = + ThreadTaskRunnerHandle::OverrideForTesting(task_runner); + EXPECT_DCHECK_DEATH( + { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); }); +} + +} // namespace base |