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