weak_ptr_unittest.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // Copyright (c) 2012 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. #include "butil/memory/weak_ptr.h"
  5. #include <string>
  6. #include "butil/debug/leak_annotations.h"
  7. #include "butil/memory/scoped_ptr.h"
  8. #include "butil/synchronization/waitable_event.h"
  9. #include <gtest/gtest.h>
  10. namespace butil {
  11. namespace {
  12. struct Base {
  13. std::string member;
  14. };
  15. struct Derived : public Base {};
  16. struct TargetBase {};
  17. struct Target : public TargetBase, public SupportsWeakPtr<Target> {
  18. virtual ~Target() {}
  19. };
  20. struct DerivedTarget : public Target {};
  21. struct Arrow {
  22. WeakPtr<Target> target;
  23. };
  24. struct TargetWithFactory : public Target {
  25. TargetWithFactory() : factory(this) {}
  26. WeakPtrFactory<Target> factory;
  27. };
  28. } // namespace
  29. TEST(WeakPtrFactoryTest, Basic) {
  30. int data;
  31. WeakPtrFactory<int> factory(&data);
  32. WeakPtr<int> ptr = factory.GetWeakPtr();
  33. EXPECT_EQ(&data, ptr.get());
  34. }
  35. TEST(WeakPtrFactoryTest, Comparison) {
  36. int data;
  37. WeakPtrFactory<int> factory(&data);
  38. WeakPtr<int> ptr = factory.GetWeakPtr();
  39. WeakPtr<int> ptr2 = ptr;
  40. EXPECT_EQ(ptr.get(), ptr2.get());
  41. }
  42. TEST(WeakPtrFactoryTest, OutOfScope) {
  43. WeakPtr<int> ptr;
  44. EXPECT_EQ(NULL, ptr.get());
  45. {
  46. int data;
  47. WeakPtrFactory<int> factory(&data);
  48. ptr = factory.GetWeakPtr();
  49. }
  50. EXPECT_EQ(NULL, ptr.get());
  51. }
  52. TEST(WeakPtrFactoryTest, Multiple) {
  53. WeakPtr<int> a, b;
  54. {
  55. int data;
  56. WeakPtrFactory<int> factory(&data);
  57. a = factory.GetWeakPtr();
  58. b = factory.GetWeakPtr();
  59. EXPECT_EQ(&data, a.get());
  60. EXPECT_EQ(&data, b.get());
  61. }
  62. EXPECT_EQ(NULL, a.get());
  63. EXPECT_EQ(NULL, b.get());
  64. }
  65. TEST(WeakPtrFactoryTest, MultipleStaged) {
  66. WeakPtr<int> a;
  67. {
  68. int data;
  69. WeakPtrFactory<int> factory(&data);
  70. a = factory.GetWeakPtr();
  71. {
  72. WeakPtr<int> b = factory.GetWeakPtr();
  73. }
  74. EXPECT_TRUE(NULL != a.get());
  75. }
  76. EXPECT_EQ(NULL, a.get());
  77. }
  78. TEST(WeakPtrFactoryTest, Dereference) {
  79. Base data;
  80. data.member = "123456";
  81. WeakPtrFactory<Base> factory(&data);
  82. WeakPtr<Base> ptr = factory.GetWeakPtr();
  83. EXPECT_EQ(&data, ptr.get());
  84. EXPECT_EQ(data.member, (*ptr).member);
  85. EXPECT_EQ(data.member, ptr->member);
  86. }
  87. TEST(WeakPtrFactoryTest, UpCast) {
  88. Derived data;
  89. WeakPtrFactory<Derived> factory(&data);
  90. WeakPtr<Base> ptr = factory.GetWeakPtr();
  91. ptr = factory.GetWeakPtr();
  92. EXPECT_EQ(ptr.get(), &data);
  93. }
  94. TEST(WeakPtrTest, SupportsWeakPtr) {
  95. Target target;
  96. WeakPtr<Target> ptr = target.AsWeakPtr();
  97. EXPECT_EQ(&target, ptr.get());
  98. }
  99. TEST(WeakPtrTest, DerivedTarget) {
  100. DerivedTarget target;
  101. WeakPtr<DerivedTarget> ptr = AsWeakPtr(&target);
  102. EXPECT_EQ(&target, ptr.get());
  103. }
  104. TEST(WeakPtrTest, InvalidateWeakPtrs) {
  105. int data;
  106. WeakPtrFactory<int> factory(&data);
  107. WeakPtr<int> ptr = factory.GetWeakPtr();
  108. EXPECT_EQ(&data, ptr.get());
  109. EXPECT_TRUE(factory.HasWeakPtrs());
  110. factory.InvalidateWeakPtrs();
  111. EXPECT_EQ(NULL, ptr.get());
  112. EXPECT_FALSE(factory.HasWeakPtrs());
  113. // Test that the factory can create new weak pointers after a
  114. // InvalidateWeakPtrs call, and they remain valid until the next
  115. // InvalidateWeakPtrs call.
  116. WeakPtr<int> ptr2 = factory.GetWeakPtr();
  117. EXPECT_EQ(&data, ptr2.get());
  118. EXPECT_TRUE(factory.HasWeakPtrs());
  119. factory.InvalidateWeakPtrs();
  120. EXPECT_EQ(NULL, ptr2.get());
  121. EXPECT_FALSE(factory.HasWeakPtrs());
  122. }
  123. TEST(WeakPtrTest, HasWeakPtrs) {
  124. int data;
  125. WeakPtrFactory<int> factory(&data);
  126. {
  127. WeakPtr<int> ptr = factory.GetWeakPtr();
  128. EXPECT_TRUE(factory.HasWeakPtrs());
  129. }
  130. EXPECT_FALSE(factory.HasWeakPtrs());
  131. }
  132. } // namespace butil