sync_change_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "sync/api/sync_change.h" 6 7#include <string> 8 9#include "base/memory/scoped_ptr.h" 10#include "base/values.h" 11#include "sync/protocol/preference_specifics.pb.h" 12#include "sync/protocol/proto_value_conversions.h" 13#include "sync/protocol/sync.pb.h" 14#include "testing/gtest/include/gtest/gtest.h" 15 16namespace syncer { 17 18// Ordered list of SyncChange's. 19typedef std::vector<SyncChange> SyncChangeList; 20 21namespace { 22 23typedef testing::Test SyncChangeTest; 24 25TEST_F(SyncChangeTest, LocalDelete) { 26 SyncChange::SyncChangeType change_type = SyncChange::ACTION_DELETE; 27 std::string tag = "client_tag"; 28 SyncChange e(FROM_HERE, 29 change_type, 30 SyncData::CreateLocalDelete(tag, PREFERENCES)); 31 EXPECT_EQ(change_type, e.change_type()); 32 EXPECT_EQ(tag, e.sync_data().GetTag()); 33 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType()); 34} 35 36TEST_F(SyncChangeTest, LocalUpdate) { 37 SyncChange::SyncChangeType change_type = SyncChange::ACTION_UPDATE; 38 sync_pb::EntitySpecifics specifics; 39 sync_pb::PreferenceSpecifics* pref_specifics = specifics.mutable_preference(); 40 pref_specifics->set_name("test"); 41 std::string tag = "client_tag"; 42 std::string title = "client_title"; 43 SyncChange e(FROM_HERE, 44 change_type, 45 SyncData::CreateLocalData(tag, title, specifics)); 46 EXPECT_EQ(change_type, e.change_type()); 47 EXPECT_EQ(tag, e.sync_data().GetTag()); 48 EXPECT_EQ(title, e.sync_data().GetTitle()); 49 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType()); 50 scoped_ptr<base::DictionaryValue> ref_spec(EntitySpecificsToValue(specifics)); 51 scoped_ptr<base::DictionaryValue> e_spec(EntitySpecificsToValue( 52 e.sync_data().GetSpecifics())); 53 EXPECT_TRUE(ref_spec->Equals(e_spec.get())); 54} 55 56TEST_F(SyncChangeTest, LocalAdd) { 57 SyncChange::SyncChangeType change_type = SyncChange::ACTION_ADD; 58 sync_pb::EntitySpecifics specifics; 59 sync_pb::PreferenceSpecifics* pref_specifics = specifics.mutable_preference(); 60 pref_specifics->set_name("test"); 61 std::string tag = "client_tag"; 62 std::string title = "client_title"; 63 SyncChange e(FROM_HERE, 64 change_type, 65 SyncData::CreateLocalData(tag, title, specifics)); 66 EXPECT_EQ(change_type, e.change_type()); 67 EXPECT_EQ(tag, e.sync_data().GetTag()); 68 EXPECT_EQ(title, e.sync_data().GetTitle()); 69 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType()); 70 scoped_ptr<base::DictionaryValue> ref_spec(EntitySpecificsToValue(specifics)); 71 scoped_ptr<base::DictionaryValue> e_spec(EntitySpecificsToValue( 72 e.sync_data().GetSpecifics())); 73 EXPECT_TRUE(ref_spec->Equals(e_spec.get())); 74} 75 76TEST_F(SyncChangeTest, SyncerChanges) { 77 SyncChangeList change_list; 78 79 // Create an update. 80 sync_pb::EntitySpecifics update_specifics; 81 sync_pb::PreferenceSpecifics* pref_specifics = 82 update_specifics.mutable_preference(); 83 pref_specifics->set_name("update"); 84 change_list.push_back(SyncChange( 85 FROM_HERE, 86 SyncChange::ACTION_UPDATE, 87 SyncData::CreateRemoteData(1, update_specifics))); 88 89 // Create an add. 90 sync_pb::EntitySpecifics add_specifics; 91 pref_specifics = add_specifics.mutable_preference(); 92 pref_specifics->set_name("add"); 93 change_list.push_back(SyncChange( 94 FROM_HERE, 95 SyncChange::ACTION_ADD, 96 SyncData::CreateRemoteData(2, add_specifics))); 97 98 // Create a delete. 99 sync_pb::EntitySpecifics delete_specifics; 100 pref_specifics = delete_specifics.mutable_preference(); 101 pref_specifics->set_name("add"); 102 change_list.push_back(SyncChange( 103 FROM_HERE, 104 SyncChange::ACTION_DELETE, 105 SyncData::CreateRemoteData(3, delete_specifics))); 106 107 ASSERT_EQ(3U, change_list.size()); 108 109 // Verify update. 110 SyncChange e = change_list[0]; 111 EXPECT_EQ(SyncChange::ACTION_UPDATE, e.change_type()); 112 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType()); 113 scoped_ptr<base::DictionaryValue> ref_spec(EntitySpecificsToValue( 114 update_specifics)); 115 scoped_ptr<base::DictionaryValue> e_spec(EntitySpecificsToValue( 116 e.sync_data().GetSpecifics())); 117 EXPECT_TRUE(ref_spec->Equals(e_spec.get())); 118 119 // Verify add. 120 e = change_list[1]; 121 EXPECT_EQ(SyncChange::ACTION_ADD, e.change_type()); 122 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType()); 123 ref_spec.reset(EntitySpecificsToValue(add_specifics)); 124 e_spec.reset(EntitySpecificsToValue(e.sync_data().GetSpecifics())); 125 EXPECT_TRUE(ref_spec->Equals(e_spec.get())); 126 127 // Verify delete. 128 e = change_list[2]; 129 EXPECT_EQ(SyncChange::ACTION_DELETE, e.change_type()); 130 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType()); 131 ref_spec.reset(EntitySpecificsToValue(delete_specifics)); 132 e_spec.reset(EntitySpecificsToValue(e.sync_data().GetSpecifics())); 133 EXPECT_TRUE(ref_spec->Equals(e_spec.get())); 134} 135 136} // namespace 137 138} // namespace syncer 139