1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/task_runner_util.h"
10 #include "base/bind.h"
11 #include "base/location.h"
12 #include "base/run_loop.h"
13 #include "base/test/task_environment.h"
14 #include "base/threading/thread_task_runner_handle.h"
15 #include "testing/gtest/include/gtest/gtest.h"
21 int ReturnFourtyTwo() {
25 void StoreValue(int* destination, int value) {
29 void StoreDoubleValue(double* destination, double value) {
33 int g_foo_destruct_count = 0;
34 int g_foo_free_count = 0;
37 ~Foo() { ++g_foo_destruct_count; }
40 std::unique_ptr<Foo> CreateFoo() {
41 return std::make_unique<Foo>();
44 void ExpectFoo(std::unique_ptr<Foo> foo) {
45 EXPECT_TRUE(foo.get());
46 std::unique_ptr<Foo> local_foo(std::move(foo));
47 EXPECT_TRUE(local_foo.get());
48 EXPECT_FALSE(foo.get());
52 void operator()(Foo* foo) const {
58 std::unique_ptr<Foo, FooDeleter> CreateScopedFoo() {
59 return std::unique_ptr<Foo, FooDeleter>(new Foo);
62 void ExpectScopedFoo(std::unique_ptr<Foo, FooDeleter> foo) {
63 EXPECT_TRUE(foo.get());
64 std::unique_ptr<Foo, FooDeleter> local_foo(std::move(foo));
65 EXPECT_TRUE(local_foo.get());
66 EXPECT_FALSE(foo.get());
69 struct FooWithoutDefaultConstructor {
70 explicit FooWithoutDefaultConstructor(int value) : value(value) {}
74 FooWithoutDefaultConstructor CreateFooWithoutDefaultConstructor(int value) {
75 return FooWithoutDefaultConstructor(value);
78 void SaveFooWithoutDefaultConstructor(int* output_value,
79 FooWithoutDefaultConstructor input) {
80 *output_value = input.value;
83 class TaskRunnerTest : public testing::Test {
85 TaskRunnerTest() = default;
87 void SetUp() override {
88 g_foo_destruct_count = 0;
95 TEST_F(TaskRunnerTest, PostTaskAndReplyWithResult) {
98 test::SingleThreadTaskEnvironment task_environment;
99 ThreadTaskRunnerHandle::Get()->PostTaskAndReplyWithResult(
100 FROM_HERE, BindOnce(&ReturnFourtyTwo), BindOnce(&StoreValue, &result));
102 RunLoop().RunUntilIdle();
104 EXPECT_EQ(42, result);
107 TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultRepeatingCallbacks) {
110 test::SingleThreadTaskEnvironment task_environment;
111 ThreadTaskRunnerHandle::Get()->PostTaskAndReplyWithResult(
112 FROM_HERE, BindRepeating(&ReturnFourtyTwo),
113 BindRepeating(&StoreValue, &result));
115 RunLoop().RunUntilIdle();
117 EXPECT_EQ(42, result);
120 TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultImplicitConvert) {
123 test::SingleThreadTaskEnvironment task_environment;
124 ThreadTaskRunnerHandle::Get()->PostTaskAndReplyWithResult(
125 FROM_HERE, BindOnce(&ReturnFourtyTwo),
126 BindOnce(&StoreDoubleValue, &result));
128 RunLoop().RunUntilIdle();
130 EXPECT_DOUBLE_EQ(42.0, result);
133 TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultPassed) {
134 test::SingleThreadTaskEnvironment task_environment;
135 ThreadTaskRunnerHandle::Get()->PostTaskAndReplyWithResult(
136 FROM_HERE, BindOnce(&CreateFoo), BindOnce(&ExpectFoo));
138 RunLoop().RunUntilIdle();
140 EXPECT_EQ(1, g_foo_destruct_count);
141 EXPECT_EQ(0, g_foo_free_count);
144 TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultPassedFreeProc) {
145 test::SingleThreadTaskEnvironment task_environment;
146 ThreadTaskRunnerHandle::Get()->PostTaskAndReplyWithResult(
147 FROM_HERE, BindOnce(&CreateScopedFoo), BindOnce(&ExpectScopedFoo));
149 RunLoop().RunUntilIdle();
151 EXPECT_EQ(1, g_foo_destruct_count);
152 EXPECT_EQ(1, g_foo_free_count);
155 TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultWithoutDefaultConstructor) {
156 const int kSomeVal = 17;
158 test::SingleThreadTaskEnvironment task_environment;
161 ThreadTaskRunnerHandle::Get()->PostTaskAndReplyWithResult(
162 FROM_HERE, BindOnce(&CreateFooWithoutDefaultConstructor, kSomeVal),
163 BindOnce(&SaveFooWithoutDefaultConstructor, &actual));
165 RunLoop().RunUntilIdle();
167 EXPECT_EQ(kSomeVal, actual);