// 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/task/single_thread_task_runner.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "base/task/sequenced_task_runner.h" #include "base/task/single_thread_task_runner.h" #include "base/test/gtest_util.h" #include "base/test/task_environment.h" #include "base/test/test_simple_task_runner.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, Basic) { scoped_refptr task_runner( MakeRefCounted()); EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault()); { SingleThreadTaskRunner::CurrentDefaultHandle sttcd1(task_runner); EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner, SingleThreadTaskRunner::GetCurrentDefault()); } EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault()); } TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, DeathOnImplicitOverride) { scoped_refptr task_runner( MakeRefCounted()); scoped_refptr overidding_task_runner( MakeRefCounted()); SingleThreadTaskRunner::CurrentDefaultHandle sttcd(task_runner); EXPECT_DCHECK_DEATH({ SingleThreadTaskRunner::CurrentDefaultHandle overriding_sttcd( overidding_task_runner); }); } TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, OverrideExistingSTTCD) { scoped_refptr task_runner_1( MakeRefCounted()); scoped_refptr task_runner_2( MakeRefCounted()); scoped_refptr task_runner_3( MakeRefCounted()); scoped_refptr task_runner_4( MakeRefCounted()); EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault()); { // STTCD in place prior to override. SingleThreadTaskRunner::CurrentDefaultHandle sttcd1(task_runner_1); EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner_1, SingleThreadTaskRunner::GetCurrentDefault()); { // Override. SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override_2( task_runner_2); EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner_2, SingleThreadTaskRunner::GetCurrentDefault()); { // Nested override. SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override_3(task_runner_3); EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner_3, SingleThreadTaskRunner::GetCurrentDefault()); } // Back to single override. EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner_2, SingleThreadTaskRunner::GetCurrentDefault()); { // Backup to double override with another STTCD. SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override_4(task_runner_4); EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner_4, SingleThreadTaskRunner::GetCurrentDefault()); } } // Back to simple STTCD. EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner_1, SingleThreadTaskRunner::GetCurrentDefault()); } EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault()); } TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, OverrideNoExistingSTTCD) { scoped_refptr task_runner_1( MakeRefCounted()); scoped_refptr task_runner_2( MakeRefCounted()); EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault()); { // Override with no STTCD in place. SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override_1( task_runner_1); EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner_1, SingleThreadTaskRunner::GetCurrentDefault()); { // Nested override works the same. SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override_2( task_runner_2); EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner_2, SingleThreadTaskRunner::GetCurrentDefault()); } // Back to single override. EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner_1, SingleThreadTaskRunner::GetCurrentDefault()); } EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault()); } TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, DeathOnSTTCDOverOverride) { scoped_refptr task_runner( MakeRefCounted()); scoped_refptr overidding_task_runner( MakeRefCounted()); SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override( task_runner); EXPECT_DCHECK_DEATH({ SingleThreadTaskRunner::CurrentDefaultHandle overriding_sttrcd( overidding_task_runner); }); } TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, NestedRunLoop) { test::SingleThreadTaskEnvironment task_environment; EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); scoped_refptr task_runner( MakeRefCounted()); SingleThreadTaskRunner::CurrentHandleOverride sttrcd_override( task_runner, /*allow_nested_runloop=*/true); EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner, SingleThreadTaskRunner::GetCurrentDefault()); EXPECT_EQ(task_runner, SequencedTaskRunner::GetCurrentDefault()); RunLoop().RunUntilIdle(); } TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, DeathOnNestedRunLoop) { test::SingleThreadTaskEnvironment task_environment; EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); scoped_refptr task_runner( MakeRefCounted()); SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override( task_runner); EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault()); EXPECT_EQ(task_runner, SingleThreadTaskRunner::GetCurrentDefault()); EXPECT_EQ(task_runner, SequencedTaskRunner::GetCurrentDefault()); EXPECT_DCHECK_DEATH({ RunLoop().RunUntilIdle(); }); } } // namespace base