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/message_loop/message_loop.h"
11 #include "base/time/time.h"
12 #include "base/values.h"
13 #include "sync/api/attachments/attachment_id.h"
14 #include "sync/api/attachments/attachment_service_proxy_for_test.h"
15 #include "sync/protocol/preference_specifics.pb.h"
16 #include "sync/protocol/proto_value_conversions.h"
17 #include "sync/protocol/sync.pb.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace syncer {
21
22 // Ordered list of SyncChange's.
23 typedef std::vector<SyncChange> SyncChangeList;
24
25 namespace {
26
27 class SyncChangeTest : public testing::Test {
28 private:
29 base::MessageLoop message_loop;
30 };
31
TEST_F(SyncChangeTest,LocalDelete)32 TEST_F(SyncChangeTest, LocalDelete) {
33 SyncChange::SyncChangeType change_type = SyncChange::ACTION_DELETE;
34 std::string tag = "client_tag";
35 SyncChange e(FROM_HERE,
36 change_type,
37 SyncData::CreateLocalDelete(tag, PREFERENCES));
38 EXPECT_EQ(change_type, e.change_type());
39 EXPECT_EQ(tag, SyncDataLocal(e.sync_data()).GetTag());
40 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType());
41 }
42
TEST_F(SyncChangeTest,LocalUpdate)43 TEST_F(SyncChangeTest, LocalUpdate) {
44 SyncChange::SyncChangeType change_type = SyncChange::ACTION_UPDATE;
45 sync_pb::EntitySpecifics specifics;
46 sync_pb::PreferenceSpecifics* pref_specifics = specifics.mutable_preference();
47 pref_specifics->set_name("test");
48 std::string tag = "client_tag";
49 std::string title = "client_title";
50 SyncChange e(FROM_HERE,
51 change_type,
52 SyncData::CreateLocalData(tag, title, specifics));
53 EXPECT_EQ(change_type, e.change_type());
54 EXPECT_EQ(tag, SyncDataLocal(e.sync_data()).GetTag());
55 EXPECT_EQ(title, e.sync_data().GetTitle());
56 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType());
57 scoped_ptr<base::DictionaryValue> ref_spec(EntitySpecificsToValue(specifics));
58 scoped_ptr<base::DictionaryValue> e_spec(EntitySpecificsToValue(
59 e.sync_data().GetSpecifics()));
60 EXPECT_TRUE(ref_spec->Equals(e_spec.get()));
61 }
62
TEST_F(SyncChangeTest,LocalAdd)63 TEST_F(SyncChangeTest, LocalAdd) {
64 SyncChange::SyncChangeType change_type = SyncChange::ACTION_ADD;
65 sync_pb::EntitySpecifics specifics;
66 sync_pb::PreferenceSpecifics* pref_specifics = specifics.mutable_preference();
67 pref_specifics->set_name("test");
68 std::string tag = "client_tag";
69 std::string title = "client_title";
70 SyncChange e(FROM_HERE,
71 change_type,
72 SyncData::CreateLocalData(tag, title, specifics));
73 EXPECT_EQ(change_type, e.change_type());
74 EXPECT_EQ(tag, SyncDataLocal(e.sync_data()).GetTag());
75 EXPECT_EQ(title, e.sync_data().GetTitle());
76 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType());
77 scoped_ptr<base::DictionaryValue> ref_spec(EntitySpecificsToValue(specifics));
78 scoped_ptr<base::DictionaryValue> e_spec(EntitySpecificsToValue(
79 e.sync_data().GetSpecifics()));
80 EXPECT_TRUE(ref_spec->Equals(e_spec.get()));
81 }
82
TEST_F(SyncChangeTest,SyncerChanges)83 TEST_F(SyncChangeTest, SyncerChanges) {
84 SyncChangeList change_list;
85
86 // Create an update.
87 sync_pb::EntitySpecifics update_specifics;
88 sync_pb::PreferenceSpecifics* pref_specifics =
89 update_specifics.mutable_preference();
90 pref_specifics->set_name("update");
91 change_list.push_back(
92 SyncChange(FROM_HERE,
93 SyncChange::ACTION_UPDATE,
94 SyncData::CreateRemoteData(
95 1,
96 update_specifics,
97 base::Time(),
98 syncer::AttachmentIdList(),
99 syncer::AttachmentServiceProxyForTest::Create())));
100
101 // Create an add.
102 sync_pb::EntitySpecifics add_specifics;
103 pref_specifics = add_specifics.mutable_preference();
104 pref_specifics->set_name("add");
105 change_list.push_back(
106 SyncChange(FROM_HERE,
107 SyncChange::ACTION_ADD,
108 SyncData::CreateRemoteData(
109 2,
110 add_specifics,
111 base::Time(),
112 syncer::AttachmentIdList(),
113 syncer::AttachmentServiceProxyForTest::Create())));
114
115 // Create a delete.
116 sync_pb::EntitySpecifics delete_specifics;
117 pref_specifics = delete_specifics.mutable_preference();
118 pref_specifics->set_name("add");
119 change_list.push_back(
120 SyncChange(FROM_HERE,
121 SyncChange::ACTION_DELETE,
122 SyncData::CreateRemoteData(
123 3,
124 delete_specifics,
125 base::Time(),
126 syncer::AttachmentIdList(),
127 syncer::AttachmentServiceProxyForTest::Create())));
128
129 ASSERT_EQ(3U, change_list.size());
130
131 // Verify update.
132 SyncChange e = change_list[0];
133 EXPECT_EQ(SyncChange::ACTION_UPDATE, e.change_type());
134 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType());
135 scoped_ptr<base::DictionaryValue> ref_spec(EntitySpecificsToValue(
136 update_specifics));
137 scoped_ptr<base::DictionaryValue> e_spec(EntitySpecificsToValue(
138 e.sync_data().GetSpecifics()));
139 EXPECT_TRUE(ref_spec->Equals(e_spec.get()));
140
141 // Verify add.
142 e = change_list[1];
143 EXPECT_EQ(SyncChange::ACTION_ADD, e.change_type());
144 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType());
145 ref_spec.reset(EntitySpecificsToValue(add_specifics));
146 e_spec.reset(EntitySpecificsToValue(e.sync_data().GetSpecifics()));
147 EXPECT_TRUE(ref_spec->Equals(e_spec.get()));
148
149 // Verify delete.
150 e = change_list[2];
151 EXPECT_EQ(SyncChange::ACTION_DELETE, e.change_type());
152 EXPECT_EQ(PREFERENCES, e.sync_data().GetDataType());
153 ref_spec.reset(EntitySpecificsToValue(delete_specifics));
154 e_spec.reset(EntitySpecificsToValue(e.sync_data().GetSpecifics()));
155 EXPECT_TRUE(ref_spec->Equals(e_spec.get()));
156 }
157
158 } // namespace
159
160 } // namespace syncer
161