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

Side by Side Diff: base/cancelable_callback_unittest.cc

Issue 8662047: base::Bind: Implement a 1-arity CancelableCallback and use this to implement (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review fixes. Created 9 years 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
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/cancelable_callback.h" 5 #include "base/cancelable_callback.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 10 matching lines...) Expand all
21 21
22 void Increment(int* count) { (*count)++; } 22 void Increment(int* count) { (*count)++; }
23 void IncrementBy(int* count, int n) { (*count) += n; } 23 void IncrementBy(int* count, int n) { (*count) += n; }
24 void RefCountedParam(const scoped_refptr<TestRefCounted>& ref_counted) {} 24 void RefCountedParam(const scoped_refptr<TestRefCounted>& ref_counted) {}
25 25
26 // Cancel(). 26 // Cancel().
27 // - Callback can be run multiple times. 27 // - Callback can be run multiple times.
28 // - After Cancel(), Run() completes but has no effect. 28 // - After Cancel(), Run() completes but has no effect.
29 TEST(CancelableCallbackTest, Cancel) { 29 TEST(CancelableCallbackTest, Cancel) {
30 int count = 0; 30 int count = 0;
31 CancelableCallback cancelable( 31 CancelableClosure cancelable(
32 base::Bind(&Increment, base::Unretained(&count))); 32 base::Bind(&Increment, base::Unretained(&count)));
33 33
34 base::Closure callback = cancelable.callback(); 34 base::Closure callback = cancelable.callback();
35 callback.Run(); 35 callback.Run();
36 EXPECT_EQ(1, count); 36 EXPECT_EQ(1, count);
37 37
38 callback.Run(); 38 callback.Run();
39 EXPECT_EQ(2, count); 39 EXPECT_EQ(2, count);
40 40
41 cancelable.Cancel(); 41 cancelable.Cancel();
42 callback.Run(); 42 callback.Run();
43 EXPECT_EQ(2, count); 43 EXPECT_EQ(2, count);
44 } 44 }
45 45
46 // Cancel() called multiple times. 46 // Cancel() called multiple times.
47 // - Cancel() cancels all copies of the wrapped callback. 47 // - Cancel() cancels all copies of the wrapped callback.
48 TEST(CancelableCallbackTest, MultipleCancel) { 48 TEST(CancelableCallbackTest, MultipleCancel) {
49 int count = 0; 49 int count = 0;
50 CancelableCallback cancelable( 50 CancelableClosure cancelable(
51 base::Bind(&Increment, base::Unretained(&count))); 51 base::Bind(&Increment, base::Unretained(&count)));
52 52
53 base::Closure callback1 = cancelable.callback(); 53 base::Closure callback1 = cancelable.callback();
54 cancelable.Cancel(); 54 cancelable.Cancel();
55 55
56 callback1.Run(); 56 callback1.Run();
57 EXPECT_EQ(0, count); 57 EXPECT_EQ(0, count);
58 58
59 base::Closure callback2 = cancelable.callback(); 59 base::Closure callback2 = cancelable.callback();
60 callback2.Run(); 60 callback2.Run();
61 EXPECT_EQ(0, count); 61 EXPECT_EQ(0, count);
62 62
63 // Cancel() should have no effect, but callback() is still runnable. 63 // Cancel() should have no effect, but callback() is still runnable.
64 base::Closure callback3 = cancelable.callback(); 64 base::Closure callback3 = cancelable.callback();
65 cancelable.Cancel(); 65 cancelable.Cancel();
66 callback3.Run(); 66 callback3.Run();
67 EXPECT_EQ(0, count); 67 EXPECT_EQ(0, count);
68 } 68 }
69 69
70 // CancelableCallback destroyed before callback is run. 70 // CancelableCallback destroyed before callback is run.
71 // - Destruction of CancelableCallback cancels outstanding callbacks. 71 // - Destruction of CancelableCallback cancels outstanding callbacks.
72 TEST(CancelableCallbackTest, CallbackCanceledOnDestruction) { 72 TEST(CancelableCallbackTest, CallbackCanceledOnDestruction) {
73 int count = 0; 73 int count = 0;
74 base::Closure callback; 74 base::Closure callback;
75 75
76 { 76 {
77 CancelableCallback cancelable( 77 CancelableClosure cancelable(
78 base::Bind(&Increment, base::Unretained(&count))); 78 base::Bind(&Increment, base::Unretained(&count)));
79 79
80 callback = cancelable.callback(); 80 callback = cancelable.callback();
81 callback.Run(); 81 callback.Run();
82 EXPECT_EQ(1, count); 82 EXPECT_EQ(1, count);
83 } 83 }
84 84
85 callback.Run(); 85 callback.Run();
86 EXPECT_EQ(1, count); 86 EXPECT_EQ(1, count);
87 } 87 }
88 88
89 // Cancel() called on bound closure with a RefCounted parameter. 89 // Cancel() called on bound closure with a RefCounted parameter.
90 // - Cancel drops wrapped callback (and, implicitly, its bound arguments). 90 // - Cancel drops wrapped callback (and, implicitly, its bound arguments).
91 TEST(CancelableCallbackTest, CancelDropsCallback) { 91 TEST(CancelableCallbackTest, CancelDropsCallback) {
92 scoped_refptr<TestRefCounted> ref_counted = new TestRefCounted; 92 scoped_refptr<TestRefCounted> ref_counted = new TestRefCounted;
93 EXPECT_TRUE(ref_counted->HasOneRef()); 93 EXPECT_TRUE(ref_counted->HasOneRef());
94 94
95 CancelableCallback cancelable(base::Bind(RefCountedParam, ref_counted)); 95 CancelableClosure cancelable(base::Bind(RefCountedParam, ref_counted));
96 EXPECT_FALSE(cancelable.IsCancelled()); 96 EXPECT_FALSE(cancelable.IsCancelled());
97 EXPECT_TRUE(ref_counted.get()); 97 EXPECT_TRUE(ref_counted.get());
98 EXPECT_FALSE(ref_counted->HasOneRef()); 98 EXPECT_FALSE(ref_counted->HasOneRef());
99 99
100 // There is only one reference to |ref_counted| after the Cancel(). 100 // There is only one reference to |ref_counted| after the Cancel().
101 cancelable.Cancel(); 101 cancelable.Cancel();
102 EXPECT_TRUE(cancelable.IsCancelled()); 102 EXPECT_TRUE(cancelable.IsCancelled());
103 EXPECT_TRUE(ref_counted.get()); 103 EXPECT_TRUE(ref_counted.get());
104 EXPECT_TRUE(ref_counted->HasOneRef()); 104 EXPECT_TRUE(ref_counted->HasOneRef());
105 } 105 }
106 106
107 // Reset(). 107 // Reset().
108 // - Reset() replaces the existing wrapped callback with a new callback. 108 // - Reset() replaces the existing wrapped callback with a new callback.
109 // - Reset() deactivates outstanding callbacks. 109 // - Reset() deactivates outstanding callbacks.
110 TEST(CancelableCallbackTest, Reset) { 110 TEST(CancelableCallbackTest, Reset) {
111 int count = 0; 111 int count = 0;
112 CancelableCallback cancelable( 112 CancelableClosure cancelable(
113 base::Bind(&Increment, base::Unretained(&count))); 113 base::Bind(&Increment, base::Unretained(&count)));
114 114
115 base::Closure callback = cancelable.callback(); 115 base::Closure callback = cancelable.callback();
116 callback.Run(); 116 callback.Run();
117 EXPECT_EQ(1, count); 117 EXPECT_EQ(1, count);
118 118
119 callback.Run(); 119 callback.Run();
120 EXPECT_EQ(2, count); 120 EXPECT_EQ(2, count);
121 121
122 cancelable.Reset( 122 cancelable.Reset(
(...skipping 10 matching lines...) Expand all
133 base::Closure callback2 = cancelable.callback(); 133 base::Closure callback2 = cancelable.callback();
134 ASSERT_FALSE(callback2.is_null()); 134 ASSERT_FALSE(callback2.is_null());
135 135
136 callback2.Run(); 136 callback2.Run();
137 EXPECT_EQ(5, count); 137 EXPECT_EQ(5, count);
138 } 138 }
139 139
140 // IsCanceled(). 140 // IsCanceled().
141 // - Cancel() transforms the CancelableCallback into a cancelled state. 141 // - Cancel() transforms the CancelableCallback into a cancelled state.
142 TEST(CancelableCallbackTest, IsNull) { 142 TEST(CancelableCallbackTest, IsNull) {
143 CancelableCallback cancelable; 143 CancelableClosure cancelable;
144 EXPECT_TRUE(cancelable.IsCancelled()); 144 EXPECT_TRUE(cancelable.IsCancelled());
145 145
146 int count = 0; 146 int count = 0;
147 cancelable.Reset(base::Bind(&Increment, 147 cancelable.Reset(base::Bind(&Increment,
148 base::Unretained(&count))); 148 base::Unretained(&count)));
149 EXPECT_FALSE(cancelable.IsCancelled()); 149 EXPECT_FALSE(cancelable.IsCancelled());
150 150
151 cancelable.Cancel(); 151 cancelable.Cancel();
152 EXPECT_TRUE(cancelable.IsCancelled()); 152 EXPECT_TRUE(cancelable.IsCancelled());
153 } 153 }
154 154
155 // CancelableCallback posted to a MessageLoop with PostTask. 155 // CancelableCallback posted to a MessageLoop with PostTask.
156 // - Callbacks posted to a MessageLoop can be cancelled. 156 // - Callbacks posted to a MessageLoop can be cancelled.
157 TEST(CancelableCallbackTest, PostTask) { 157 TEST(CancelableCallbackTest, PostTask) {
158 MessageLoop loop(MessageLoop::TYPE_DEFAULT); 158 MessageLoop loop(MessageLoop::TYPE_DEFAULT);
159 159
160 int count = 0; 160 int count = 0;
161 CancelableCallback cancelable(base::Bind(&Increment, 161 CancelableClosure cancelable(base::Bind(&Increment,
162 base::Unretained(&count))); 162 base::Unretained(&count)));
163 163
164 MessageLoop::current()->PostTask(FROM_HERE, cancelable.callback()); 164 MessageLoop::current()->PostTask(FROM_HERE, cancelable.callback());
165 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 165 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
166 MessageLoop::current()->Run(); 166 MessageLoop::current()->Run();
167 167
168 EXPECT_EQ(1, count); 168 EXPECT_EQ(1, count);
169 169
170 MessageLoop::current()->PostTask(FROM_HERE, cancelable.callback()); 170 MessageLoop::current()->PostTask(FROM_HERE, cancelable.callback());
171 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 171 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
172 172
173 // Cancel before running the message loop. 173 // Cancel before running the message loop.
174 cancelable.Cancel(); 174 cancelable.Cancel();
175 MessageLoop::current()->Run(); 175 MessageLoop::current()->Run();
176 176
177 // Callback never ran due to cancellation; count is the same. 177 // Callback never ran due to cancellation; count is the same.
178 EXPECT_EQ(1, count); 178 EXPECT_EQ(1, count);
179 } 179 }
180 180
181 } // namespace 181 } // namespace
182 } // namespace base 182 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698