Roll src/third_party/WebKit 7764cd0:1eb8b9f (svn 199730:199735)
[chromium-blink-merge.git] / base / task_runner_util_unittest.cc
blob8245cfcdc50a94b3517b2a545b99315f971909b6
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"
7 #include "base/bind.h"
8 #include "base/location.h"
9 #include "base/run_loop.h"
10 #include "testing/gtest/include/gtest/gtest.h"
12 namespace base {
14 namespace {
16 int ReturnFourtyTwo() {
17 return 42;
20 void StoreValue(int* destination, int value) {
21 *destination = value;
24 void StoreDoubleValue(double* destination, double value) {
25 *destination = value;
28 int g_foo_destruct_count = 0;
29 int g_foo_free_count = 0;
31 struct Foo {
32 ~Foo() {
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());
48 struct FooDeleter {
49 void operator()(Foo* foo) const {
50 ++g_foo_free_count;
51 delete foo;
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());
66 } // namespace
68 TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResult) {
69 int result = 0;
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) {
82 double result = 0;
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;
96 g_foo_free_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);
122 } // namespace base