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" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/synchronization/lock.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/engine/net/server_connection_manager.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/internal_api/public/base/unique_position.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockConnectionManager : public ServerConnectionManager { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MidCommitObserver { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe() = 0; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MidCommitObserver() {} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MockConnectionManager(syncable::Directory*, 37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CancelationSignal* signal); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockConnectionManager(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden ServerConnectionManager functions. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool PostBufferToPath( 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostBufferParams*, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& auth_token, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedServerStatusWatcher* watcher) OVERRIDE; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Control of commit response. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: Commit callback is invoked only once then reset. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetMidCommitCallback(const base::Closure& callback); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetMidCommitObserver(MidCommitObserver* observer); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set this if you want commit to perform commit time rename. Will request 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the client renames all commited entries, prepending this string. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetCommitTimeRename(std::string prepend); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generic versions of AddUpdate functions. Tests using these function should 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compile for both the int64 and string id based versions of the server. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The SyncEntity returned is only valid until the Sync is completed 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. with SyncShare.) It allows to add further entity properties before 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sync, using SetLastXXX() methods and/or GetMutableLastUpdate(). 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_pb::SyncEntity* AddUpdateDirectory( 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncable::Id id, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncable::Id parent_id, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 version, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_cache_guid, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_client_item_id); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateBookmark(syncable::Id id, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::Id parent_id, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_cache_guid, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_client_item_id); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Versions of the AddUpdate functions that accept integer IDs. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_pb::SyncEntity* AddUpdateDirectory( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int parent_id, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 version, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_cache_guid, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_client_item_id); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateBookmark(int id, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int parent_id, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_cache_guid, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_client_item_id); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // New protocol versions of the AddUpdate functions. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_pb::SyncEntity* AddUpdateDirectory( 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string id, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string parent_id, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 version, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_cache_guid, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_client_item_id); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateBookmark(std::string id, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string parent_id, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_cache_guid, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_client_item_id); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Versions of the AddUpdate function that accept specifics. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_pb::SyncEntity* AddUpdateSpecifics( 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int parent_id, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name, 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 version, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_dir, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 position, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::EntitySpecifics& specifics); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_pb::SyncEntity* AddUpdateSpecifics( 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int parent_id, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 version, 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_dir, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 position, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const sync_pb::EntitySpecifics& specifics, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_cache_guid, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string originator_client_item_id); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_pb::SyncEntity* SetNigori( 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 version, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const sync_pb::EntitySpecifics& specifics); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unique client tag variant for adding items. 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_pb::SyncEntity* AddUpdatePref(std::string id, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string parent_id, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string client_tag, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 version, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 sync_ts); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the last commit sent by the client, and replay it for the next get 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updates command. This can be used to simulate the GetUpdates that happens 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately after a successful commit. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateFromLastCommit(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a deleted item. Deletion records typically contain no 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // additional information beyond the deletion, and no specifics. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The server may send the originator fields. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddUpdateTombstone(const syncable::Id& id); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdateDeleted(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdateServerTag(const std::string& tag); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdateClientTag(const std::string& tag); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdateOriginatorFields(const std::string& client_id, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& entry_id); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastUpdatePosition(int64 position_in_parent); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetNewTimestamp(int ts); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetChangesRemaining(int64 count); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a new batch of updates after the current one. Allows multiple 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetUpdates responses to be buffered up, since the syncer may 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // issue multiple requests during a sync cycle. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NextUpdateBatch(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FailNextPostBufferToPathCall() { countdown_to_postbuffer_fail_ = 1; } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FailNthPostBufferToPathCall(int n) { countdown_to_postbuffer_fail_ = n; } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetKeystoreKey(const std::string& key); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FailNonPeriodicGetUpdates() { fail_non_periodic_get_updates_ = true; } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simple inspectors. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool client_stuck() const { return client_stuck_; } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // warning: These take ownership of their input. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetGUClientCommand(sync_pb::ClientCommand* command); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetCommitClientCommand(sync_pb::ClientCommand* command); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetTransientErrorId(syncable::Id); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<syncable::Id>& committed_ids() const { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return committed_ids_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<sync_pb::CommitMessage*>& commit_messages() const { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return commit_messages_.get(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<sync_pb::CommitResponse*>& commit_responses() const { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return commit_responses_.get(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the last sent commit message. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::CommitMessage& last_sent_commit() const; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the last returned commit response. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::CommitResponse& last_commit_response() const; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the last request submitted to the server (regardless of type). 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const sync_pb::ClientToServerMessage& last_request() const; 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Retrieve the cumulative collection of all requests sent by clients. 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::vector<sync_pb::ClientToServerMessage>& requests() const; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_conflict_all_commits(bool value) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) conflict_all_commits_ = value; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_next_new_id(int value) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_new_id_ = value; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_conflict_n_commits(int value) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) conflict_n_commits_ = value; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_use_legacy_bookmarks_protocol(bool value) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_legacy_bookmarks_protocol_ = value; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_store_birthday(std::string new_birthday) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Multiple threads can set store_birthday_ in our tests, need to lock it to 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ensure atomic read/writes and avoid race conditions. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(store_birthday_lock_); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store_birthday_ = new_birthday; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the number of GetUpdates requests that the mock server has 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // seen since the last time this function was called. Can be used to 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // verify that a GetUpdates actually did or did not happen after running 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the syncer. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetAndClearNumGetUpdatesRequests() { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = num_get_updates_requests_; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_get_updates_requests_ = 0; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect that GetUpdates will request exactly the types indicated in 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the bitset. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectGetUpdatesRequestTypes(ModelTypeSet expected_filter) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_filter_ = expected_filter; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetServerReachable(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetServerNotReachable(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates our internal state as if we had attempted a connection. Does not 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // send notifications as a real connection attempt would. This is useful in 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cases where we're mocking out most of the code that performs network 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // requests. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateConnectionStatus(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetServerStatus(HttpResponse::ServerConnectionCode server_status); 2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return by copy to be thread-safe. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string store_birthday() { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(store_birthday_lock_); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return store_birthday_; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly indicate that we will not be fetching some updates. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearUpdatesQueue() { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_queue_.clear(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Locate the most recent update message for purpose of alteration. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* GetMutableLastUpdate(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateFull(syncable::Id id, syncable::Id parentid, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, int64 version, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_dir); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateFull(std::string id, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string parentid, std::string name, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 version, int64 sync_ts, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_dir); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::SyncEntity* AddUpdateMeta(std::string id, std::string parentid, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name, int64 version, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_ts); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Functions to handle the various types of server request. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessGetUpdates(sync_pb::ClientToServerMessage* csm, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerResponse* response); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessCommit(sync_pb::ClientToServerMessage* csm, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerResponse* response_buffer); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessClearData(sync_pb::ClientToServerMessage* csm, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ClientToServerResponse* response); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddDefaultBookmarkData(sync_pb::SyncEntity* entity, bool is_folder); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determine if one entry in a commit should be rejected with a conflict. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ShouldConflictThisCommit(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Determine if the given item's commit request should be refused with 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a TRANSIENT_ERROR response. 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ShouldTransientErrorThisId(syncable::Id id); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate a numeric position_in_parent value. We use a global counter 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that only decreases; this simulates new objects always being added to the 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // front of the ordering. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 GeneratePositionInParent() { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return next_position_in_parent_--; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a mutable update response which will eventually be returned to the 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::GetUpdatesResponse* GetUpdateResponse(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ApplyToken(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determine whether an progress marker array (like that sent in 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetUpdates.from_progress_marker) indicates that a particular ModelType 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be included. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsModelTypePresentInSpecifics( 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const google::protobuf::RepeatedPtrField< 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::DataTypeProgressMarker>& filter, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType value); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::DataTypeProgressMarker const* GetProgressMarkerForType( 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const google::protobuf::RepeatedPtrField< 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::DataTypeProgressMarker>& filter, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType value); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When false, we pretend to have network connectivity issues. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool server_reachable_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All IDs that have been committed. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<syncable::Id> committed_ids_; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // List of IDs which should return a transient error. 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<syncable::Id> transient_error_ids_; 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Control of when/if we return conflicts. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool conflict_all_commits_; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int conflict_n_commits_; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit messages we've sent, and responses we've returned. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<sync_pb::CommitMessage> commit_messages_; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<sync_pb::CommitResponse> commit_responses_; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The next id the mock will return to a commit. 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int next_new_id_; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The store birthday we send to the client. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string store_birthday_; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock store_birthday_lock_; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool store_birthday_sent_; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool client_stuck_; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string commit_time_rename_prepended_string_; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On each PostBufferToPath() call, we decrement this counter. The call fails 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // iff we hit zero at that call. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int countdown_to_postbuffer_fail_; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our directory. Used only to ensure that we are not holding the transaction 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lock when performing network I/O. Can be NULL if the test author is 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // confident this can't happen. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::Directory* directory_; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The updates we'll return to the next request. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<sync_pb::GetUpdatesResponse> update_queue_; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure mid_commit_callback_; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MidCommitObserver* mid_commit_observer_; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The keystore key we return for a GetUpdates with need_encryption_key set. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string keystore_key_; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The AUTHENTICATE response we'll return for auth requests. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::AuthenticateResponse auth_response_; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What we use to determine if we should return SUCCESS or BAD_AUTH_TOKEN. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string valid_auth_token_; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are faking a server mandating clients to throttle requests. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Protected by |response_code_override_lock_|. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool throttling_; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are failing all requests by returning 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ClientToServerResponse::AUTH_INVALID. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Protected by |response_code_override_lock_|. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fail_with_auth_invalid_; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock response_code_override_lock_; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if we are only accepting GetUpdatesCallerInfo::PERIODIC requests. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fail_non_periodic_get_updates_; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<sync_pb::ClientCommand> gu_client_command_; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<sync_pb::ClientCommand> commit_client_command_; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The next value to use for the position_in_parent property. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 next_position_in_parent_; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default is to use the newer sync_pb::BookmarkSpecifics-style protocol. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this option is set to true, then the MockConnectionManager will 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the older sync_pb::SyncEntity_BookmarkData-style protocol. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_legacy_bookmarks_protocol_; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeSet expected_filter_; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_get_updates_requests_; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string next_token_; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<sync_pb::ClientToServerMessage> requests_; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockConnectionManager); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // SYNC_TEST_ENGINE_MOCK_CONNECTION_MANAGER_H_ 407