1 /* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/base/gunit.h" 12 #include "webrtc/base/referencecountedsingletonfactory.h" 13 14 namespace rtc { 15 16 class MyExistenceWatcher { 17 public: 18 MyExistenceWatcher() { create_called_ = true; } 19 ~MyExistenceWatcher() { delete_called_ = true; } 20 21 static bool create_called_; 22 static bool delete_called_; 23 }; 24 25 bool MyExistenceWatcher::create_called_ = false; 26 bool MyExistenceWatcher::delete_called_ = false; 27 28 class TestReferenceCountedSingletonFactory : 29 public ReferenceCountedSingletonFactory<MyExistenceWatcher> { 30 protected: 31 virtual bool SetupInstance() { 32 instance_.reset(new MyExistenceWatcher()); 33 return true; 34 } 35 36 virtual void CleanupInstance() { 37 instance_.reset(); 38 } 39 }; 40 41 static void DoCreateAndGoOutOfScope( 42 ReferenceCountedSingletonFactory<MyExistenceWatcher> *factory) { 43 rcsf_ptr<MyExistenceWatcher> ptr(factory); 44 ptr.get(); 45 // and now ptr should go out of scope. 46 } 47 48 TEST(ReferenceCountedSingletonFactory, ZeroReferenceCountCausesDeletion) { 49 TestReferenceCountedSingletonFactory factory; 50 MyExistenceWatcher::delete_called_ = false; 51 DoCreateAndGoOutOfScope(&factory); 52 EXPECT_TRUE(MyExistenceWatcher::delete_called_); 53 } 54 55 TEST(ReferenceCountedSingletonFactory, NonZeroReferenceCountDoesNotDelete) { 56 TestReferenceCountedSingletonFactory factory; 57 rcsf_ptr<MyExistenceWatcher> ptr(&factory); 58 ptr.get(); 59 MyExistenceWatcher::delete_called_ = false; 60 DoCreateAndGoOutOfScope(&factory); 61 EXPECT_FALSE(MyExistenceWatcher::delete_called_); 62 } 63 64 TEST(ReferenceCountedSingletonFactory, ReturnedPointersReferToSameThing) { 65 TestReferenceCountedSingletonFactory factory; 66 rcsf_ptr<MyExistenceWatcher> one(&factory), two(&factory); 67 68 EXPECT_EQ(one.get(), two.get()); 69 } 70 71 TEST(ReferenceCountedSingletonFactory, Release) { 72 TestReferenceCountedSingletonFactory factory; 73 74 rcsf_ptr<MyExistenceWatcher> one(&factory); 75 one.get(); 76 77 MyExistenceWatcher::delete_called_ = false; 78 one.release(); 79 EXPECT_TRUE(MyExistenceWatcher::delete_called_); 80 } 81 82 TEST(ReferenceCountedSingletonFactory, GetWithoutRelease) { 83 TestReferenceCountedSingletonFactory factory; 84 rcsf_ptr<MyExistenceWatcher> one(&factory); 85 one.get(); 86 87 MyExistenceWatcher::create_called_ = false; 88 one.get(); 89 EXPECT_FALSE(MyExistenceWatcher::create_called_); 90 } 91 92 TEST(ReferenceCountedSingletonFactory, GetAfterRelease) { 93 TestReferenceCountedSingletonFactory factory; 94 rcsf_ptr<MyExistenceWatcher> one(&factory); 95 96 MyExistenceWatcher::create_called_ = false; 97 one.release(); 98 one.get(); 99 EXPECT_TRUE(MyExistenceWatcher::create_called_); 100 } 101 102 TEST(ReferenceCountedSingletonFactory, MultipleReleases) { 103 TestReferenceCountedSingletonFactory factory; 104 rcsf_ptr<MyExistenceWatcher> one(&factory), two(&factory); 105 106 MyExistenceWatcher::create_called_ = false; 107 MyExistenceWatcher::delete_called_ = false; 108 one.release(); 109 EXPECT_FALSE(MyExistenceWatcher::delete_called_); 110 one.release(); 111 EXPECT_FALSE(MyExistenceWatcher::delete_called_); 112 one.release(); 113 EXPECT_FALSE(MyExistenceWatcher::delete_called_); 114 one.get(); 115 EXPECT_TRUE(MyExistenceWatcher::create_called_); 116 } 117 118 TEST(ReferenceCountedSingletonFactory, Existentialism) { 119 TestReferenceCountedSingletonFactory factory; 120 121 rcsf_ptr<MyExistenceWatcher> one(&factory); 122 123 MyExistenceWatcher::create_called_ = false; 124 MyExistenceWatcher::delete_called_ = false; 125 126 one.get(); 127 EXPECT_TRUE(MyExistenceWatcher::create_called_); 128 one.release(); 129 EXPECT_TRUE(MyExistenceWatcher::delete_called_); 130 } 131 132 } // namespace rtc 133