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:
committed by
Commit Bot
parent
d312a9149f
commit
ca95748c73
104
sdk/objc/Framework/UnitTests/scoped_cftyperef_tests.mm
Normal file
104
sdk/objc/Framework/UnitTests/scoped_cftyperef_tests.mm
Normal 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
|
||||
Reference in New Issue
Block a user