167 lines
6.5 KiB
C++
167 lines
6.5 KiB
C++
// 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<SingleThreadTaskRunner> task_runner(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
|
|
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<SingleThreadTaskRunner> task_runner(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
|
|
SingleThreadTaskRunner::CurrentDefaultHandle sttcd(task_runner);
|
|
EXPECT_DCHECK_DEATH({
|
|
SingleThreadTaskRunner::CurrentDefaultHandle overriding_sttcd(
|
|
overidding_task_runner);
|
|
});
|
|
}
|
|
|
|
TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, OverrideExistingSTTCD) {
|
|
scoped_refptr<SingleThreadTaskRunner> task_runner_1(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
scoped_refptr<SingleThreadTaskRunner> task_runner_2(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
scoped_refptr<SingleThreadTaskRunner> task_runner_3(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
scoped_refptr<SingleThreadTaskRunner> task_runner_4(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
|
|
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<SingleThreadTaskRunner> task_runner_1(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
scoped_refptr<SingleThreadTaskRunner> task_runner_2(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
|
|
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<SingleThreadTaskRunner> task_runner(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
|
|
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<SingleThreadTaskRunner> task_runner(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
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<SingleThreadTaskRunner> task_runner(
|
|
MakeRefCounted<TestSimpleTaskRunner>());
|
|
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
|