ref_counted_unittest.cc 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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/ref_counted.h"
  5. #include <gtest/gtest.h>
  6. namespace {
  7. class SelfAssign : public butil::RefCounted<SelfAssign> {
  8. friend class butil::RefCounted<SelfAssign>;
  9. ~SelfAssign() {}
  10. };
  11. class CheckDerivedMemberAccess : public scoped_refptr<SelfAssign> {
  12. public:
  13. CheckDerivedMemberAccess() {
  14. // This shouldn't compile if we don't have access to the member variable.
  15. SelfAssign** pptr = &ptr_;
  16. EXPECT_EQ(*pptr, ptr_);
  17. }
  18. };
  19. class ScopedRefPtrToSelf : public butil::RefCounted<ScopedRefPtrToSelf> {
  20. public:
  21. ScopedRefPtrToSelf() : self_ptr_(this) {}
  22. static bool was_destroyed() { return was_destroyed_; }
  23. void SelfDestruct() { self_ptr_ = NULL; }
  24. private:
  25. friend class butil::RefCounted<ScopedRefPtrToSelf>;
  26. ~ScopedRefPtrToSelf() { was_destroyed_ = true; }
  27. static bool was_destroyed_;
  28. scoped_refptr<ScopedRefPtrToSelf> self_ptr_;
  29. };
  30. bool ScopedRefPtrToSelf::was_destroyed_ = false;
  31. } // end namespace
  32. TEST(RefCountedUnitTest, TestSelfAssignment) {
  33. SelfAssign* p = new SelfAssign;
  34. scoped_refptr<SelfAssign> var(p);
  35. var = var;
  36. EXPECT_EQ(var.get(), p);
  37. }
  38. TEST(RefCountedUnitTest, ScopedRefPtrMemberAccess) {
  39. CheckDerivedMemberAccess check;
  40. }
  41. TEST(RefCountedUnitTest, ScopedRefPtrToSelf) {
  42. ScopedRefPtrToSelf* check = new ScopedRefPtrToSelf();
  43. EXPECT_FALSE(ScopedRefPtrToSelf::was_destroyed());
  44. check->SelfDestruct();
  45. EXPECT_TRUE(ScopedRefPtrToSelf::was_destroyed());
  46. }
  47. TEST(RefCountedUnitTest, ScopedRefPtrBooleanOperations) {
  48. scoped_refptr<SelfAssign> p1 = new SelfAssign;
  49. scoped_refptr<SelfAssign> p2;
  50. EXPECT_TRUE(p1);
  51. EXPECT_FALSE(!p1);
  52. EXPECT_TRUE(!p2);
  53. EXPECT_FALSE(p2);
  54. EXPECT_NE(p1, p2);
  55. SelfAssign* raw_p = new SelfAssign;
  56. p2 = raw_p;
  57. EXPECT_NE(p1, p2);
  58. EXPECT_EQ(raw_p, p2);
  59. p2 = p1;
  60. EXPECT_NE(raw_p, p2);
  61. EXPECT_EQ(p1, p2);
  62. }