Index: base/threading/thread_task_runner_handle_unittest.cc |
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 0000000000000000000000000000000000000000..1aa02d151d8dccdbb6461c966fa9aff19ef024e5 |
--- /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 |