blob: 2d0cefe150011196023f78013e68f542d1d60d2b [file] [log] [blame]
[email protected]95991b12012-04-17 02:48:061// 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.
4
5#include "base/task_runner_util.h"
6
7#include "base/bind.h"
8#include "base/message_loop.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace base {
12
13namespace {
14
15int ReturnFourtyTwo() {
16 return 42;
17}
18
19void StoreValue(int* destination, int value) {
20 *destination = value;
21}
22
[email protected]d53e6a62012-05-03 22:34:1723int g_foo_destruct_count = 0;
[email protected]89ae3d882012-05-09 00:16:2524int g_foo_free_count = 0;
[email protected]d53e6a62012-05-03 22:34:1725
26struct Foo {
27 ~Foo() {
28 ++g_foo_destruct_count;
29 }
30};
31
32scoped_ptr<Foo> CreateFoo() {
33 return scoped_ptr<Foo>(new Foo);
34}
35
36void ExpectFoo(scoped_ptr<Foo> foo) {
37 EXPECT_TRUE(foo.get());
38 scoped_ptr<Foo> local_foo(foo.Pass());
39 EXPECT_TRUE(local_foo.get());
40 EXPECT_FALSE(foo.get());
41}
42
[email protected]89ae3d882012-05-09 00:16:2543struct FreeFooFunctor {
44 void operator()(Foo* foo) const {
45 ++g_foo_free_count;
[email protected]74319302012-05-10 20:08:0346 delete foo;
[email protected]89ae3d882012-05-09 00:16:2547 };
48};
49
50scoped_ptr_malloc<Foo, FreeFooFunctor> CreateScopedFoo() {
51 return scoped_ptr_malloc<Foo, FreeFooFunctor>(new Foo);
52}
53
54void ExpectScopedFoo(scoped_ptr_malloc<Foo, FreeFooFunctor> foo) {
55 EXPECT_TRUE(foo.get());
56 scoped_ptr_malloc<Foo, FreeFooFunctor> local_foo(foo.Pass());
57 EXPECT_TRUE(local_foo.get());
58 EXPECT_FALSE(foo.get());
59}
60
[email protected]95991b12012-04-17 02:48:0661} // namespace
62
[email protected]d53e6a62012-05-03 22:34:1763TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResult) {
[email protected]95991b12012-04-17 02:48:0664 MessageLoop message_loop;
65 int result = 0;
66
67 PostTaskAndReplyWithResult(
68 message_loop.message_loop_proxy(),
69 FROM_HERE,
70 Bind(&ReturnFourtyTwo),
71 Bind(&StoreValue, &result));
72
73 message_loop.RunAllPending();
74
75 EXPECT_EQ(42, result);
76}
77
[email protected]d53e6a62012-05-03 22:34:1778TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassed) {
79 g_foo_destruct_count = 0;
[email protected]89ae3d882012-05-09 00:16:2580 g_foo_free_count = 0;
[email protected]d53e6a62012-05-03 22:34:1781
82 MessageLoop message_loop;
83
84 PostTaskAndReplyWithResult(
85 message_loop.message_loop_proxy(),
86 FROM_HERE,
87 Bind(&CreateFoo),
88 Bind(&ExpectFoo));
89
90 message_loop.RunAllPending();
91
92 EXPECT_EQ(1, g_foo_destruct_count);
[email protected]89ae3d882012-05-09 00:16:2593 EXPECT_EQ(0, g_foo_free_count);
[email protected]74319302012-05-10 20:08:0394}
95
96TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassedFreeProc) {
97 g_foo_destruct_count = 0;
98 g_foo_free_count = 0;
99
100 MessageLoop message_loop;
[email protected]89ae3d882012-05-09 00:16:25101
102 PostTaskAndReplyWithResult(
103 message_loop.message_loop_proxy(),
104 FROM_HERE,
105 Bind(&CreateScopedFoo),
106 Bind(&ExpectScopedFoo));
107
108 message_loop.RunAllPending();
109
110 EXPECT_EQ(1, g_foo_destruct_count);
111 EXPECT_EQ(1, g_foo_free_count);
[email protected]d53e6a62012-05-03 22:34:17112}
113
[email protected]95991b12012-04-17 02:48:06114} // namespace base