xref: /aosp_15_r20/external/cronet/base/task/task_runner_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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