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#include "sync/test/engine/mock_model_type_sync_proxy.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/bind.h" 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace syncer { 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 11116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMockModelTypeSyncProxy::MockModelTypeSyncProxy() : is_synchronous_(true) { 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 14116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMockModelTypeSyncProxy::~MockModelTypeSyncProxy() { 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockModelTypeSyncProxy::OnCommitCompleted( 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const DataTypeState& type_state, 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const CommitResponseDataList& response_list) { 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Closure task = 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&MockModelTypeSyncProxy::OnCommitCompletedImpl, 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this), 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) type_state, 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) response_list); 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pending_tasks_.push_back(task); 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (is_synchronous_) 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RunQueuedTasks(); 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockModelTypeSyncProxy::OnUpdateReceived( 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const DataTypeState& type_state, 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const UpdateResponseDataList& response_list, 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const UpdateResponseDataList& pending_updates) { 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Closure task = base::Bind(&MockModelTypeSyncProxy::OnUpdateReceivedImpl, 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this), 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch type_state, 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) response_list, 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pending_updates); 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pending_tasks_.push_back(task); 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (is_synchronous_) 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RunQueuedTasks(); 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockModelTypeSyncProxy::SetSynchronousExecution(bool is_synchronous) { 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) is_synchronous_ = is_synchronous; 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockModelTypeSyncProxy::RunQueuedTasks() { 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (std::vector<base::Closure>::iterator it = pending_tasks_.begin(); 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) it != pending_tasks_.end(); 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ++it) { 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) it->Run(); 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pending_tasks_.clear(); 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 57116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCommitRequestData MockModelTypeSyncProxy::CommitRequest( 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash, 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const sync_pb::EntitySpecifics& specifics) { 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const int64 base_version = GetBaseVersion(tag_hash); 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CommitRequestData data; 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (HasServerAssignedId(tag_hash)) { 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.id = GetServerAssignedId(tag_hash); 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.client_tag_hash = tag_hash; 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.sequence_number = GetNextSequenceNumber(tag_hash); 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.deleted = false; 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.specifics = specifics; 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.base_version = base_version; 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // These fields are not really used for much, but we set them anyway 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // to make this item look more realistic. 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.ctime = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.mtime = data.ctime + base::TimeDelta::FromSeconds(base_version); 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.non_unique_name = "Name: " + tag_hash; 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return data; 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 83116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCommitRequestData MockModelTypeSyncProxy::DeleteRequest( 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) { 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const int64 base_version = GetBaseVersion(tag_hash); 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CommitRequestData data; 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (HasServerAssignedId(tag_hash)) { 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.id = GetServerAssignedId(tag_hash); 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.client_tag_hash = tag_hash; 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.sequence_number = GetNextSequenceNumber(tag_hash); 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.base_version = base_version; 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.mtime = data.ctime + base::TimeDelta::FromSeconds(base_version); 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.deleted = true; 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // These fields have little or no effect on behavior. We set them anyway to 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // make the test more realistic. 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.ctime = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.non_unique_name = "Name deleted"; 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return data; 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsize_t MockModelTypeSyncProxy::GetNumUpdateResponses() const { 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return received_update_responses_.size(); 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 110116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUpdateResponseDataList MockModelTypeSyncProxy::GetNthUpdateResponse( 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t n) const { 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK_LT(n, GetNumUpdateResponses()); 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return received_update_responses_[n]; 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)UpdateResponseDataList MockModelTypeSyncProxy::GetNthPendingUpdates( 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t n) const { 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_LT(n, GetNumUpdateResponses()); 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return received_pending_updates_[n]; 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 122116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDataTypeState MockModelTypeSyncProxy::GetNthTypeStateReceivedInUpdateResponse( 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t n) const { 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK_LT(n, GetNumUpdateResponses()); 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return type_states_received_on_update_[n]; 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsize_t MockModelTypeSyncProxy::GetNumCommitResponses() const { 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return received_commit_responses_.size(); 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 132116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCommitResponseDataList MockModelTypeSyncProxy::GetNthCommitResponse( 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t n) const { 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK_LT(n, GetNumCommitResponses()); 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return received_commit_responses_[n]; 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 138116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDataTypeState MockModelTypeSyncProxy::GetNthTypeStateReceivedInCommitResponse( 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t n) const { 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK_LT(n, GetNumCommitResponses()); 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return type_states_received_on_commit_[n]; 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool MockModelTypeSyncProxy::HasUpdateResponse( 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) const { 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::map<const std::string, UpdateResponseData>::const_iterator it = 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) update_response_items_.find(tag_hash); 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return it != update_response_items_.end(); 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 151116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUpdateResponseData MockModelTypeSyncProxy::GetUpdateResponse( 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) const { 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(HasUpdateResponse(tag_hash)); 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::map<const std::string, UpdateResponseData>::const_iterator it = 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) update_response_items_.find(tag_hash); 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return it->second; 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool MockModelTypeSyncProxy::HasCommitResponse( 160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) const { 161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::map<const std::string, CommitResponseData>::const_iterator it = 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) commit_response_items_.find(tag_hash); 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return it != commit_response_items_.end(); 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 166116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCommitResponseData MockModelTypeSyncProxy::GetCommitResponse( 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) const { 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(HasCommitResponse(tag_hash)); 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::map<const std::string, CommitResponseData>::const_iterator it = 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) commit_response_items_.find(tag_hash); 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return it->second; 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockModelTypeSyncProxy::OnCommitCompletedImpl( 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const DataTypeState& type_state, 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const CommitResponseDataList& response_list) { 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) received_commit_responses_.push_back(response_list); 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) type_states_received_on_commit_.push_back(type_state); 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (CommitResponseDataList::const_iterator it = response_list.begin(); 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) it != response_list.end(); 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ++it) { 182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) commit_response_items_.insert(std::make_pair(it->client_tag_hash, *it)); 183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Server wins. Set the model's base version. 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetBaseVersion(it->client_tag_hash, it->response_version); 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetServerAssignedId(it->client_tag_hash, it->id); 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockModelTypeSyncProxy::OnUpdateReceivedImpl( 191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const DataTypeState& type_state, 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const UpdateResponseDataList& response_list, 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const UpdateResponseDataList& pending_updates) { 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) received_update_responses_.push_back(response_list); 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) received_pending_updates_.push_back(pending_updates); 196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) type_states_received_on_update_.push_back(type_state); 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (UpdateResponseDataList::const_iterator it = response_list.begin(); 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) it != response_list.end(); 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ++it) { 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) update_response_items_.insert(std::make_pair(it->client_tag_hash, *it)); 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Server wins. Set the model's base version. 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetBaseVersion(it->client_tag_hash, it->response_version); 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetServerAssignedId(it->client_tag_hash, it->id); 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Fetches the sequence number as of the most recent update request. 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint64 MockModelTypeSyncProxy::GetCurrentSequenceNumber( 210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) const { 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::map<const std::string, int64>::const_iterator it = 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sequence_numbers_.find(tag_hash); 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (it == sequence_numbers_.end()) { 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return 0; 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return it->second; 217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// The model thread should be sending us items with strictly increasing 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// sequence numbers. Here's where we emulate that behavior. 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint64 MockModelTypeSyncProxy::GetNextSequenceNumber( 223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) { 224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int64 sequence_number = GetCurrentSequenceNumber(tag_hash); 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sequence_number++; 226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sequence_numbers_[tag_hash] = sequence_number; 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return sequence_number; 228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint64 MockModelTypeSyncProxy::GetBaseVersion( 231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) const { 232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::map<const std::string, int64>::const_iterator it = 233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base_versions_.find(tag_hash); 234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (it == base_versions_.end()) { 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return kUncommittedVersion; 236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return it->second; 238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockModelTypeSyncProxy::SetBaseVersion(const std::string& tag_hash, 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int64 version) { 243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base_versions_[tag_hash] = version; 244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool MockModelTypeSyncProxy::HasServerAssignedId( 247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) const { 248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return assigned_ids_.find(tag_hash) != assigned_ids_.end(); 249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst std::string& MockModelTypeSyncProxy::GetServerAssignedId( 252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& tag_hash) const { 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(HasServerAssignedId(tag_hash)); 254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return assigned_ids_.find(tag_hash)->second; 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockModelTypeSyncProxy::SetServerAssignedId(const std::string& tag_hash, 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& id) { 259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) assigned_ids_[tag_hash] = id; 260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace syncer 263