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