15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/engine/syncer_proto_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "sync/internal_api/public/base/cancelation_signal.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type_test_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/bookmark_specifics.pb.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/password_specifics.pb.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync_enums.pb.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/sessions/sync_session_context.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/blob.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/directory.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/test/engine/mock_connection_manager.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/test/engine/test_directory_setter_upper.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_pb::ClientToServerMessage; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_pb::CommitResponse_EntryResponse; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_pb::SyncEntity; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sessions::SyncSessionContext; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::Blob; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDelegate : public sessions::SyncSession::Delegate { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockDelegate() {} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockDelegate() {} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnReceivedShortPollIntervalUpdate, void(const base::TimeDelta&)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnReceivedLongPollIntervalUpdate ,void(const base::TimeDelta&)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnReceivedSessionsCommitDelay, void(const base::TimeDelta&)); 45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MOCK_METHOD1(OnReceivedClientInvalidationHintBufferSize, void(int)); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(OnSyncProtocolError, void(const SyncProtocolError&)); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Builds a ClientToServerResponse with some data type ids, including 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// invalid ones. GetTypesToMigrate() should return only the valid 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// model types. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(SyncerProtoUtil, GetTypesToMigrate) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_pb::ClientToServerResponse response; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response.add_migrated_data_type_id( 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSpecificsFieldNumberFromModelType(BOOKMARKS)); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response.add_migrated_data_type_id( 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSpecificsFieldNumberFromModelType(HISTORY_DELETE_DIRECTIVES)); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response.add_migrated_data_type_id(-1); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetTypesToMigrate(response).Equals( 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ModelTypeSet(BOOKMARKS, HISTORY_DELETE_DIRECTIVES))); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Builds a ClientToServerResponse_Error with some error data type 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ids, including invalid ones. ConvertErrorPBToLocalType() should 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// return a SyncProtocolError with only the valid model types. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(SyncerProtoUtil, ConvertErrorPBToLocalType) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_pb::ClientToServerResponse_Error error_pb; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_pb.set_error_type(sync_pb::SyncEnums::THROTTLED); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_pb.add_error_data_type_ids( 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSpecificsFieldNumberFromModelType(BOOKMARKS)); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_pb.add_error_data_type_ids( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSpecificsFieldNumberFromModelType(HISTORY_DELETE_DIRECTIVES)); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_pb.add_error_data_type_ids(-1); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncProtocolError error = ConvertErrorPBToLocalType(error_pb); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error.error_data_types.Equals( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ModelTypeSet(BOOKMARKS, HISTORY_DELETE_DIRECTIVES))); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SyncerProtoUtil, TestBlobToProtocolBufferBytesUtilityFunctions) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char test_data1[] = {1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 4, 2, 9}; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char test_data2[] = {1, 99, 3, 4, 5, 6, 7, 8, 0, 1, 4, 2, 9}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char test_data3[] = {99, 2, 3, 4, 5, 6, 7, 8}; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::Blob test_blob1, test_blob2, test_blob3; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(test_data1); ++i) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob1.push_back(test_data1[i]); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(test_data2); ++i) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob2.push_back(test_data2[i]); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(test_data3); ++i) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob3.push_back(test_data3[i]); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_message1(reinterpret_cast<char*>(test_data1), 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(test_data1)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_message2(reinterpret_cast<char*>(test_data2), 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(test_data2)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_message3(reinterpret_cast<char*>(test_data3), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(test_data3)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob1)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob2)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob3)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message2, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob1)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message2, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob2)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message2, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob3)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message3, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob1)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message3, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob2)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message3, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob3)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Blob blob1_copy; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob1_copy)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncerProtoUtil::CopyProtoBytesIntoBlob(test_message1, &blob1_copy); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(test_message1, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob1_copy)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string message2_copy; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::ProtoBytesEqualsBlob(message2_copy, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob2)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncerProtoUtil::CopyBlobIntoProtoBytes(test_blob2, &message2_copy); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(SyncerProtoUtil::ProtoBytesEqualsBlob(message2_copy, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_blob2)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests NameFromSyncEntity and NameFromCommitEntryResponse when only the name 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// field is provided. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SyncerProtoUtil, NameExtractionOneName) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncEntity one_name_entity; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommitResponse_EntryResponse one_name_response; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string one_name_string("Eggheadednesses"); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) one_name_entity.set_name(one_name_string); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) one_name_response.set_name(one_name_string); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string name_a = 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncerProtoUtil::NameFromSyncEntity(one_name_entity); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(one_name_string, name_a); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SyncerProtoUtil, NameExtractionOneUniqueName) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncEntity one_name_entity; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommitResponse_EntryResponse one_name_response; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string one_name_string("Eggheadednesses"); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) one_name_entity.set_non_unique_name(one_name_string); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) one_name_response.set_non_unique_name(one_name_string); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string name_a = 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncerProtoUtil::NameFromSyncEntity(one_name_entity); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(one_name_string, name_a); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests NameFromSyncEntity and NameFromCommitEntryResponse when both the name 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// field and the non_unique_name fields are provided. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Should prioritize non_unique_name. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SyncerProtoUtil, NameExtractionTwoNames) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncEntity two_name_entity; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommitResponse_EntryResponse two_name_response; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string neuro("Neuroanatomists"); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string oxyphen("Oxyphenbutazone"); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) two_name_entity.set_name(oxyphen); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) two_name_entity.set_non_unique_name(neuro); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) two_name_response.set_name(oxyphen); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) two_name_response.set_non_unique_name(neuro); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string name_a = 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncerProtoUtil::NameFromSyncEntity(two_name_entity); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(neuro, name_a); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncerProtoUtilTest : public testing::Test { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dir_maker_.SetUp(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dir_maker_.TearDown(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::Directory* directory() { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dir_maker_.directory(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop message_loop_; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDirectorySetterUpper dir_maker_; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncerProtoUtilTest, VerifyResponseBirthday) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both sides empty 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(directory()->store_birthday().empty()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerResponse response; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::VerifyResponseBirthday(response, directory())); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remote set, local empty 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.set_store_birthday("flan"); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(SyncerProtoUtil::VerifyResponseBirthday(response, directory())); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(directory()->store_birthday(), "flan"); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remote empty, local set. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.clear_store_birthday(); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(SyncerProtoUtil::VerifyResponseBirthday(response, directory())); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(directory()->store_birthday(), "flan"); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Doesn't match 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.set_store_birthday("meat"); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::VerifyResponseBirthday(response, directory())); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.set_error_code(sync_pb::SyncEnums::CLEAR_PENDING); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::VerifyResponseBirthday(response, directory())); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(SyncerProtoUtilTest, VerifyDisabledByAdmin) { 2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // No error code 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sync_pb::ClientToServerResponse response; 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::IsSyncDisabledByAdmin(response)); 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Has error code, but not disabled 2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) response.set_error_code(sync_pb::SyncEnums::NOT_MY_BIRTHDAY); 2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::IsSyncDisabledByAdmin(response)); 2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Has error code, and is disabled by admin 2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) response.set_error_code(sync_pb::SyncEnums::DISABLED_BY_ADMIN); 2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(SyncerProtoUtil::IsSyncDisabledByAdmin(response)); 2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncerProtoUtilTest, AddRequestBirthday) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(directory()->store_birthday().empty()); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientToServerMessage msg; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncerProtoUtil::AddRequestBirthday(directory(), &msg); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(msg.has_store_birthday()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) directory()->set_store_birthday("meat"); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncerProtoUtil::AddRequestBirthday(directory(), &msg); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(msg.store_birthday(), "meat"); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DummyConnectionManager : public ServerConnectionManager { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DummyConnectionManager(CancelationSignal* signal) 2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : ServerConnectionManager("unused", 0, false, signal), 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_error_(false), 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) access_denied_(false) {} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DummyConnectionManager() {} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool PostBufferWithCachedAuth( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostBufferParams* params, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedServerStatusWatcher* watcher) OVERRIDE { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_error_) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerResponse response; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (access_denied_) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.set_error_code(sync_pb::SyncEnums::ACCESS_DENIED); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.SerializeToString(¶ms->buffer_out); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_send_error(bool send) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_error_ = send; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_access_denied(bool denied) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) access_denied_ = denied; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool send_error_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool access_denied_; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncerProtoUtilTest, PostAndProcessHeaders) { 291d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CancelationSignal signal; 292d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DummyConnectionManager dcm(&signal); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientToServerMessage msg; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncerProtoUtil::SetProtocolVersion(&msg); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg.set_share("required"); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg.set_message_contents(ClientToServerMessage::GET_UPDATES); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerResponse response; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dcm.set_send_error(true); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::PostAndProcessHeaders(&dcm, NULL, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg, &response)); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dcm.set_send_error(false); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(SyncerProtoUtil::PostAndProcessHeaders(&dcm, NULL, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg, &response)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dcm.set_access_denied(true); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(SyncerProtoUtil::PostAndProcessHeaders(&dcm, NULL, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg, &response)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 313