Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: base/cancelable_callback_unittest.cc

Issue 8673008: base::Bind: Implement CancelableCallback to replace CancelableTaske. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Test build fix. Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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/cancelable_callback.h"
csilv 2011/11/23 19:37:30 add includes for base/bind.h, base/bind_helpers.h
James Hawkins 2011/11/23 22:12:52 Done.
6 #include "base/message_loop.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace base {
10 namespace {
11
12 class Counter {
awong 2011/11/23 19:58:23 Why use a class instead of a bare function like:
James Hawkins 2011/11/23 22:12:52 This is an evolved version of a class I copied fro
13 public:
14 Counter() : count_(0) { }
15 void IncrementCount() { count_++; }
16 void IncrementCountBy(int n) { count_ += n; }
17 int count() const { return count_; }
18
19 private:
20 int count_;
21 };
22
23 TEST(CancelableCallbackTest, Cancel) {
awong 2011/11/23 19:58:23 For things related to bind/callback, I've been try
James Hawkins 2011/11/23 22:12:52 Done.
24 Counter counter;
25 CancelableCallback cancelable(base::Bind(&Counter::IncrementCount,
26 base::Unretained(&counter)));
27
28 base::Closure callback = cancelable.callback();
29 callback.Run();
30 EXPECT_EQ(1, counter.count());
31
32 callback.Run();
33 EXPECT_EQ(2, counter.count());
34
35 cancelable.Cancel();
36 callback.Run();
37 EXPECT_EQ(2, counter.count());
38 }
39
40 TEST(CancelableCallbackTest, MultipleCancel) {
41 Counter counter;
42 CancelableCallback cancelable(base::Bind(&Counter::IncrementCount,
43 base::Unretained(&counter)));
44
45 base::Closure callback1 = cancelable.callback();
46 cancelable.Cancel();
47
48 base::Closure callback2 = cancelable.callback();
49 base::Closure callback3 = cancelable.callback();
50 cancelable.Cancel();
groby-ooo-7-16 2011/11/23 19:18:57 I suspect it would be interesting for people to kn
James Hawkins 2011/11/23 19:37:10 How so?
groby-ooo-7-16 2011/11/23 19:43:14 Will callback2/3 be running without it? (It won't,
James Hawkins 2011/11/23 22:12:52 I've rearranged this, per-offline.
51
52 callback1.Run();
53 EXPECT_EQ(0, counter.count());
54
55 callback2.Run();
56 EXPECT_EQ(0, counter.count());
57
58 cancelable.Cancel();
59 callback3.Run();
60 EXPECT_EQ(0, counter.count());
61 }
62
63 TEST(CancelableCallbackTest, NArity) {
awong 2011/11/23 19:58:23 What's NArity mean in this context? If you're tes
James Hawkins 2011/11/23 22:12:52 Done.
64 Counter counter;
65 CancelableCallback cancelable(
66 base::Bind(&Counter::IncrementCountBy, base::Unretained(&counter), 5));
67
68 base::Closure callback = cancelable.callback();
69 callback.Run();
70 EXPECT_EQ(5, counter.count());
71
72 callback.Run();
73 EXPECT_EQ(10, counter.count());
74
75 cancelable.Cancel();
76 callback.Run();
77 EXPECT_EQ(10, counter.count());
78 }
79
80 TEST(CancelableCallbackTest, CallbackCanceledOnDestruction) {
81 Counter counter;
82 base::Closure callback;
83
84 {
85 CancelableCallback cancelable(base::Bind(&Counter::IncrementCount,
86 base::Unretained(&counter)));
87
88 callback = cancelable.callback();
89 callback.Run();
90 EXPECT_EQ(1, counter.count());
91 }
92
93 callback.Run();
94 EXPECT_EQ(1, counter.count());
95 }
96
97 TEST(CancelableCallbackTest, Reset) {
98 Counter counter;
99 CancelableCallback cancelable(base::Bind(&Counter::IncrementCount,
100 base::Unretained(&counter)));
101
102 base::Closure callback = cancelable.callback();
103 callback.Run();
104 EXPECT_EQ(1, counter.count());
105
106 callback.Run();
107 EXPECT_EQ(2, counter.count());
108
109 cancelable.Reset(base::Bind(&Counter::IncrementCountBy,
110 base::Unretained(&counter), 3));
awong 2011/11/23 19:58:23 Also EXPECT_TRUE(cancelable.is_null())?
James Hawkins 2011/11/23 22:12:52 |cancelable| is not null at this point. I've added
111
112 // The stale copy of the cancelable callback is no longer active.
113 callback.Run();
114 EXPECT_EQ(2, counter.count());
115
116 base::Closure callback2 = cancelable.callback();
117 callback2.Run();
118 EXPECT_EQ(5, counter.count());
119 }
120
121 TEST(CancelableCallbackTest, IsNull) {
122 CancelableCallback cancelable;
123 EXPECT_TRUE(cancelable.is_null());
124
125 Counter counter;
126 cancelable.Reset(base::Bind(&Counter::IncrementCount,
127 base::Unretained(&counter)));
128 EXPECT_FALSE(cancelable.is_null());
129
130 cancelable.Cancel();
131 EXPECT_TRUE(cancelable.is_null());
132 }
133
134 TEST(CancelableCallbackTest, PostTask) {
135 MessageLoop loop(MessageLoop::TYPE_DEFAULT);
136
137 Counter counter;
138 CancelableCallback cancelable(base::Bind(&Counter::IncrementCount,
139 base::Unretained(&counter)));
140
141 MessageLoop::current()->PostTask(FROM_HERE, cancelable.callback());
142 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
143 MessageLoop::current()->Run();
144
145 EXPECT_EQ(1, counter.count());
146
147 MessageLoop::current()->PostTask(FROM_HERE, cancelable.callback());
148 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
149
150 // Cancel before running the message loop.
151 cancelable.Cancel();
152 MessageLoop::current()->Run();
153
154 // Callback never ran due to cancellation; count is the same.
155 EXPECT_EQ(1, counter.count());
156 }
157
158 } // namespace
159 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698