mock_connection_manager.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)// Mock ServerConnectionManager class for use in client unit tests. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SYNC_TEST_ENGINE_MOCK_CONNECTION_MANAGER_H_ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_TEST_ENGINE_MOCK_CONNECTION_MANAGER_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <bitset> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/engine/net/server_connection_manager.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type_invalidation_map.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockConnectionManager : public ServerConnectionManager { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MidCommitObserver { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe() = 0; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MidCommitObserver() {} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit MockConnectionManager(syncable::Directory*); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockConnectionManager(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden ServerConnectionManager functions. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool PostBufferToPath( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostBufferParams*, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& auth_token, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedServerStatusWatcher* watcher) OVERRIDE; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Control of commit response. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: Commit callback is invoked only once then reset. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetMidCommitCallback(const base::Closure& callback); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetMidCommitObserver(MidCommitObserver* observer); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set this if you want commit to perform commit time rename. Will request 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the client renames all commited entries, prepending this string. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetCommitTimeRename(std::string prepend); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generic versions of AddUpdate functions. Tests using these function should 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compile for both the int64 and string id based versions of the server. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The SyncEntity returned is only valid until the Sync is completed 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. with SyncShare.) It allows to add further entity properties before 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sync, using SetLastXXX() methods and/or GetMutableLastUpdate(). 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateDirectory(syncable::Id id, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::Id parent_id, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateBookmark(syncable::Id id, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::Id parent_id, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Versions of the AddUpdate functions that accept integer IDs. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateDirectory(int id, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int parent_id, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateBookmark(int id, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int parent_id, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // New protocol versions of the AddUpdate functions. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateDirectory(std::string id, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string parent_id, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateBookmark(std::string id, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string parent_id, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Versions of the AddUpdate function that accept specifics. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateSpecifics(int id, int parent_id, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name,int64 version, int64 sync_ts, bool is_dir, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 position, const sync_pb::EntitySpecifics& specifics); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* SetNigori(int id, int64 version, int64 sync_ts, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::EntitySpecifics& specifics); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the last commit sent by the client, and replay it for the next get 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updates command. This can be used to simulate the GetUpdates that happens 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately after a successful commit. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateFromLastCommit(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a deleted item. Deletion records typically contain no 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // additional information beyond the deletion, and no specifics. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The server may send the originator fields. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddUpdateTombstone(const syncable::Id& id); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdateDeleted(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdateServerTag(const std::string& tag); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdateClientTag(const std::string& tag); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdateOriginatorFields(const std::string& client_id, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& entry_id); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdatePosition(int64 position_in_parent); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetNewTimestamp(int ts); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetChangesRemaining(int64 count); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a new batch of updates after the current one. Allows multiple 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetUpdates responses to be buffered up, since the syncer may 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // issue multiple requests during a sync cycle. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NextUpdateBatch(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FailNextPostBufferToPathCall() { countdown_to_postbuffer_fail_ = 1; } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FailNthPostBufferToPathCall(int n) { countdown_to_postbuffer_fail_ = n; } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetKeystoreKey(const std::string& key); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FailNonPeriodicGetUpdates() { fail_non_periodic_get_updates_ = true; } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simple inspectors. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool client_stuck() const { return client_stuck_; } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // warning: These take ownership of their input. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetGUClientCommand(sync_pb::ClientCommand* command); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetCommitClientCommand(sync_pb::ClientCommand* command); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<syncable::Id>& committed_ids() const { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return committed_ids_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<sync_pb::CommitMessage*>& commit_messages() const { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return commit_messages_.get(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<sync_pb::CommitResponse*>& commit_responses() const { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return commit_responses_.get(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the last sent commit message. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::CommitMessage& last_sent_commit() const; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the last returned commit response. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::CommitResponse& last_commit_response() const; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the last request submitted to the server (regardless of type). 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::ClientToServerMessage& last_request() const { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_request_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_conflict_all_commits(bool value) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) conflict_all_commits_ = value; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_next_new_id(int value) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_new_id_ = value; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_conflict_n_commits(int value) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) conflict_n_commits_ = value; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_use_legacy_bookmarks_protocol(bool value) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_legacy_bookmarks_protocol_ = value; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_store_birthday(std::string new_birthday) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Multiple threads can set store_birthday_ in our tests, need to lock it to 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ensure atomic read/writes and avoid race conditions. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(store_birthday_lock_); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store_birthday_ = new_birthday; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the number of GetUpdates requests that the mock server has 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // seen since the last time this function was called. Can be used to 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // verify that a GetUpdates actually did or did not happen after running 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the syncer. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetAndClearNumGetUpdatesRequests() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = num_get_updates_requests_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_get_updates_requests_ = 0; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect that GetUpdates will request exactly the types indicated in 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the bitset. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectGetUpdatesRequestTypes(ModelTypeSet expected_filter) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_filter_ = expected_filter; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectGetUpdatesRequestStates(const ModelTypeInvalidationMap& states) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_states_ = states; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetServerReachable(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetServerNotReachable(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates our internal state as if we had attempted a connection. Does not 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // send notifications as a real connection attempt would. This is useful in 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cases where we're mocking out most of the code that performs network 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // requests. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateConnectionStatus(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return by copy to be thread-safe. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string store_birthday() { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(store_birthday_lock_); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return store_birthday_; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly indicate that we will not be fetching some updates. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearUpdatesQueue() { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_queue_.clear(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Locate the most recent update message for purpose of alteration. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* GetMutableLastUpdate(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateFull(syncable::Id id, syncable::Id parentid, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, int64 version, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_dir); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateFull(std::string id, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string parentid, std::string name, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, int64 sync_ts, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_dir); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateMeta(std::string id, std::string parentid, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, int64 version, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Functions to handle the various types of server request. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessGetUpdates(sync_pb::ClientToServerMessage* csm, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerResponse* response); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessCommit(sync_pb::ClientToServerMessage* csm, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerResponse* response_buffer); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessClearData(sync_pb::ClientToServerMessage* csm, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerResponse* response); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddDefaultBookmarkData(sync_pb::SyncEntity* entity, bool is_folder); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determine if one entry in a commit should be rejected with a conflict. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ShouldConflictThisCommit(); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate a numeric position_in_parent value. We use a global counter 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that only decreases; this simulates new objects always being added to the 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // front of the ordering. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 GeneratePositionInParent() { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return next_position_in_parent_--; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a mutable update response which will eventually be returned to the 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::GetUpdatesResponse* GetUpdateResponse(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ApplyToken(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determine whether an progress marker array (like that sent in 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetUpdates.from_progress_marker) indicates that a particular ModelType 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be included. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsModelTypePresentInSpecifics( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const google::protobuf::RepeatedPtrField< 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::DataTypeProgressMarker>& filter, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType value); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::DataTypeProgressMarker const* GetProgressMarkerForType( 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const google::protobuf::RepeatedPtrField< 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::DataTypeProgressMarker>& filter, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType value); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When false, we pretend to have network connectivity issues. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool server_reachable_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All IDs that have been committed. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<syncable::Id> committed_ids_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Control of when/if we return conflicts. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool conflict_all_commits_; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int conflict_n_commits_; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit messages we've sent, and responses we've returned. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<sync_pb::CommitMessage> commit_messages_; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<sync_pb::CommitResponse> commit_responses_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The next id the mock will return to a commit. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int next_new_id_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The store birthday we send to the client. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string store_birthday_; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock store_birthday_lock_; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool store_birthday_sent_; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool client_stuck_; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string commit_time_rename_prepended_string_; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On each PostBufferToPath() call, we decrement this counter. The call fails 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // iff we hit zero at that call. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int countdown_to_postbuffer_fail_; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our directory. Used only to ensure that we are not holding the transaction 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lock when performing network I/O. Can be NULL if the test author is 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // confident this can't happen. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::Directory* directory_; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The updates we'll return to the next request. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<sync_pb::GetUpdatesResponse> update_queue_; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure mid_commit_callback_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MidCommitObserver* mid_commit_observer_; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The keystore key we return for a GetUpdates with need_encryption_key set. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string keystore_key_; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The AUTHENTICATE response we'll return for auth requests. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::AuthenticateResponse auth_response_; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What we use to determine if we should return SUCCESS or BAD_AUTH_TOKEN. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string valid_auth_token_; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are faking a server mandating clients to throttle requests. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Protected by |response_code_override_lock_|. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool throttling_; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are failing all requests by returning 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ClientToServerResponse::AUTH_INVALID. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Protected by |response_code_override_lock_|. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fail_with_auth_invalid_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock response_code_override_lock_; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if we are only accepting GetUpdatesCallerInfo::PERIODIC requests. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fail_non_periodic_get_updates_; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<sync_pb::ClientCommand> gu_client_command_; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<sync_pb::ClientCommand> commit_client_command_; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The next value to use for the position_in_parent property. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 next_position_in_parent_; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default is to use the newer sync_pb::BookmarkSpecifics-style protocol. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this option is set to true, then the MockConnectionManager will 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the older sync_pb::SyncEntity_BookmarkData-style protocol. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_legacy_bookmarks_protocol_; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeSet expected_filter_; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeInvalidationMap expected_states_; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_get_updates_requests_; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string next_token_; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerMessage last_request_; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockConnectionManager); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // SYNC_TEST_ENGINE_MOCK_CONNECTION_MANAGER_H_ 358