Index: webrtc/base/callback_unittest.cc |
diff --git a/webrtc/base/callback_unittest.cc b/webrtc/base/callback_unittest.cc |
index 66c939140ee2ef9e99e93416c2720819f204e105..db294cd96eb71a5d59e9accb98080dc50a494a32 100644 |
--- a/webrtc/base/callback_unittest.cc |
+++ b/webrtc/base/callback_unittest.cc |
@@ -11,6 +11,8 @@ |
#include "webrtc/base/bind.h" |
#include "webrtc/base/callback.h" |
#include "webrtc/base/gunit.h" |
+#include "webrtc/base/keep_ref_until_done.h" |
+#include "webrtc/base/refcount.h" |
namespace rtc { |
@@ -26,6 +28,21 @@ struct BindTester { |
int b(int x) const { return x * x; } |
}; |
+class RefCountedBindTester : public RefCountInterface { |
+ public: |
+ RefCountedBindTester() : count_(0) {} |
+ int AddRef() const override { |
+ return ++count_; |
+ } |
+ int Release() const { |
+ return --count_; |
+ } |
+ int RefCount() const { return count_; } |
+ |
+ private: |
+ mutable int count_; |
+}; |
+ |
} // namespace |
TEST(CallbackTest, VoidReturn) { |
@@ -78,4 +95,46 @@ TEST(CallbackTest, WithBind) { |
EXPECT_EQ(25, cb1()); |
} |
+TEST(KeepRefUntilDoneTest, simple) { |
+ RefCountedBindTester t; |
+ EXPECT_EQ(0, t.RefCount()); |
+ { |
+ Callback0<void> cb = KeepRefUntilDone(&t); |
+ EXPECT_EQ(1, t.RefCount()); |
+ cb(); |
+ EXPECT_EQ(1, t.RefCount()); |
+ cb(); |
+ EXPECT_EQ(1, t.RefCount()); |
+ } |
+ EXPECT_EQ(0, t.RefCount()); |
+} |
+ |
+TEST(KeepRefUntilDoneTest, copy) { |
+ RefCountedBindTester t; |
+ EXPECT_EQ(0, t.RefCount()); |
+ Callback0<void> cb2; |
+ { |
+ Callback0<void> cb = KeepRefUntilDone(&t); |
+ EXPECT_EQ(1, t.RefCount()); |
+ cb2 = cb; |
+ } |
+ EXPECT_EQ(1, t.RefCount()); |
+ cb2 = Callback0<void>(); |
+ EXPECT_EQ(0, t.RefCount()); |
+} |
+ |
+TEST(KeepRefUntilDoneTest, scopedref) { |
+ RefCountedBindTester t; |
+ EXPECT_EQ(0, t.RefCount()); |
+ { |
+ scoped_refptr<RefCountedBindTester> t_scoped_ref(&t); |
+ Callback0<void> cb = KeepRefUntilDone(t_scoped_ref); |
+ t_scoped_ref = nullptr; |
+ EXPECT_EQ(1, t.RefCount()); |
+ cb(); |
+ EXPECT_EQ(1, t.RefCount()); |
+ } |
+ EXPECT_EQ(0, t.RefCount()); |
+} |
+ |
} // namespace rtc |