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
14namespace rtc {
15
16class 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
25bool MyExistenceWatcher::create_called_ = false;
26bool MyExistenceWatcher::delete_called_ = false;
27
28class 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
41static 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
48TEST(ReferenceCountedSingletonFactory, ZeroReferenceCountCausesDeletion) {
49  TestReferenceCountedSingletonFactory factory;
50  MyExistenceWatcher::delete_called_ = false;
51  DoCreateAndGoOutOfScope(&factory);
52  EXPECT_TRUE(MyExistenceWatcher::delete_called_);
53}
54
55TEST(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
64TEST(ReferenceCountedSingletonFactory, ReturnedPointersReferToSameThing) {
65  TestReferenceCountedSingletonFactory factory;
66  rcsf_ptr<MyExistenceWatcher> one(&factory), two(&factory);
67
68  EXPECT_EQ(one.get(), two.get());
69}
70
71TEST(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
82TEST(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
92TEST(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
102TEST(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
118TEST(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