blob: 75d97a639a07be72185a3b341d9aa6c56a9bd531 [file] [log] [blame]
henrike@webrtc.orgf7795df2014-05-13 18:00:26 +00001/*
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