blob: 75d97a639a07be72185a3b341d9aa6c56a9bd531 [file] [log] [blame]
/*
* 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