blob: 1df54362c825b678c87c41b42d492fffcc17b9a6 [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
danakj0c8d4aa2015-11-25 05:29:587#include <utility>
8
[email protected]95991b12012-04-17 02:48:069#include "base/bind.h"
skyostil054861d2015-04-30 19:06:1510#include "base/location.h"
[email protected]7ff48ca2013-02-06 16:56:1911#include "base/run_loop.h"
[email protected]95991b12012-04-17 02:48:0612#include "testing/gtest/include/gtest/gtest.h"
13
14namespace base {
15
16namespace {
17
18int ReturnFourtyTwo() {
19 return 42;
20}
21
22void StoreValue(int* destination, int value) {
23 *destination = value;
24}
25
[email protected]895906812012-11-28 03:29:0126void StoreDoubleValue(double* destination, double value) {
27 *destination = value;
28}
29
[email protected]d53e6a62012-05-03 22:34:1730int g_foo_destruct_count = 0;
[email protected]89ae3d882012-05-09 00:16:2531int g_foo_free_count = 0;
[email protected]d53e6a62012-05-03 22:34:1732
33struct Foo {
34 ~Foo() {
35 ++g_foo_destruct_count;
36 }
37};
38
dcheng093de9b2016-04-04 21:25:5139std::unique_ptr<Foo> CreateFoo() {
40 return std::unique_ptr<Foo>(new Foo);
[email protected]d53e6a62012-05-03 22:34:1741}
42
dcheng093de9b2016-04-04 21:25:5143void ExpectFoo(std::unique_ptr<Foo> foo) {
[email protected]d53e6a62012-05-03 22:34:1744 EXPECT_TRUE(foo.get());
dcheng093de9b2016-04-04 21:25:5145 std::unique_ptr<Foo> local_foo(std::move(foo));
[email protected]d53e6a62012-05-03 22:34:1746 EXPECT_TRUE(local_foo.get());
47 EXPECT_FALSE(foo.get());
48}
49
[email protected]6ae7ee762014-02-16 22:18:4350struct FooDeleter {
[email protected]89ae3d882012-05-09 00:16:2551 void operator()(Foo* foo) const {
52 ++g_foo_free_count;
[email protected]74319302012-05-10 20:08:0353 delete foo;
[email protected]89ae3d882012-05-09 00:16:2554 };
55};
56
dcheng093de9b2016-04-04 21:25:5157std::unique_ptr<Foo, FooDeleter> CreateScopedFoo() {
58 return std::unique_ptr<Foo, FooDeleter>(new Foo);
[email protected]89ae3d882012-05-09 00:16:2559}
60
dcheng093de9b2016-04-04 21:25:5161void ExpectScopedFoo(std::unique_ptr<Foo, FooDeleter> foo) {
[email protected]89ae3d882012-05-09 00:16:2562 EXPECT_TRUE(foo.get());
dcheng093de9b2016-04-04 21:25:5163 std::unique_ptr<Foo, FooDeleter> local_foo(std::move(foo));
[email protected]89ae3d882012-05-09 00:16:2564 EXPECT_TRUE(local_foo.get());
65 EXPECT_FALSE(foo.get());
66}
67
[email protected]95991b12012-04-17 02:48:0668} // namespace
69
[email protected]d53e6a62012-05-03 22:34:1770TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResult) {
[email protected]95991b12012-04-17 02:48:0671 int result = 0;
72
[email protected]7ff48ca2013-02-06 16:56:1973 MessageLoop message_loop;
skyostil054861d2015-04-30 19:06:1574 PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
[email protected]7ff48ca2013-02-06 16:56:1975 Bind(&ReturnFourtyTwo),
76 Bind(&StoreValue, &result));
[email protected]95991b12012-04-17 02:48:0677
[email protected]7ff48ca2013-02-06 16:56:1978 RunLoop().RunUntilIdle();
[email protected]95991b12012-04-17 02:48:0679
80 EXPECT_EQ(42, result);
81}
82
[email protected]895906812012-11-28 03:29:0183TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultImplicitConvert) {
[email protected]895906812012-11-28 03:29:0184 double result = 0;
85
[email protected]7ff48ca2013-02-06 16:56:1986 MessageLoop message_loop;
skyostil054861d2015-04-30 19:06:1587 PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
[email protected]7ff48ca2013-02-06 16:56:1988 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;
skyostil054861d2015-04-30 19:06:15101 PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
102 Bind(&CreateFoo), Bind(&ExpectFoo));
[email protected]d53e6a62012-05-03 22:34:17103
[email protected]7ff48ca2013-02-06 16:56:19104 RunLoop().RunUntilIdle();
[email protected]d53e6a62012-05-03 22:34:17105
106 EXPECT_EQ(1, g_foo_destruct_count);
[email protected]89ae3d882012-05-09 00:16:25107 EXPECT_EQ(0, g_foo_free_count);
[email protected]74319302012-05-10 20:08:03108}
109
110TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassedFreeProc) {
111 g_foo_destruct_count = 0;
112 g_foo_free_count = 0;
113
114 MessageLoop message_loop;
skyostil054861d2015-04-30 19:06:15115 PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
116 Bind(&CreateScopedFoo), Bind(&ExpectScopedFoo));
[email protected]89ae3d882012-05-09 00:16:25117
[email protected]7ff48ca2013-02-06 16:56:19118 RunLoop().RunUntilIdle();
[email protected]89ae3d882012-05-09 00:16:25119
120 EXPECT_EQ(1, g_foo_destruct_count);
121 EXPECT_EQ(1, g_foo_free_count);
[email protected]d53e6a62012-05-03 22:34:17122}
123
[email protected]95991b12012-04-17 02:48:06124} // namespace base