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/message_loop/message_loop.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
.message_loop_proxy().get(),
74 Bind(&ReturnFourtyTwo
),
75 Bind(&StoreValue
, &result
));
77 RunLoop().RunUntilIdle();
79 EXPECT_EQ(42, result
);
82 TEST(TaskRunnerHelpersTest
, PostTaskAndReplyWithResultImplicitConvert
) {
85 MessageLoop message_loop
;
86 PostTaskAndReplyWithResult(message_loop
.message_loop_proxy().get(),
88 Bind(&ReturnFourtyTwo
),
89 Bind(&StoreDoubleValue
, &result
));
91 RunLoop().RunUntilIdle();
93 EXPECT_DOUBLE_EQ(42.0, result
);
96 TEST(TaskRunnerHelpersTest
, PostTaskAndReplyWithResultPassed
) {
97 g_foo_destruct_count
= 0;
100 MessageLoop message_loop
;
101 PostTaskAndReplyWithResult(message_loop
.message_loop_proxy().get(),
106 RunLoop().RunUntilIdle();
108 EXPECT_EQ(1, g_foo_destruct_count
);
109 EXPECT_EQ(0, g_foo_free_count
);
112 TEST(TaskRunnerHelpersTest
, PostTaskAndReplyWithResultPassedFreeProc
) {
113 g_foo_destruct_count
= 0;
114 g_foo_free_count
= 0;
116 MessageLoop message_loop
;
117 PostTaskAndReplyWithResult(message_loop
.message_loop_proxy().get(),
119 Bind(&CreateScopedFoo
),
120 Bind(&ExpectScopedFoo
));
122 RunLoop().RunUntilIdle();
124 EXPECT_EQ(1, g_foo_destruct_count
);
125 EXPECT_EQ(1, g_foo_free_count
);