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