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"
8 #include "base/location.h"
9 #include "base/run_loop.h"
10 #include "testing/gtest/include/gtest/gtest.h"
16 int ReturnFourtyTwo() {
20 void StoreValue(int* destination
, int value
) {
24 void StoreDoubleValue(double* destination
, double value
) {
28 int g_foo_destruct_count
= 0;
29 int g_foo_free_count
= 0;
33 ++g_foo_destruct_count
;
37 scoped_ptr
<Foo
> CreateFoo() {
38 return scoped_ptr
<Foo
>(new Foo
);
41 void ExpectFoo(scoped_ptr
<Foo
> foo
) {
42 EXPECT_TRUE(foo
.get());
43 scoped_ptr
<Foo
> local_foo(foo
.Pass());
44 EXPECT_TRUE(local_foo
.get());
45 EXPECT_FALSE(foo
.get());
49 void operator()(Foo
* foo
) const {
55 scoped_ptr
<Foo
, FooDeleter
> CreateScopedFoo() {
56 return scoped_ptr
<Foo
, FooDeleter
>(new Foo
);
59 void ExpectScopedFoo(scoped_ptr
<Foo
, FooDeleter
> foo
) {
60 EXPECT_TRUE(foo
.get());
61 scoped_ptr
<Foo
, FooDeleter
> local_foo(foo
.Pass());
62 EXPECT_TRUE(local_foo
.get());
63 EXPECT_FALSE(foo
.get());
68 TEST(TaskRunnerHelpersTest
, PostTaskAndReplyWithResult
) {
71 MessageLoop message_loop
;
72 PostTaskAndReplyWithResult(message_loop
.task_runner().get(), FROM_HERE
,
73 Bind(&ReturnFourtyTwo
),
74 Bind(&StoreValue
, &result
));
76 RunLoop().RunUntilIdle();
78 EXPECT_EQ(42, result
);
81 TEST(TaskRunnerHelpersTest
, PostTaskAndReplyWithResultImplicitConvert
) {
84 MessageLoop message_loop
;
85 PostTaskAndReplyWithResult(message_loop
.task_runner().get(), FROM_HERE
,
86 Bind(&ReturnFourtyTwo
),
87 Bind(&StoreDoubleValue
, &result
));
89 RunLoop().RunUntilIdle();
91 EXPECT_DOUBLE_EQ(42.0, result
);
94 TEST(TaskRunnerHelpersTest
, PostTaskAndReplyWithResultPassed
) {
95 g_foo_destruct_count
= 0;
98 MessageLoop message_loop
;
99 PostTaskAndReplyWithResult(message_loop
.task_runner().get(), FROM_HERE
,
100 Bind(&CreateFoo
), Bind(&ExpectFoo
));
102 RunLoop().RunUntilIdle();
104 EXPECT_EQ(1, g_foo_destruct_count
);
105 EXPECT_EQ(0, g_foo_free_count
);
108 TEST(TaskRunnerHelpersTest
, PostTaskAndReplyWithResultPassedFreeProc
) {
109 g_foo_destruct_count
= 0;
110 g_foo_free_count
= 0;
112 MessageLoop message_loop
;
113 PostTaskAndReplyWithResult(message_loop
.task_runner().get(), FROM_HERE
,
114 Bind(&CreateScopedFoo
), Bind(&ExpectScopedFoo
));
116 RunLoop().RunUntilIdle();
118 EXPECT_EQ(1, g_foo_destruct_count
);
119 EXPECT_EQ(1, g_foo_free_count
);