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