| Index: sync/internal_api/public/util/proto_value_ptr_unittest.cc
|
| diff --git a/sync/internal_api/public/util/proto_value_ptr_unittest.cc b/sync/internal_api/public/util/proto_value_ptr_unittest.cc
|
| deleted file mode 100644
|
| index af0bcf5a0602f498d22785c7f1e14a7df76e7b59..0000000000000000000000000000000000000000
|
| --- a/sync/internal_api/public/util/proto_value_ptr_unittest.cc
|
| +++ /dev/null
|
| @@ -1,248 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "sync/internal_api/public/util/proto_value_ptr.h"
|
| -
|
| -#include <memory>
|
| -#include <utility>
|
| -
|
| -#include "base/macros.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace syncer {
|
| -
|
| -namespace {
|
| -
|
| -// Simple test struct that wraps an integer
|
| -struct IntValue {
|
| - public:
|
| - explicit IntValue(int value) { value_ = value; }
|
| - int value() { return value_; }
|
| -
|
| - private:
|
| - int value_;
|
| -};
|
| -
|
| -// TestValue class is used as a template argument with ProtoValuePtr<T>
|
| -class TestValue {
|
| - public:
|
| - TestValue() : value_(nullptr), is_default_(false) {}
|
| - explicit TestValue(int value)
|
| - : value_(new IntValue(value)), is_default_(false) {}
|
| -
|
| - ~TestValue() { g_delete_count++; }
|
| -
|
| - static void ResetCounters() {
|
| - g_copy_count = 0;
|
| - g_parse_count = 0;
|
| - g_delete_count = 0;
|
| - }
|
| -
|
| - static int copy_count() { return g_copy_count; }
|
| - static int parse_count() { return g_parse_count; }
|
| - static int delete_count() { return g_delete_count; }
|
| -
|
| - int value() const { return value_->value(); }
|
| - IntValue* value_ptr() const { return value_.get(); }
|
| - bool is_initialized() const { return !!value_; }
|
| - bool is_default() const { return is_default_; }
|
| -
|
| - // TestValue uses the default traits struct with ProtoValuePtr<TestValue>.
|
| - // The following 4 functions are expected by the traits struct to exist
|
| - // in this class.
|
| - void CopyFrom(const TestValue& from) {
|
| - // Expected to always copy from an initialized instance
|
| - // to an uninitialized one.
|
| - // Not expected either value to be default.
|
| - ASSERT_FALSE(is_initialized());
|
| - ASSERT_FALSE(is_default());
|
| - ASSERT_TRUE(from.is_initialized());
|
| - ASSERT_FALSE(from.is_default());
|
| - value_.reset(new IntValue(from.value()));
|
| - g_copy_count++;
|
| - }
|
| -
|
| - void Swap(TestValue* src) {
|
| - // Expected to always swap with an initialized instance.
|
| - // The current instance must always be an uninitialized one.
|
| - // Not expected either value to be default.
|
| - ASSERT_FALSE(is_initialized());
|
| - ASSERT_FALSE(is_default());
|
| - ASSERT_TRUE(src->is_initialized());
|
| - ASSERT_FALSE(src->is_default());
|
| - // Not exactly swap, but good enough for the test.
|
| - value_ = std::move(src->value_);
|
| - }
|
| -
|
| - void ParseFromArray(const void* blob, int length) {
|
| - // Similarly to CopyFrom this is expected to be called on
|
| - // an uninitialized instance.
|
| - ASSERT_FALSE(is_initialized());
|
| - ASSERT_FALSE(is_default());
|
| - // The blob is an address of an integer
|
| - ASSERT_EQ(static_cast<int>(sizeof(int)), length);
|
| - value_.reset(new IntValue(*static_cast<const int*>(blob)));
|
| - g_parse_count++;
|
| - }
|
| -
|
| - int ByteSize() const { return is_initialized() ? sizeof(int) : 0; }
|
| -
|
| - static const TestValue& default_instance() {
|
| - static TestValue default_instance;
|
| - default_instance.is_default_ = true;
|
| - return default_instance;
|
| - }
|
| -
|
| - private:
|
| - static int g_copy_count;
|
| - static int g_parse_count;
|
| - static int g_delete_count;
|
| -
|
| - std::unique_ptr<IntValue> value_;
|
| - bool is_default_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TestValue);
|
| -};
|
| -
|
| -// Static initializers.
|
| -int TestValue::g_copy_count = 0;
|
| -int TestValue::g_parse_count = 0;
|
| -int TestValue::g_delete_count = 0;
|
| -
|
| -} // namespace
|
| -
|
| -typedef ProtoValuePtr<TestValue> TestPtr;
|
| -
|
| -class ProtoValuePtrTest : public testing::Test {
|
| - public:
|
| - void SetUp() override { TestValue::ResetCounters(); }
|
| -
|
| - static bool WrappedValuesAreShared(const TestPtr& ptr1, const TestPtr& ptr2) {
|
| - const TestValue& wrapped_value_1 = ptr1.value();
|
| - const TestValue& wrapped_value_2 = ptr2.value();
|
| - // Compare addresses.
|
| - return &wrapped_value_1 == &wrapped_value_2;
|
| - }
|
| -};
|
| -
|
| -TEST_F(ProtoValuePtrTest, ValueAssignment) {
|
| - // Basic assignment and default value.
|
| - TestValue t1(1);
|
| - {
|
| - TestPtr ptr1;
|
| - EXPECT_TRUE(ptr1->is_default());
|
| -
|
| - ptr1.set_value(t1);
|
| - EXPECT_FALSE(ptr1->is_default());
|
| - EXPECT_EQ(1, ptr1->value());
|
| - }
|
| -
|
| - EXPECT_EQ(1, TestValue::copy_count());
|
| - EXPECT_EQ(1, TestValue::delete_count());
|
| -}
|
| -
|
| -TEST_F(ProtoValuePtrTest, ValueSwap) {
|
| - TestValue t2(2);
|
| - {
|
| - TestPtr ptr2;
|
| - EXPECT_TRUE(ptr2->is_default());
|
| -
|
| - IntValue* inner_ptr = t2.value_ptr();
|
| -
|
| - ptr2.swap_value(&t2);
|
| - EXPECT_FALSE(ptr2->is_default());
|
| - EXPECT_EQ(2, ptr2->value());
|
| - EXPECT_EQ(inner_ptr, ptr2->value_ptr());
|
| - }
|
| -
|
| - EXPECT_EQ(0, TestValue::copy_count());
|
| - EXPECT_EQ(1, TestValue::delete_count());
|
| -}
|
| -
|
| -TEST_F(ProtoValuePtrTest, SharingTest) {
|
| - // Sharing between two pointers.
|
| - TestValue empty;
|
| - TestValue t2(2);
|
| - TestValue t3(3);
|
| - {
|
| - TestPtr ptr2;
|
| - TestPtr ptr3;
|
| -
|
| - EXPECT_TRUE(ptr2->is_default());
|
| - EXPECT_TRUE(ptr3->is_default());
|
| - EXPECT_EQ(0, TestValue::copy_count());
|
| - EXPECT_EQ(0, TestValue::delete_count());
|
| -
|
| - ptr2.set_value(t2);
|
| - EXPECT_EQ(1, TestValue::copy_count());
|
| - EXPECT_EQ(0, TestValue::delete_count());
|
| -
|
| - ptr3 = ptr2;
|
| - // Both |ptr2| and |ptr3| now share the same value "2".
|
| - // No additional copies expected.
|
| - EXPECT_EQ(1, TestValue::copy_count());
|
| - EXPECT_EQ(0, TestValue::delete_count());
|
| - EXPECT_FALSE(ptr3->is_default());
|
| - EXPECT_EQ(2, ptr3->value());
|
| - EXPECT_TRUE(WrappedValuesAreShared(ptr2, ptr3));
|
| -
|
| - // Stop sharing - |ptr2| is "3" and |ptr3| is still "2".
|
| - ptr2.set_value(t3);
|
| - EXPECT_FALSE(WrappedValuesAreShared(ptr2, ptr3));
|
| - EXPECT_EQ(3, ptr2->value());
|
| - EXPECT_EQ(2, ptr3->value());
|
| - // No extra copies or deletions expected.
|
| - EXPECT_EQ(2, TestValue::copy_count());
|
| - EXPECT_EQ(0, TestValue::delete_count());
|
| -
|
| - // |ptr3| still has the old value.
|
| - EXPECT_EQ(2, ptr3->value());
|
| -
|
| - // Share again. Both values are "3".
|
| - ptr3 = ptr2;
|
| - EXPECT_EQ(3, ptr3->value());
|
| - // This should have resulted in deleting the wrapper for the value "2".
|
| - EXPECT_EQ(1, TestValue::delete_count());
|
| - // No extra copies expected.
|
| - EXPECT_EQ(2, TestValue::copy_count());
|
| -
|
| - // Set default value to one of the pointers.
|
| - ptr2.set_value(empty);
|
| - EXPECT_TRUE(ptr2->is_default());
|
| - // The other one is still intact.
|
| - EXPECT_FALSE(ptr3->is_default());
|
| - EXPECT_EQ(3, ptr3->value());
|
| - // No extra copies or deletions expected.
|
| - EXPECT_EQ(1, TestValue::delete_count());
|
| - EXPECT_EQ(2, TestValue::copy_count());
|
| -
|
| - // Copy the default value between the pointers.
|
| - ptr3 = ptr2;
|
| - EXPECT_TRUE(ptr3->is_default());
|
| - // The wrapper for "3" is now deleted.
|
| - EXPECT_EQ(2, TestValue::delete_count());
|
| - }
|
| -
|
| - // No extra deletions expected upon leaving the scope.
|
| - EXPECT_EQ(2, TestValue::delete_count());
|
| -}
|
| -
|
| -TEST_F(ProtoValuePtrTest, ParsingTest) {
|
| - int v1 = 21;
|
| -
|
| - {
|
| - TestPtr ptr1;
|
| -
|
| - ptr1.load(&v1, sizeof(int));
|
| -
|
| - EXPECT_EQ(1, TestValue::parse_count());
|
| - EXPECT_EQ(0, TestValue::copy_count());
|
| -
|
| - EXPECT_EQ(v1, ptr1->value());
|
| - }
|
| -
|
| - EXPECT_EQ(1, TestValue::delete_count());
|
| -}
|
| -
|
| -} // namespace syncer
|
|
|