OLD | NEW |
---|---|
(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 | |
OLD | NEW |