|  | /* | 
|  | *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #include "webrtc/base/gunit.h" | 
|  | #include "webrtc/base/referencecountedsingletonfactory.h" | 
|  |  | 
|  | namespace rtc { | 
|  |  | 
|  | class MyExistenceWatcher { | 
|  | public: | 
|  | MyExistenceWatcher() { create_called_ = true; } | 
|  | ~MyExistenceWatcher() { delete_called_ = true; } | 
|  |  | 
|  | static bool create_called_; | 
|  | static bool delete_called_; | 
|  | }; | 
|  |  | 
|  | bool MyExistenceWatcher::create_called_ = false; | 
|  | bool MyExistenceWatcher::delete_called_ = false; | 
|  |  | 
|  | class TestReferenceCountedSingletonFactory : | 
|  | public ReferenceCountedSingletonFactory<MyExistenceWatcher> { | 
|  | protected: | 
|  | virtual bool SetupInstance() { | 
|  | instance_.reset(new MyExistenceWatcher()); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | virtual void CleanupInstance() { | 
|  | instance_.reset(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | static void DoCreateAndGoOutOfScope( | 
|  | ReferenceCountedSingletonFactory<MyExistenceWatcher> *factory) { | 
|  | rcsf_ptr<MyExistenceWatcher> ptr(factory); | 
|  | ptr.get(); | 
|  | // and now ptr should go out of scope. | 
|  | } | 
|  |  | 
|  | TEST(ReferenceCountedSingletonFactory, ZeroReferenceCountCausesDeletion) { | 
|  | TestReferenceCountedSingletonFactory factory; | 
|  | MyExistenceWatcher::delete_called_ = false; | 
|  | DoCreateAndGoOutOfScope(&factory); | 
|  | EXPECT_TRUE(MyExistenceWatcher::delete_called_); | 
|  | } | 
|  |  | 
|  | TEST(ReferenceCountedSingletonFactory, NonZeroReferenceCountDoesNotDelete) { | 
|  | TestReferenceCountedSingletonFactory factory; | 
|  | rcsf_ptr<MyExistenceWatcher> ptr(&factory); | 
|  | ptr.get(); | 
|  | MyExistenceWatcher::delete_called_ = false; | 
|  | DoCreateAndGoOutOfScope(&factory); | 
|  | EXPECT_FALSE(MyExistenceWatcher::delete_called_); | 
|  | } | 
|  |  | 
|  | TEST(ReferenceCountedSingletonFactory, ReturnedPointersReferToSameThing) { | 
|  | TestReferenceCountedSingletonFactory factory; | 
|  | rcsf_ptr<MyExistenceWatcher> one(&factory), two(&factory); | 
|  |  | 
|  | EXPECT_EQ(one.get(), two.get()); | 
|  | } | 
|  |  | 
|  | TEST(ReferenceCountedSingletonFactory, Release) { | 
|  | TestReferenceCountedSingletonFactory factory; | 
|  |  | 
|  | rcsf_ptr<MyExistenceWatcher> one(&factory); | 
|  | one.get(); | 
|  |  | 
|  | MyExistenceWatcher::delete_called_ = false; | 
|  | one.release(); | 
|  | EXPECT_TRUE(MyExistenceWatcher::delete_called_); | 
|  | } | 
|  |  | 
|  | TEST(ReferenceCountedSingletonFactory, GetWithoutRelease) { | 
|  | TestReferenceCountedSingletonFactory factory; | 
|  | rcsf_ptr<MyExistenceWatcher> one(&factory); | 
|  | one.get(); | 
|  |  | 
|  | MyExistenceWatcher::create_called_ = false; | 
|  | one.get(); | 
|  | EXPECT_FALSE(MyExistenceWatcher::create_called_); | 
|  | } | 
|  |  | 
|  | TEST(ReferenceCountedSingletonFactory, GetAfterRelease) { | 
|  | TestReferenceCountedSingletonFactory factory; | 
|  | rcsf_ptr<MyExistenceWatcher> one(&factory); | 
|  |  | 
|  | MyExistenceWatcher::create_called_ = false; | 
|  | one.release(); | 
|  | one.get(); | 
|  | EXPECT_TRUE(MyExistenceWatcher::create_called_); | 
|  | } | 
|  |  | 
|  | TEST(ReferenceCountedSingletonFactory, MultipleReleases) { | 
|  | TestReferenceCountedSingletonFactory factory; | 
|  | rcsf_ptr<MyExistenceWatcher> one(&factory), two(&factory); | 
|  |  | 
|  | MyExistenceWatcher::create_called_ = false; | 
|  | MyExistenceWatcher::delete_called_ = false; | 
|  | one.release(); | 
|  | EXPECT_FALSE(MyExistenceWatcher::delete_called_); | 
|  | one.release(); | 
|  | EXPECT_FALSE(MyExistenceWatcher::delete_called_); | 
|  | one.release(); | 
|  | EXPECT_FALSE(MyExistenceWatcher::delete_called_); | 
|  | one.get(); | 
|  | EXPECT_TRUE(MyExistenceWatcher::create_called_); | 
|  | } | 
|  |  | 
|  | TEST(ReferenceCountedSingletonFactory, Existentialism) { | 
|  | TestReferenceCountedSingletonFactory factory; | 
|  |  | 
|  | rcsf_ptr<MyExistenceWatcher> one(&factory); | 
|  |  | 
|  | MyExistenceWatcher::create_called_ = false; | 
|  | MyExistenceWatcher::delete_called_ = false; | 
|  |  | 
|  | one.get(); | 
|  | EXPECT_TRUE(MyExistenceWatcher::create_called_); | 
|  | one.release(); | 
|  | EXPECT_TRUE(MyExistenceWatcher::delete_called_); | 
|  | } | 
|  |  | 
|  | }  // namespace rtc |