summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/api/sync_change_unittest.cc
blob: 0a9104dcb451417d193903baa9c6bc5d1d296651 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/sync/api/sync_change.h"

#include <string>

#include "base/values.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "chrome/browser/sync/protocol/preference_specifics.pb.h"
#include "chrome/browser/sync/protocol/proto_value_conversions.h"

using browser_sync::EntitySpecificsToValue;

// Ordered list of SyncChange's.
typedef std::vector<SyncChange> SyncChangeList;

namespace {

typedef testing::Test SyncChangeTest;

TEST_F(SyncChangeTest, LocalDelete) {
  SyncChange::SyncChangeType change_type = SyncChange::ACTION_DELETE;
  std::string tag = "client_tag";
  SyncChange e(change_type,
              SyncData::CreateLocalData(tag));
  EXPECT_EQ(change_type, e.change_type());
  EXPECT_EQ(tag, e.sync_data().GetTag());
  EXPECT_EQ(syncable::UNSPECIFIED, e.sync_data().GetDataType());
}

TEST_F(SyncChangeTest, LocalUpdate) {
  SyncChange::SyncChangeType change_type = SyncChange::ACTION_UPDATE;
  sync_pb::EntitySpecifics specifics;
  sync_pb::PreferenceSpecifics* pref_specifics =
      specifics.MutableExtension(sync_pb::preference);
  pref_specifics->set_name("test");
  std::string tag = "client_tag";
  SyncChange e(change_type,
              SyncData::CreateLocalData(tag, specifics));
  EXPECT_EQ(change_type, e.change_type());
  EXPECT_EQ(tag, e.sync_data().GetTag());
  EXPECT_EQ(syncable::PREFERENCES, e.sync_data().GetDataType());
  scoped_ptr<DictionaryValue> ref_spec(EntitySpecificsToValue(specifics));
  scoped_ptr<DictionaryValue> e_spec(EntitySpecificsToValue(
      e.sync_data().GetSpecifics()));
  EXPECT_TRUE(ref_spec->Equals(e_spec.get()));
}

TEST_F(SyncChangeTest, LocalAdd) {
  SyncChange::SyncChangeType change_type = SyncChange::ACTION_ADD;
  sync_pb::EntitySpecifics specifics;
  sync_pb::PreferenceSpecifics* pref_specifics =
      specifics.MutableExtension(sync_pb::preference);
  pref_specifics->set_name("test");
  std::string tag = "client_tag";
  SyncChange e(change_type,
              SyncData::CreateLocalData(tag, specifics));
  EXPECT_EQ(change_type, e.change_type());
  EXPECT_EQ(tag, e.sync_data().GetTag());
  EXPECT_EQ(syncable::PREFERENCES, e.sync_data().GetDataType());
  scoped_ptr<DictionaryValue> ref_spec(EntitySpecificsToValue(specifics));
  scoped_ptr<DictionaryValue> e_spec(EntitySpecificsToValue(
      e.sync_data().GetSpecifics()));
  EXPECT_TRUE(ref_spec->Equals(e_spec.get()));
}

TEST_F(SyncChangeTest, SyncerChanges) {
  SyncChangeList change_list;

  // Create an update.
  sync_pb::EntitySpecifics update_specifics;
  sync_pb::PreferenceSpecifics* pref_specifics =
      update_specifics.MutableExtension(sync_pb::preference);
  pref_specifics->set_name("update");
  change_list.push_back(SyncChange(
      SyncChange::ACTION_UPDATE,
      SyncData::CreateRemoteData(update_specifics)));

  // Create an add.
  sync_pb::EntitySpecifics add_specifics;
  pref_specifics =
      add_specifics.MutableExtension(sync_pb::preference);
  pref_specifics->set_name("add");
  change_list.push_back(SyncChange(
      SyncChange::ACTION_ADD,
      SyncData::CreateRemoteData(add_specifics)));

  // Create a delete.
  sync_pb::EntitySpecifics delete_specifics;
  pref_specifics =
      delete_specifics.MutableExtension(sync_pb::preference);
  pref_specifics->set_name("add");
  change_list.push_back(SyncChange(
      SyncChange::ACTION_DELETE,
      SyncData::CreateRemoteData(delete_specifics)));

  ASSERT_EQ(3U, change_list.size());

  // Verify update.
  SyncChange e = change_list[0];
  EXPECT_EQ(SyncChange::ACTION_UPDATE, e.change_type());
  EXPECT_EQ(syncable::PREFERENCES, e.sync_data().GetDataType());
  scoped_ptr<DictionaryValue> ref_spec(EntitySpecificsToValue(
      update_specifics));
  scoped_ptr<DictionaryValue> e_spec(EntitySpecificsToValue(
      e.sync_data().GetSpecifics()));
  EXPECT_TRUE(ref_spec->Equals(e_spec.get()));

  // Verify add.
  e = change_list[1];
  EXPECT_EQ(SyncChange::ACTION_ADD, e.change_type());
  EXPECT_EQ(syncable::PREFERENCES, e.sync_data().GetDataType());
  ref_spec.reset(EntitySpecificsToValue(add_specifics));
  e_spec.reset(EntitySpecificsToValue(e.sync_data().GetSpecifics()));
  EXPECT_TRUE(ref_spec->Equals(e_spec.get()));

  // Verify delete.
  e = change_list[2];
  EXPECT_EQ(SyncChange::ACTION_DELETE, e.change_type());
  EXPECT_EQ(syncable::PREFERENCES, e.sync_data().GetDataType());
  ref_spec.reset(EntitySpecificsToValue(delete_specifics));
  e_spec.reset(EntitySpecificsToValue(e.sync_data().GetSpecifics()));
  EXPECT_TRUE(ref_spec->Equals(e_spec.get()));
}

}  // namespace