1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/task/task_runner.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <memory>
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/run_loop.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/test/task_environment.h"
15*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker namespace base {
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker namespace {
20*6777b538SAndroid Build Coastguard Worker
ReturnFourtyTwo()21*6777b538SAndroid Build Coastguard Worker int ReturnFourtyTwo() {
22*6777b538SAndroid Build Coastguard Worker return 42;
23*6777b538SAndroid Build Coastguard Worker }
24*6777b538SAndroid Build Coastguard Worker
StoreValue(int * destination,int value)25*6777b538SAndroid Build Coastguard Worker void StoreValue(int* destination, int value) {
26*6777b538SAndroid Build Coastguard Worker *destination = value;
27*6777b538SAndroid Build Coastguard Worker }
28*6777b538SAndroid Build Coastguard Worker
StoreDoubleValue(double * destination,double value)29*6777b538SAndroid Build Coastguard Worker void StoreDoubleValue(double* destination, double value) {
30*6777b538SAndroid Build Coastguard Worker *destination = value;
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker int g_foo_destruct_count = 0;
34*6777b538SAndroid Build Coastguard Worker int g_foo_free_count = 0;
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker struct Foo {
~Foobase::__anon5ab0b62c0111::Foo37*6777b538SAndroid Build Coastguard Worker ~Foo() { ++g_foo_destruct_count; }
38*6777b538SAndroid Build Coastguard Worker };
39*6777b538SAndroid Build Coastguard Worker
CreateFoo()40*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Foo> CreateFoo() {
41*6777b538SAndroid Build Coastguard Worker return std::make_unique<Foo>();
42*6777b538SAndroid Build Coastguard Worker }
43*6777b538SAndroid Build Coastguard Worker
ExpectFoo(std::unique_ptr<Foo> foo)44*6777b538SAndroid Build Coastguard Worker void ExpectFoo(std::unique_ptr<Foo> foo) {
45*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(foo.get());
46*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Foo> local_foo(std::move(foo));
47*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(local_foo.get());
48*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(foo.get());
49*6777b538SAndroid Build Coastguard Worker }
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker struct FooDeleter {
operator ()base::__anon5ab0b62c0111::FooDeleter52*6777b538SAndroid Build Coastguard Worker void operator()(Foo* foo) const {
53*6777b538SAndroid Build Coastguard Worker ++g_foo_free_count;
54*6777b538SAndroid Build Coastguard Worker delete foo;
55*6777b538SAndroid Build Coastguard Worker }
56*6777b538SAndroid Build Coastguard Worker };
57*6777b538SAndroid Build Coastguard Worker
CreateScopedFoo()58*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Foo, FooDeleter> CreateScopedFoo() {
59*6777b538SAndroid Build Coastguard Worker return std::unique_ptr<Foo, FooDeleter>(new Foo);
60*6777b538SAndroid Build Coastguard Worker }
61*6777b538SAndroid Build Coastguard Worker
ExpectScopedFoo(std::unique_ptr<Foo,FooDeleter> foo)62*6777b538SAndroid Build Coastguard Worker void ExpectScopedFoo(std::unique_ptr<Foo, FooDeleter> foo) {
63*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(foo.get());
64*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Foo, FooDeleter> local_foo(std::move(foo));
65*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(local_foo.get());
66*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(foo.get());
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker struct FooWithoutDefaultConstructor {
FooWithoutDefaultConstructorbase::__anon5ab0b62c0111::FooWithoutDefaultConstructor70*6777b538SAndroid Build Coastguard Worker explicit FooWithoutDefaultConstructor(int value) : value(value) {}
71*6777b538SAndroid Build Coastguard Worker int value;
72*6777b538SAndroid Build Coastguard Worker };
73*6777b538SAndroid Build Coastguard Worker
CreateFooWithoutDefaultConstructor(int value)74*6777b538SAndroid Build Coastguard Worker FooWithoutDefaultConstructor CreateFooWithoutDefaultConstructor(int value) {
75*6777b538SAndroid Build Coastguard Worker return FooWithoutDefaultConstructor(value);
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker
SaveFooWithoutDefaultConstructor(int * output_value,FooWithoutDefaultConstructor input)78*6777b538SAndroid Build Coastguard Worker void SaveFooWithoutDefaultConstructor(int* output_value,
79*6777b538SAndroid Build Coastguard Worker FooWithoutDefaultConstructor input) {
80*6777b538SAndroid Build Coastguard Worker *output_value = input.value;
81*6777b538SAndroid Build Coastguard Worker }
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker class TaskRunnerTest : public testing::Test {
84*6777b538SAndroid Build Coastguard Worker public:
85*6777b538SAndroid Build Coastguard Worker TaskRunnerTest() = default;
86*6777b538SAndroid Build Coastguard Worker
SetUp()87*6777b538SAndroid Build Coastguard Worker void SetUp() override {
88*6777b538SAndroid Build Coastguard Worker g_foo_destruct_count = 0;
89*6777b538SAndroid Build Coastguard Worker g_foo_free_count = 0;
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker };
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker } // namespace
94*6777b538SAndroid Build Coastguard Worker
TEST_F(TaskRunnerTest,PostTaskAndReplyWithResult)95*6777b538SAndroid Build Coastguard Worker TEST_F(TaskRunnerTest, PostTaskAndReplyWithResult) {
96*6777b538SAndroid Build Coastguard Worker int result = 0;
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker test::SingleThreadTaskEnvironment task_environment;
99*6777b538SAndroid Build Coastguard Worker SingleThreadTaskRunner::GetCurrentDefault()->PostTaskAndReplyWithResult(
100*6777b538SAndroid Build Coastguard Worker FROM_HERE, BindOnce(&ReturnFourtyTwo), BindOnce(&StoreValue, &result));
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker RunLoop().RunUntilIdle();
103*6777b538SAndroid Build Coastguard Worker
104*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(42, result);
105*6777b538SAndroid Build Coastguard Worker }
106*6777b538SAndroid Build Coastguard Worker
TEST_F(TaskRunnerTest,PostTaskAndReplyWithResultRepeatingCallbacks)107*6777b538SAndroid Build Coastguard Worker TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultRepeatingCallbacks) {
108*6777b538SAndroid Build Coastguard Worker int result = 0;
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker test::SingleThreadTaskEnvironment task_environment;
111*6777b538SAndroid Build Coastguard Worker SingleThreadTaskRunner::GetCurrentDefault()->PostTaskAndReplyWithResult(
112*6777b538SAndroid Build Coastguard Worker FROM_HERE, BindRepeating(&ReturnFourtyTwo),
113*6777b538SAndroid Build Coastguard Worker BindRepeating(&StoreValue, &result));
114*6777b538SAndroid Build Coastguard Worker
115*6777b538SAndroid Build Coastguard Worker RunLoop().RunUntilIdle();
116*6777b538SAndroid Build Coastguard Worker
117*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(42, result);
118*6777b538SAndroid Build Coastguard Worker }
119*6777b538SAndroid Build Coastguard Worker
TEST_F(TaskRunnerTest,PostTaskAndReplyWithResultImplicitConvert)120*6777b538SAndroid Build Coastguard Worker TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultImplicitConvert) {
121*6777b538SAndroid Build Coastguard Worker double result = 0;
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker test::SingleThreadTaskEnvironment task_environment;
124*6777b538SAndroid Build Coastguard Worker SingleThreadTaskRunner::GetCurrentDefault()->PostTaskAndReplyWithResult(
125*6777b538SAndroid Build Coastguard Worker FROM_HERE, BindOnce(&ReturnFourtyTwo),
126*6777b538SAndroid Build Coastguard Worker BindOnce(&StoreDoubleValue, &result));
127*6777b538SAndroid Build Coastguard Worker
128*6777b538SAndroid Build Coastguard Worker RunLoop().RunUntilIdle();
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(42.0, result);
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker
TEST_F(TaskRunnerTest,PostTaskAndReplyWithResultPassed)133*6777b538SAndroid Build Coastguard Worker TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultPassed) {
134*6777b538SAndroid Build Coastguard Worker test::SingleThreadTaskEnvironment task_environment;
135*6777b538SAndroid Build Coastguard Worker SingleThreadTaskRunner::GetCurrentDefault()->PostTaskAndReplyWithResult(
136*6777b538SAndroid Build Coastguard Worker FROM_HERE, BindOnce(&CreateFoo), BindOnce(&ExpectFoo));
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker RunLoop().RunUntilIdle();
139*6777b538SAndroid Build Coastguard Worker
140*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, g_foo_destruct_count);
141*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, g_foo_free_count);
142*6777b538SAndroid Build Coastguard Worker }
143*6777b538SAndroid Build Coastguard Worker
TEST_F(TaskRunnerTest,PostTaskAndReplyWithResultPassedFreeProc)144*6777b538SAndroid Build Coastguard Worker TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultPassedFreeProc) {
145*6777b538SAndroid Build Coastguard Worker test::SingleThreadTaskEnvironment task_environment;
146*6777b538SAndroid Build Coastguard Worker SingleThreadTaskRunner::GetCurrentDefault()->PostTaskAndReplyWithResult(
147*6777b538SAndroid Build Coastguard Worker FROM_HERE, BindOnce(&CreateScopedFoo), BindOnce(&ExpectScopedFoo));
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker RunLoop().RunUntilIdle();
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, g_foo_destruct_count);
152*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, g_foo_free_count);
153*6777b538SAndroid Build Coastguard Worker }
154*6777b538SAndroid Build Coastguard Worker
TEST_F(TaskRunnerTest,PostTaskAndReplyWithResultWithoutDefaultConstructor)155*6777b538SAndroid Build Coastguard Worker TEST_F(TaskRunnerTest, PostTaskAndReplyWithResultWithoutDefaultConstructor) {
156*6777b538SAndroid Build Coastguard Worker const int kSomeVal = 17;
157*6777b538SAndroid Build Coastguard Worker
158*6777b538SAndroid Build Coastguard Worker test::SingleThreadTaskEnvironment task_environment;
159*6777b538SAndroid Build Coastguard Worker int actual = 0;
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Worker SingleThreadTaskRunner::GetCurrentDefault()->PostTaskAndReplyWithResult(
162*6777b538SAndroid Build Coastguard Worker FROM_HERE, BindOnce(&CreateFooWithoutDefaultConstructor, kSomeVal),
163*6777b538SAndroid Build Coastguard Worker BindOnce(&SaveFooWithoutDefaultConstructor, &actual));
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker RunLoop().RunUntilIdle();
166*6777b538SAndroid Build Coastguard Worker
167*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kSomeVal, actual);
168*6777b538SAndroid Build Coastguard Worker }
169*6777b538SAndroid Build Coastguard Worker
170*6777b538SAndroid Build Coastguard Worker } // namespace base
171