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