blob: 481f09ebd197c0d40d541d3bb7054d1a1abce7f5 [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"
[email protected]495cad92013-07-18 08:12:408#include "base/message_loop/message_loop.h"
[email protected]7ff48ca2013-02-06 16:56:199#include "base/run_loop.h"
[email protected]95991b12012-04-17 02:48:0610#include "testing/gtest/include/gtest/gtest.h"
11
12namespace base {
13
14namespace {
15
16int ReturnFourtyTwo() {
17 return 42;
18}
19
20void StoreValue(int* destination, int value) {
21 *destination = value;
22}
23
[email protected]895906812012-11-28 03:29:0124void StoreDoubleValue(double* destination, double value) {
25 *destination = value;
26}
27
[email protected]d53e6a62012-05-03 22:34:1728int g_foo_destruct_count = 0;
[email protected]89ae3d882012-05-09 00:16:2529int g_foo_free_count = 0;
[email protected]d53e6a62012-05-03 22:34:1730
31struct Foo {
32 ~Foo() {
33 ++g_foo_destruct_count;
34 }
35};
36
37scoped_ptr<Foo> CreateFoo() {
38 return scoped_ptr<Foo>(new Foo);
39}
40
41void 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());
46}
47
[email protected]6ae7ee762014-02-16 22:18:4348struct FooDeleter {
[email protected]89ae3d882012-05-09 00:16:2549 void operator()(Foo* foo) const {
50 ++g_foo_free_count;
[email protected]74319302012-05-10 20:08:0351 delete foo;
[email protected]89ae3d882012-05-09 00:16:2552 };
53};
54
[email protected]6ae7ee762014-02-16 22:18:4355scoped_ptr<Foo, FooDeleter> CreateScopedFoo() {
56 return scoped_ptr<Foo, FooDeleter>(new Foo);
[email protected]89ae3d882012-05-09 00:16:2557}
58
[email protected]6ae7ee762014-02-16 22:18:4359void ExpectScopedFoo(scoped_ptr<Foo, FooDeleter> foo) {
[email protected]89ae3d882012-05-09 00:16:2560 EXPECT_TRUE(foo.get());
[email protected]6ae7ee762014-02-16 22:18:4361 scoped_ptr<Foo, FooDeleter> local_foo(foo.Pass());
[email protected]89ae3d882012-05-09 00:16:2562 EXPECT_TRUE(local_foo.get());
63 EXPECT_FALSE(foo.get());
64}
65
[email protected]95991b12012-04-17 02:48:0666} // namespace
67
[email protected]d53e6a62012-05-03 22:34:1768TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResult) {
[email protected]95991b12012-04-17 02:48:0669 int result = 0;
70
[email protected]7ff48ca2013-02-06 16:56:1971 MessageLoop message_loop;
[email protected]cadac622013-06-11 16:46:3672 PostTaskAndReplyWithResult(message_loop.message_loop_proxy().get(),
[email protected]7ff48ca2013-02-06 16:56:1973 FROM_HERE,
74 Bind(&ReturnFourtyTwo),
75 Bind(&StoreValue, &result));
[email protected]95991b12012-04-17 02:48:0676
[email protected]7ff48ca2013-02-06 16:56:1977 RunLoop().RunUntilIdle();
[email protected]95991b12012-04-17 02:48:0678
79 EXPECT_EQ(42, result);
80}
81
[email protected]895906812012-11-28 03:29:0182TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultImplicitConvert) {
[email protected]895906812012-11-28 03:29:0183 double result = 0;
84
[email protected]7ff48ca2013-02-06 16:56:1985 MessageLoop message_loop;
[email protected]cadac622013-06-11 16:46:3686 PostTaskAndReplyWithResult(message_loop.message_loop_proxy().get(),
[email protected]7ff48ca2013-02-06 16:56:1987 FROM_HERE,
88 Bind(&ReturnFourtyTwo),
89 Bind(&StoreDoubleValue, &result));
[email protected]895906812012-11-28 03:29:0190
[email protected]7ff48ca2013-02-06 16:56:1991 RunLoop().RunUntilIdle();
[email protected]895906812012-11-28 03:29:0192
93 EXPECT_DOUBLE_EQ(42.0, result);
94}
95
[email protected]d53e6a62012-05-03 22:34:1796TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassed) {
97 g_foo_destruct_count = 0;
[email protected]89ae3d882012-05-09 00:16:2598 g_foo_free_count = 0;
[email protected]d53e6a62012-05-03 22:34:1799
100 MessageLoop message_loop;
[email protected]cadac622013-06-11 16:46:36101 PostTaskAndReplyWithResult(message_loop.message_loop_proxy().get(),
[email protected]7ff48ca2013-02-06 16:56:19102 FROM_HERE,
103 Bind(&CreateFoo),
104 Bind(&ExpectFoo));
[email protected]d53e6a62012-05-03 22:34:17105
[email protected]7ff48ca2013-02-06 16:56:19106 RunLoop().RunUntilIdle();
[email protected]d53e6a62012-05-03 22:34:17107
108 EXPECT_EQ(1, g_foo_destruct_count);
[email protected]89ae3d882012-05-09 00:16:25109 EXPECT_EQ(0, g_foo_free_count);
[email protected]74319302012-05-10 20:08:03110}
111
112TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassedFreeProc) {
113 g_foo_destruct_count = 0;
114 g_foo_free_count = 0;
115
116 MessageLoop message_loop;
[email protected]cadac622013-06-11 16:46:36117 PostTaskAndReplyWithResult(message_loop.message_loop_proxy().get(),
[email protected]7ff48ca2013-02-06 16:56:19118 FROM_HERE,
119 Bind(&CreateScopedFoo),
120 Bind(&ExpectScopedFoo));
[email protected]89ae3d882012-05-09 00:16:25121
[email protected]7ff48ca2013-02-06 16:56:19122 RunLoop().RunUntilIdle();
[email protected]89ae3d882012-05-09 00:16:25123
124 EXPECT_EQ(1, g_foo_destruct_count);
125 EXPECT_EQ(1, g_foo_free_count);
[email protected]d53e6a62012-05-03 22:34:17126}
127
[email protected]95991b12012-04-17 02:48:06128} // namespace base