Home | History | Annotate | Download | only in engine
      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 
     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.
     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 
     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.
    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:
    131   virtual void SetUp() {
    132     setter_upper_.SetUp();
    133   }
    134 
    135   virtual void TearDown() {
    136     setter_upper_.TearDown();
    137   }
    138 
    139  protected:
    140   browser_sync::TestDirectorySetterUpper setter_upper_;
    141 };
    142 
    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 
    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:
    186   DummyConnectionManager()
    187       : ServerConnectionManager("unused", 0, false, "version"),
    188         send_error_(false),
    189         access_denied_(false) {}
    190 
    191   virtual ~DummyConnectionManager() {}
    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 
    207   void set_send_error(bool send) {
    208     send_error_ = send;
    209   }
    210 
    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 
    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