Index: webrtc/base/callback_unittest.cc |
diff --git a/webrtc/base/callback_unittest.cc b/webrtc/base/callback_unittest.cc |
index 66c939140ee2ef9e99e93416c2720819f204e105..876206ac517b0680ac6c947de9231c8fbbe89ddd 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/refcount.h" |
+#include "webrtc/base/release_when_done_callback.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,32 @@ TEST(CallbackTest, WithBind) { |
EXPECT_EQ(25, cb1()); |
} |
+TEST(ReleaseWhenDoneCallbackTest, simple) { |
+ RefCountedBindTester t; |
+ EXPECT_EQ(0, t.RefCount()); |
+ { |
+ Callback0<void> cb = ReleaseWhenDoneCallback(&t); |
+ EXPECT_EQ(1, t.RefCount()); |
+ cb(); |
+ EXPECT_EQ(1, t.RefCount()); |
+ cb(); |
+ EXPECT_EQ(1, t.RefCount()); |
+ } |
+ EXPECT_EQ(0, t.RefCount()); |
+} |
+ |
+TEST(ReleaseWhenDoneCallbackTest, copy) { |
+ RefCountedBindTester t; |
+ EXPECT_EQ(0, t.RefCount()); |
+ Callback0<void> cb2; |
+ { |
+ Callback0<void> cb = ReleaseWhenDoneCallback(&t); |
+ EXPECT_EQ(1, t.RefCount()); |
+ cb2 = cb; |
tommi
2015/11/30 08:45:51
add EXPECT_EQ(2, t.RefCount()); ?
perkj_webrtc
2015/11/30 12:54:19
Actually no - it is still one. See callback. Each
tommi
2015/11/30 13:05:01
Brilliant
|
+ } |
+ EXPECT_EQ(1, t.RefCount()); |
+ cb2 = Callback0<void>(); |
+ EXPECT_EQ(0, t.RefCount()); |
+} |
+ |
} // namespace rtc |