xref: /aosp_15_r20/external/libchrome/base/task_runner_util_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/task_runner_util.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <utility>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/location.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/message_loop/message_loop.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/run_loop.h"
13*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
14*635a8641SAndroid Build Coastguard Worker 
15*635a8641SAndroid Build Coastguard Worker namespace base {
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker namespace {
18*635a8641SAndroid Build Coastguard Worker 
ReturnFourtyTwo()19*635a8641SAndroid Build Coastguard Worker int ReturnFourtyTwo() {
20*635a8641SAndroid Build Coastguard Worker   return 42;
21*635a8641SAndroid Build Coastguard Worker }
22*635a8641SAndroid Build Coastguard Worker 
StoreValue(int * destination,int value)23*635a8641SAndroid Build Coastguard Worker void StoreValue(int* destination, int value) {
24*635a8641SAndroid Build Coastguard Worker   *destination = value;
25*635a8641SAndroid Build Coastguard Worker }
26*635a8641SAndroid Build Coastguard Worker 
StoreDoubleValue(double * destination,double value)27*635a8641SAndroid Build Coastguard Worker void StoreDoubleValue(double* destination, double value) {
28*635a8641SAndroid Build Coastguard Worker   *destination = value;
29*635a8641SAndroid Build Coastguard Worker }
30*635a8641SAndroid Build Coastguard Worker 
31*635a8641SAndroid Build Coastguard Worker int g_foo_destruct_count = 0;
32*635a8641SAndroid Build Coastguard Worker int g_foo_free_count = 0;
33*635a8641SAndroid Build Coastguard Worker 
34*635a8641SAndroid Build Coastguard Worker struct Foo {
~Foobase::__anon3db67db10111::Foo35*635a8641SAndroid Build Coastguard Worker   ~Foo() {
36*635a8641SAndroid Build Coastguard Worker     ++g_foo_destruct_count;
37*635a8641SAndroid Build Coastguard Worker   }
38*635a8641SAndroid Build Coastguard Worker };
39*635a8641SAndroid Build Coastguard Worker 
CreateFoo()40*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Foo> CreateFoo() {
41*635a8641SAndroid Build Coastguard Worker   return std::unique_ptr<Foo>(new Foo);
42*635a8641SAndroid Build Coastguard Worker }
43*635a8641SAndroid Build Coastguard Worker 
ExpectFoo(std::unique_ptr<Foo> foo)44*635a8641SAndroid Build Coastguard Worker void ExpectFoo(std::unique_ptr<Foo> foo) {
45*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(foo.get());
46*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Foo> local_foo(std::move(foo));
47*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(local_foo.get());
48*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(foo.get());
49*635a8641SAndroid Build Coastguard Worker }
50*635a8641SAndroid Build Coastguard Worker 
51*635a8641SAndroid Build Coastguard Worker struct FooDeleter {
operator ()base::__anon3db67db10111::FooDeleter52*635a8641SAndroid Build Coastguard Worker   void operator()(Foo* foo) const {
53*635a8641SAndroid Build Coastguard Worker     ++g_foo_free_count;
54*635a8641SAndroid Build Coastguard Worker     delete foo;
55*635a8641SAndroid Build Coastguard Worker   };
56*635a8641SAndroid Build Coastguard Worker };
57*635a8641SAndroid Build Coastguard Worker 
CreateScopedFoo()58*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Foo, FooDeleter> CreateScopedFoo() {
59*635a8641SAndroid Build Coastguard Worker   return std::unique_ptr<Foo, FooDeleter>(new Foo);
60*635a8641SAndroid Build Coastguard Worker }
61*635a8641SAndroid Build Coastguard Worker 
ExpectScopedFoo(std::unique_ptr<Foo,FooDeleter> foo)62*635a8641SAndroid Build Coastguard Worker void ExpectScopedFoo(std::unique_ptr<Foo, FooDeleter> foo) {
63*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(foo.get());
64*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Foo, FooDeleter> local_foo(std::move(foo));
65*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(local_foo.get());
66*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(foo.get());
67*635a8641SAndroid Build Coastguard Worker }
68*635a8641SAndroid Build Coastguard Worker 
69*635a8641SAndroid Build Coastguard Worker }  // namespace
70*635a8641SAndroid Build Coastguard Worker 
TEST(TaskRunnerHelpersTest,PostTaskAndReplyWithResult)71*635a8641SAndroid Build Coastguard Worker TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResult) {
72*635a8641SAndroid Build Coastguard Worker   int result = 0;
73*635a8641SAndroid Build Coastguard Worker 
74*635a8641SAndroid Build Coastguard Worker   MessageLoop message_loop;
75*635a8641SAndroid Build Coastguard Worker   PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
76*635a8641SAndroid Build Coastguard Worker                              Bind(&ReturnFourtyTwo),
77*635a8641SAndroid Build Coastguard Worker                              Bind(&StoreValue, &result));
78*635a8641SAndroid Build Coastguard Worker 
79*635a8641SAndroid Build Coastguard Worker   RunLoop().RunUntilIdle();
80*635a8641SAndroid Build Coastguard Worker 
81*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, result);
82*635a8641SAndroid Build Coastguard Worker }
83*635a8641SAndroid Build Coastguard Worker 
TEST(TaskRunnerHelpersTest,PostTaskAndReplyWithResultImplicitConvert)84*635a8641SAndroid Build Coastguard Worker TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultImplicitConvert) {
85*635a8641SAndroid Build Coastguard Worker   double result = 0;
86*635a8641SAndroid Build Coastguard Worker 
87*635a8641SAndroid Build Coastguard Worker   MessageLoop message_loop;
88*635a8641SAndroid Build Coastguard Worker   PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
89*635a8641SAndroid Build Coastguard Worker                              Bind(&ReturnFourtyTwo),
90*635a8641SAndroid Build Coastguard Worker                              Bind(&StoreDoubleValue, &result));
91*635a8641SAndroid Build Coastguard Worker 
92*635a8641SAndroid Build Coastguard Worker   RunLoop().RunUntilIdle();
93*635a8641SAndroid Build Coastguard Worker 
94*635a8641SAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(42.0, result);
95*635a8641SAndroid Build Coastguard Worker }
96*635a8641SAndroid Build Coastguard Worker 
TEST(TaskRunnerHelpersTest,PostTaskAndReplyWithResultPassed)97*635a8641SAndroid Build Coastguard Worker TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassed) {
98*635a8641SAndroid Build Coastguard Worker   g_foo_destruct_count = 0;
99*635a8641SAndroid Build Coastguard Worker   g_foo_free_count = 0;
100*635a8641SAndroid Build Coastguard Worker 
101*635a8641SAndroid Build Coastguard Worker   MessageLoop message_loop;
102*635a8641SAndroid Build Coastguard Worker   PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
103*635a8641SAndroid Build Coastguard Worker                              Bind(&CreateFoo), Bind(&ExpectFoo));
104*635a8641SAndroid Build Coastguard Worker 
105*635a8641SAndroid Build Coastguard Worker   RunLoop().RunUntilIdle();
106*635a8641SAndroid Build Coastguard Worker 
107*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, g_foo_destruct_count);
108*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, g_foo_free_count);
109*635a8641SAndroid Build Coastguard Worker }
110*635a8641SAndroid Build Coastguard Worker 
TEST(TaskRunnerHelpersTest,PostTaskAndReplyWithResultPassedFreeProc)111*635a8641SAndroid Build Coastguard Worker TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassedFreeProc) {
112*635a8641SAndroid Build Coastguard Worker   g_foo_destruct_count = 0;
113*635a8641SAndroid Build Coastguard Worker   g_foo_free_count = 0;
114*635a8641SAndroid Build Coastguard Worker 
115*635a8641SAndroid Build Coastguard Worker   MessageLoop message_loop;
116*635a8641SAndroid Build Coastguard Worker   PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
117*635a8641SAndroid Build Coastguard Worker                              Bind(&CreateScopedFoo), Bind(&ExpectScopedFoo));
118*635a8641SAndroid Build Coastguard Worker 
119*635a8641SAndroid Build Coastguard Worker   RunLoop().RunUntilIdle();
120*635a8641SAndroid Build Coastguard Worker 
121*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, g_foo_destruct_count);
122*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, g_foo_free_count);
123*635a8641SAndroid Build Coastguard Worker }
124*635a8641SAndroid Build Coastguard Worker 
125*635a8641SAndroid Build Coastguard Worker }  // namespace base
126