Chromium Code Reviews| 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 |