| // Copyright 2014 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/syncable/entry_kernel.h" |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace syncer { |
| |
| namespace syncable { |
| |
| class EntryKernelTest : public testing::Test {}; |
| |
| TEST_F(EntryKernelTest, ToValue) { |
| EntryKernel kernel; |
| scoped_ptr<base::DictionaryValue> value(kernel.ToValue(NULL)); |
| if (value) { |
| // Not much to check without repeating the ToValue() code. |
| EXPECT_TRUE(value->HasKey("isDirty")); |
| // The extra +2 is for "isDirty" and "modelType". |
| EXPECT_EQ(BIT_TEMPS_END - BEGIN_FIELDS + 2, |
| static_cast<int>(value->size())); |
| } else { |
| ADD_FAILURE(); |
| } |
| } |
| |
| bool ProtoFieldValuesEqual(const sync_pb::EntitySpecifics& v1, |
| const sync_pb::EntitySpecifics& v2) { |
| return v1.SerializeAsString() == v2.SerializeAsString(); |
| } |
| |
| bool ProtoFieldValuesAreSame(const sync_pb::EntitySpecifics& v1, |
| const sync_pb::EntitySpecifics& v2) { |
| return &v1 == &v2; |
| } |
| |
| bool ProtoFieldValueIsDefault(const sync_pb::EntitySpecifics& v) { |
| return ProtoFieldValuesAreSame(v, |
| sync_pb::EntitySpecifics::default_instance()); |
| } |
| |
| // Tests default value, assignment, and sharing of proto fields. |
| TEST_F(EntryKernelTest, ProtoFieldTest) { |
| EntryKernel kernel; |
| |
| // Check default values. |
| EXPECT_TRUE(ProtoFieldValueIsDefault(kernel.ref(SPECIFICS))); |
| EXPECT_TRUE(ProtoFieldValueIsDefault(kernel.ref(SERVER_SPECIFICS))); |
| EXPECT_TRUE(ProtoFieldValueIsDefault(kernel.ref(BASE_SERVER_SPECIFICS))); |
| |
| sync_pb::EntitySpecifics specifics; |
| |
| // Assign empty value and verify that the field still returns the |
| // default value. |
| kernel.put(SPECIFICS, specifics); |
| EXPECT_TRUE(ProtoFieldValueIsDefault(kernel.ref(SPECIFICS))); |
| EXPECT_TRUE(ProtoFieldValuesEqual(kernel.ref(SPECIFICS), specifics)); |
| |
| // Verifies that the kernel holds the copy of the value assigned to it. |
| specifics.mutable_bookmark()->set_url("http://demo/"); |
| EXPECT_FALSE(ProtoFieldValuesEqual(kernel.ref(SPECIFICS), specifics)); |
| |
| // Put the new value and verify the equality. |
| kernel.put(SPECIFICS, specifics); |
| EXPECT_TRUE(ProtoFieldValuesEqual(kernel.ref(SPECIFICS), specifics)); |
| EXPECT_FALSE(ProtoFieldValueIsDefault(kernel.ref(SPECIFICS))); |
| |
| // Copy the value between the fields and verify that exactly the same |
| // underlying value is shared. |
| kernel.copy(SPECIFICS, SERVER_SPECIFICS); |
| EXPECT_TRUE(ProtoFieldValuesEqual(kernel.ref(SERVER_SPECIFICS), specifics)); |
| EXPECT_TRUE(ProtoFieldValuesAreSame(kernel.ref(SPECIFICS), |
| kernel.ref(SERVER_SPECIFICS))); |
| |
| // Put the new value into SPECIFICS and verify that that stops sharing even |
| // though the values are still equal. |
| kernel.put(SPECIFICS, specifics); |
| EXPECT_FALSE(ProtoFieldValuesAreSame(kernel.ref(SPECIFICS), |
| kernel.ref(SERVER_SPECIFICS))); |
| } |
| |
| } // namespace syncable |
| |
| } // namespace syncer |