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