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