1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef SYNC_TEST_ENGINE_MOCK_MODEL_TYPE_SYNC_PROXY_H_ 6#define SYNC_TEST_ENGINE_MOCK_MODEL_TYPE_SYNC_PROXY_H_ 7 8#include <vector> 9 10#include "base/callback.h" 11#include "base/macros.h" 12#include "sync/engine/model_type_sync_proxy.h" 13#include "sync/internal_api/public/non_blocking_sync_common.h" 14 15namespace syncer { 16 17// Mocks the ModelTypeSyncProxy. 18// 19// This mock is made simpler by not using any threads. It does still have the 20// ability to defer execution if we need to test race conditions, though. 21// 22// It maintains some state to try to make its behavior more realistic. It 23// updates this state as it creates commit requests or receives update and 24// commit responses. 25// 26// It keeps a log of all received messages so tests can make assertions based 27// on their value. 28class MockModelTypeSyncProxy : public ModelTypeSyncProxy { 29 public: 30 MockModelTypeSyncProxy(); 31 virtual ~MockModelTypeSyncProxy(); 32 33 // Implementation of ModelTypeSyncProxy. 34 virtual void OnCommitCompleted( 35 const DataTypeState& type_state, 36 const CommitResponseDataList& response_list) OVERRIDE; 37 virtual void OnUpdateReceived( 38 const DataTypeState& type_state, 39 const UpdateResponseDataList& response_list, 40 const UpdateResponseDataList& pending_updates) OVERRIDE; 41 42 // By default, this object behaves as if all messages are processed 43 // immediately. Sometimes it is useful to defer work until later, as might 44 // happen in the real world if the model thread's task queue gets backed up. 45 void SetSynchronousExecution(bool is_synchronous); 46 47 // Runs any work that was deferred while this class was in asynchronous mode. 48 // 49 // This function is not useful unless this object is set to synchronous 50 // execution mode, which is the default. 51 void RunQueuedTasks(); 52 53 // Generate commit or deletion requests to be sent to the server. 54 // These functions update local state to keep sequence numbers consistent. 55 // 56 // A real ModelTypeSyncProxy would forward these kinds of messages 57 // directly to its attached ModelTypeSyncWorker. These methods 58 // return the value to the caller so the test framework can handle them as it 59 // sees fit. 60 CommitRequestData CommitRequest(const std::string& tag_hash, 61 const sync_pb::EntitySpecifics& specifics); 62 CommitRequestData DeleteRequest(const std::string& tag_hash); 63 64 // Getters to access the log of received update responses. 65 // 66 // Does not includes repsonses that are in pending tasks. 67 size_t GetNumUpdateResponses() const; 68 UpdateResponseDataList GetNthUpdateResponse(size_t n) const; 69 UpdateResponseDataList GetNthPendingUpdates(size_t n) const; 70 DataTypeState GetNthTypeStateReceivedInUpdateResponse(size_t n) const; 71 72 // Getters to access the log of received commit responses. 73 // 74 // Does not includes repsonses that are in pending tasks. 75 size_t GetNumCommitResponses() const; 76 CommitResponseDataList GetNthCommitResponse(size_t n) const; 77 DataTypeState GetNthTypeStateReceivedInCommitResponse(size_t n) const; 78 79 // Getters to access the lastest update response for a given tag_hash. 80 bool HasUpdateResponse(const std::string& tag_hash) const; 81 UpdateResponseData GetUpdateResponse(const std::string& tag_hash) const; 82 83 // Getters to access the lastest commit response for a given tag_hash. 84 bool HasCommitResponse(const std::string& tag_hash) const; 85 CommitResponseData GetCommitResponse(const std::string& tag_hash) const; 86 87 private: 88 // Process a received commit response. 89 // 90 // Implemented as an Impl method so we can defer its execution in some cases. 91 void OnCommitCompletedImpl(const DataTypeState& type_state, 92 const CommitResponseDataList& response_list); 93 94 // Process a received update response. 95 // 96 // Implemented as an Impl method so we can defer its execution in some cases. 97 void OnUpdateReceivedImpl(const DataTypeState& type_state, 98 const UpdateResponseDataList& response_list, 99 const UpdateResponseDataList& pending_updates); 100 101 // Getter and setter for per-item sequence number tracking. 102 int64 GetCurrentSequenceNumber(const std::string& tag_hash) const; 103 int64 GetNextSequenceNumber(const std::string& tag_hash); 104 105 // Getter and setter for per-item base version tracking. 106 int64 GetBaseVersion(const std::string& tag_hash) const; 107 void SetBaseVersion(const std::string& tag_hash, int64 version); 108 109 // Getters and setter for server-assigned ID values. 110 bool HasServerAssignedId(const std::string& tag_hash) const; 111 const std::string& GetServerAssignedId(const std::string& tag_hash) const; 112 void SetServerAssignedId(const std::string& tag_hash, const std::string& id); 113 114 // State related to the implementation of deferred work. 115 // See SetSynchronousExecution() for details. 116 bool is_synchronous_; 117 std::vector<base::Closure> pending_tasks_; 118 119 // A log of messages received by this object. 120 std::vector<CommitResponseDataList> received_commit_responses_; 121 std::vector<UpdateResponseDataList> received_update_responses_; 122 std::vector<UpdateResponseDataList> received_pending_updates_; 123 std::vector<DataTypeState> type_states_received_on_update_; 124 std::vector<DataTypeState> type_states_received_on_commit_; 125 126 // Latest responses received, indexed by tag_hash. 127 std::map<const std::string, CommitResponseData> commit_response_items_; 128 std::map<const std::string, UpdateResponseData> update_response_items_; 129 130 // The per-item state maps. 131 std::map<const std::string, int64> sequence_numbers_; 132 std::map<const std::string, int64> base_versions_; 133 std::map<const std::string, std::string> assigned_ids_; 134 135 DISALLOW_COPY_AND_ASSIGN(MockModelTypeSyncProxy); 136}; 137 138} // namespace syncer 139 140#endif // SYNC_TEST_ENGINE_MOCK_MODEL_TYPE_SYNC_PROXY_H_ 141