• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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