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