147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h"
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/referencecountedsingletonfactory.h"
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass MyExistenceWatcher {
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher() { create_called_ = true; }
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ~MyExistenceWatcher() { delete_called_ = true; }
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool create_called_;
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool delete_called_;
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool MyExistenceWatcher::create_called_ = false;
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool MyExistenceWatcher::delete_called_ = false;
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass TestReferenceCountedSingletonFactory :
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    public ReferenceCountedSingletonFactory<MyExistenceWatcher> {
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected:
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual bool SetupInstance() {
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    instance_.reset(new MyExistenceWatcher());
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return true;
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual void CleanupInstance() {
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    instance_.reset();
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic void DoCreateAndGoOutOfScope(
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ReferenceCountedSingletonFactory<MyExistenceWatcher> *factory) {
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rcsf_ptr<MyExistenceWatcher> ptr(factory);
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ptr.get();
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // and now ptr should go out of scope.
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(ReferenceCountedSingletonFactory, ZeroReferenceCountCausesDeletion) {
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TestReferenceCountedSingletonFactory factory;
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher::delete_called_ = false;
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DoCreateAndGoOutOfScope(&factory);
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(MyExistenceWatcher::delete_called_);
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(ReferenceCountedSingletonFactory, NonZeroReferenceCountDoesNotDelete) {
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TestReferenceCountedSingletonFactory factory;
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rcsf_ptr<MyExistenceWatcher> ptr(&factory);
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ptr.get();
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher::delete_called_ = false;
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DoCreateAndGoOutOfScope(&factory);
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(MyExistenceWatcher::delete_called_);
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(ReferenceCountedSingletonFactory, ReturnedPointersReferToSameThing) {
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TestReferenceCountedSingletonFactory factory;
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rcsf_ptr<MyExistenceWatcher> one(&factory), two(&factory);
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(one.get(), two.get());
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(ReferenceCountedSingletonFactory, Release) {
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TestReferenceCountedSingletonFactory factory;
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rcsf_ptr<MyExistenceWatcher> one(&factory);
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.get();
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher::delete_called_ = false;
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.release();
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(MyExistenceWatcher::delete_called_);
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(ReferenceCountedSingletonFactory, GetWithoutRelease) {
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TestReferenceCountedSingletonFactory factory;
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rcsf_ptr<MyExistenceWatcher> one(&factory);
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.get();
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher::create_called_ = false;
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.get();
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(MyExistenceWatcher::create_called_);
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(ReferenceCountedSingletonFactory, GetAfterRelease) {
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TestReferenceCountedSingletonFactory factory;
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rcsf_ptr<MyExistenceWatcher> one(&factory);
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher::create_called_ = false;
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.release();
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.get();
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(MyExistenceWatcher::create_called_);
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(ReferenceCountedSingletonFactory, MultipleReleases) {
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TestReferenceCountedSingletonFactory factory;
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rcsf_ptr<MyExistenceWatcher> one(&factory), two(&factory);
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher::create_called_ = false;
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher::delete_called_ = false;
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.release();
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(MyExistenceWatcher::delete_called_);
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.release();
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(MyExistenceWatcher::delete_called_);
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.release();
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(MyExistenceWatcher::delete_called_);
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.get();
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(MyExistenceWatcher::create_called_);
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(ReferenceCountedSingletonFactory, Existentialism) {
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TestReferenceCountedSingletonFactory factory;
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rcsf_ptr<MyExistenceWatcher> one(&factory);
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher::create_called_ = false;
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MyExistenceWatcher::delete_called_ = false;
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.get();
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(MyExistenceWatcher::create_called_);
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  one.release();
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(MyExistenceWatcher::delete_called_);
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
133