syncer_proto_util_unittest.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1// Copyright (c) 2006-2008 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 "chrome/browser/sync/engine/syncer_proto_util.h"
6
7#include "base/basictypes.h"
8#include "chrome/browser/sync/engine/syncproto.h"
9#include "chrome/browser/sync/syncable/blob.h"
10#include "chrome/browser/sync/syncable/directory_manager.h"
11#include "chrome/browser/sync/syncable/syncable.h"
12#include "chrome/test/sync/engine/mock_connection_manager.h"
13#include "chrome/test/sync/engine/test_directory_setter_upper.h"
14
15#include "testing/gtest/include/gtest/gtest.h"
16
17using syncable::Blob;
18using syncable::ScopedDirLookup;
19using syncable::SyncName;
20
21namespace browser_sync {
22
23TEST(SyncerProtoUtil, TestBlobToProtocolBufferBytesUtilityFunctions) {
24  unsigned char test_data1[] = {1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 4, 2, 9};
25  unsigned char test_data2[] = {1, 99, 3, 4, 5, 6, 7, 8, 0, 1, 4, 2, 9};
26  unsigned char test_data3[] = {99, 2, 3, 4, 5, 6, 7, 8};
27
28  syncable::Blob test_blob1, test_blob2, test_blob3;
29  for (size_t i = 0; i < arraysize(test_data1); ++i)
30    test_blob1.push_back(test_data1[i]);
31  for (size_t i = 0; i < arraysize(test_data2); ++i)
32    test_blob2.push_back(test_data2[i]);
33  for (size_t i = 0; i < arraysize(test_data3); ++i)
34    test_blob3.push_back(test_data3[i]);
35
36  string test_message1(reinterpret_cast<char*>(test_data1),
37      arraysize(test_data1));
38  string test_message2(reinterpret_cast<char*>(test_data2),
39      arraysize(test_data2));
40  string test_message3(reinterpret_cast<char*>(test_data3),
41      arraysize(test_data3));
42
43  EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1,
44                                                    test_blob1));
45  EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1,
46                                                     test_blob2));
47  EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1,
48                                                     test_blob3));
49  EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message2,
50                                                     test_blob1));
51  EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message2,
52                                                    test_blob2));
53  EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message2,
54                                                     test_blob3));
55  EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message3,
56                                                     test_blob1));
57  EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message3,
58                                                     test_blob2));
59  EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message3,
60                                                    test_blob3));
61
62  Blob blob1_copy;
63  EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1,
64                                                     blob1_copy));
65  SyncerProtoUtil::CopyProtoBytesIntoBlob(test_message1, &blob1_copy);
66  EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1,
67                                                    blob1_copy));
68
69  std::string message2_copy;
70  EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(message2_copy,
71                                                     test_blob2));
72  SyncerProtoUtil::CopyBlobIntoProtoBytes(test_blob2, &message2_copy);
73  EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(message2_copy,
74                                                    test_blob2));
75}
76
77// Tests NameFromSyncEntity and NameFromCommitEntryResponse when only the name
78// field is provided.
79TEST(SyncerProtoUtil, NameExtractionOneName) {
80  SyncEntity one_name_entity;
81  CommitResponse_EntryResponse one_name_response;
82
83  const std::string one_name_string("Eggheadednesses");
84  one_name_entity.set_name(one_name_string);
85  one_name_response.set_name(one_name_string);
86
87  const std::string name_a =
88      SyncerProtoUtil::NameFromSyncEntity(one_name_entity);
89  EXPECT_EQ(one_name_string, name_a);
90}
91
92TEST(SyncerProtoUtil, NameExtractionOneUniqueName) {
93  SyncEntity one_name_entity;
94  CommitResponse_EntryResponse one_name_response;
95
96  const std::string one_name_string("Eggheadednesses");
97
98  one_name_entity.set_non_unique_name(one_name_string);
99  one_name_response.set_non_unique_name(one_name_string);
100
101  const std::string name_a =
102      SyncerProtoUtil::NameFromSyncEntity(one_name_entity);
103  EXPECT_EQ(one_name_string, name_a);
104}
105
106// Tests NameFromSyncEntity and NameFromCommitEntryResponse when both the name
107// field and the non_unique_name fields are provided.
108// Should prioritize non_unique_name.
109TEST(SyncerProtoUtil, NameExtractionTwoNames) {
110  SyncEntity two_name_entity;
111  CommitResponse_EntryResponse two_name_response;
112
113  const std::string neuro("Neuroanatomists");
114  const std::string oxyphen("Oxyphenbutazone");
115
116  two_name_entity.set_name(oxyphen);
117  two_name_entity.set_non_unique_name(neuro);
118
119  two_name_response.set_name(oxyphen);
120  two_name_response.set_non_unique_name(neuro);
121
122  const std::string name_a =
123      SyncerProtoUtil::NameFromSyncEntity(two_name_entity);
124  EXPECT_EQ(neuro, name_a);
125}
126
127class SyncerProtoUtilTest : public testing::Test {
128 public:
129  virtual void SetUp() {
130    setter_upper_.SetUp();
131  }
132
133  virtual void TearDown() {
134    setter_upper_.TearDown();
135  }
136
137 protected:
138  browser_sync::TestDirectorySetterUpper setter_upper_;
139};
140
141TEST_F(SyncerProtoUtilTest, VerifyResponseBirthday) {
142  ScopedDirLookup lookup(setter_upper_.manager(), setter_upper_.name());
143  ASSERT_TRUE(lookup.good());
144
145  // Both sides empty
146  EXPECT_TRUE(lookup->store_birthday().empty());
147  ClientToServerResponse response;
148  EXPECT_FALSE(SyncerProtoUtil::VerifyResponseBirthday(lookup, &response));
149
150  // Remote set, local empty
151  response.set_store_birthday("flan");
152  EXPECT_TRUE(SyncerProtoUtil::VerifyResponseBirthday(lookup, &response));
153  EXPECT_EQ(lookup->store_birthday(), "flan");
154
155  // Remote empty, local set.
156  response.clear_store_birthday();
157  EXPECT_TRUE(SyncerProtoUtil::VerifyResponseBirthday(lookup, &response));
158  EXPECT_EQ(lookup->store_birthday(), "flan");
159
160  // Doesn't match
161  response.set_store_birthday("meat");
162  EXPECT_FALSE(SyncerProtoUtil::VerifyResponseBirthday(lookup, &response));
163
164  response.set_error_code(ClientToServerResponse::CLEAR_PENDING);
165  EXPECT_FALSE(SyncerProtoUtil::VerifyResponseBirthday(lookup, &response));
166}
167
168TEST_F(SyncerProtoUtilTest, AddRequestBirthday) {
169  ScopedDirLookup lookup(setter_upper_.manager(), setter_upper_.name());
170  ASSERT_TRUE(lookup.good());
171
172  EXPECT_TRUE(lookup->store_birthday().empty());
173  ClientToServerMessage msg;
174  SyncerProtoUtil::AddRequestBirthday(lookup, &msg);
175  EXPECT_FALSE(msg.has_store_birthday());
176
177  lookup->set_store_birthday("meat");
178  SyncerProtoUtil::AddRequestBirthday(lookup, &msg);
179  EXPECT_EQ(msg.store_birthday(), "meat");
180}
181
182class DummyConnectionManager : public browser_sync::ServerConnectionManager {
183 public:
184  DummyConnectionManager()
185      : ServerConnectionManager("unused", 0, false, "version", "id"),
186        send_error_(false),
187        access_denied_(false) {}
188
189  virtual ~DummyConnectionManager() {}
190  virtual bool PostBufferWithCachedAuth(const PostBufferParams* params,
191                                        ScopedServerStatusWatcher* watcher) {
192    if (send_error_) {
193      return false;
194    }
195
196    ClientToServerResponse response;
197    if (access_denied_) {
198      response.set_error_code(ClientToServerResponse::ACCESS_DENIED);
199    }
200    response.SerializeToString(params->buffer_out);
201
202    return true;
203  }
204
205  void set_send_error(bool send) {
206    send_error_ = send;
207  }
208
209  void set_access_denied(bool denied) {
210    access_denied_ = denied;
211  }
212
213 private:
214  bool send_error_;
215  bool access_denied_;
216};
217
218TEST_F(SyncerProtoUtilTest, PostAndProcessHeaders) {
219  DummyConnectionManager dcm;
220  ClientToServerMessage msg;
221  msg.set_share("required");
222  msg.set_message_contents(ClientToServerMessage::GET_UPDATES);
223  ClientToServerResponse response;
224
225  dcm.set_send_error(true);
226  EXPECT_FALSE(SyncerProtoUtil::PostAndProcessHeaders(&dcm, NULL,
227      msg, &response));
228
229  dcm.set_send_error(false);
230  EXPECT_TRUE(SyncerProtoUtil::PostAndProcessHeaders(&dcm, NULL,
231      msg, &response));
232
233  dcm.set_access_denied(true);
234  EXPECT_FALSE(SyncerProtoUtil::PostAndProcessHeaders(&dcm, NULL,
235      msg, &response));
236}
237
238}  // namespace browser_sync
239