// 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 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 task_runner(new TestSimpleTaskRunner); scoped_refptr overidding_task_runner( new TestSimpleTaskRunner); ThreadTaskRunnerHandle ttrh(task_runner); EXPECT_DCHECK_DEATH( { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); }); } TEST(ThreadTaskRunnerHandleTest, OverrideForTestingExistingTTRH) { scoped_refptr task_runner_1(new TestSimpleTaskRunner); scoped_refptr task_runner_2(new TestSimpleTaskRunner); scoped_refptr task_runner_3(new TestSimpleTaskRunner); scoped_refptr 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 task_runner_1(new TestSimpleTaskRunner); scoped_refptr 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 task_runner(new TestSimpleTaskRunner); scoped_refptr overidding_task_runner( new TestSimpleTaskRunner); ScopedClosureRunner undo_override = ThreadTaskRunnerHandle::OverrideForTesting(task_runner); EXPECT_DCHECK_DEATH( { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); }); } } // namespace base