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