Add tests for ScopedCFTypeRef.

Copy the chromium pattern of taking Traits as template args to be
able to write a testable implementation of ScopedTypeRef.

Add unit tests for th current implementation.

Bug: webrtc:7825
Change-Id: I26017952c042c8323b9c3841ec309e32d1c04a85
Reviewed-on: https://webrtc-review.googlesource.com/5621
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20165}
This commit is contained in:
Kári Tristan Helgason
2017-10-05 14:06:52 +02:00
committed by Commit Bot
parent d312a9149f
commit ca95748c73
3 changed files with 148 additions and 20 deletions

View File

@ -0,0 +1,104 @@
/*
* Copyright 2017 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 "sdk/objc/Framework/Classes/Common/scoped_cftyperef.h"
#include "test/gtest.h"
namespace {
struct TestType {
TestType() : has_value(true) {}
TestType(bool b) : has_value(b) {}
operator bool() { return has_value; }
bool has_value;
int retain_count = 0;
};
typedef TestType* TestTypeRef;
struct TestTypeTraits {
static TestTypeRef InvalidValue() { return TestTypeRef(false); }
static void Release(TestTypeRef t) { t->retain_count--; }
static TestTypeRef Retain(TestTypeRef t) {
t->retain_count++;
return t;
}
};
} // namespace
using ScopedTestType = rtc::internal::ScopedTypeRef<TestTypeRef, TestTypeTraits>;
// In these tests we sometime introduce variables just to
// observe side-effects. Ignore the compilers complaints.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
TEST(ScopedTypeRefTest, ShouldNotRetainByDefault) {
TestType a;
ScopedTestType ref(&a);
EXPECT_EQ(0, a.retain_count);
}
TEST(ScopedTypeRefTest, ShouldRetainWithPolicy) {
TestType a;
ScopedTestType ref(&a, rtc::RetainPolicy::RETAIN);
EXPECT_EQ(1, a.retain_count);
}
TEST(ScopedTypeRefTest, ShouldReleaseWhenLeavingScope) {
TestType a;
EXPECT_EQ(0, a.retain_count);
{
ScopedTestType ref(&a, rtc::RetainPolicy::RETAIN);
EXPECT_EQ(1, a.retain_count);
}
EXPECT_EQ(0, a.retain_count);
}
TEST(ScopedTypeRefTest, ShouldBeCopyable) {
TestType a;
EXPECT_EQ(0, a.retain_count);
{
ScopedTestType ref1(&a, rtc::RetainPolicy::RETAIN);
EXPECT_EQ(1, a.retain_count);
ScopedTestType ref2 = ref1;
EXPECT_EQ(2, a.retain_count);
}
EXPECT_EQ(0, a.retain_count);
}
TEST(ScopedTypeRefTest, CanReleaseOwnership) {
TestType a;
EXPECT_EQ(0, a.retain_count);
{
ScopedTestType ref(&a, rtc::RetainPolicy::RETAIN);
EXPECT_EQ(1, a.retain_count);
TestTypeRef b = ref.release();
}
EXPECT_EQ(1, a.retain_count);
}
TEST(ScopedTypeRefTest, ShouldBeTestableForTruthiness) {
ScopedTestType ref;
EXPECT_FALSE(ref);
TestType a;
ref = &a;
EXPECT_TRUE(ref);
ref.release();
EXPECT_FALSE(ref);
}
TEST(ScopedTypeRefTest, ShouldProvideAccessToWrappedType) {
TestType a;
ScopedTestType ref(&a);
EXPECT_EQ(&(a.retain_count), &(ref->retain_count));
}
#pragma clang diagnostic pop