12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 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 regression tests.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/test/engine/mock_connection_manager.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/engine/syncer_proto_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/bookmark_specifics.pb.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/directory.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_write_transaction.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/test/engine/test_id_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::find;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::map;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::string;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_pb::ClientToServerMessage;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_pb::CommitMessage;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_pb::CommitResponse;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_pb::GetUpdatesMessage;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_pb::SyncEnums;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::WriteTransaction;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char kValidAuthToken[] = "AuthToken";
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static char kCacheGuid[] = "kqyg7097kro6GSUod+GSg==";
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)MockConnectionManager::MockConnectionManager(syncable::Directory* directory,
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                             CancelationSignal* signal)
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : ServerConnectionManager("unused", 0, false, signal),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      server_reachable_(true),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      conflict_all_commits_(false),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      conflict_n_commits_(0),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_new_id_(10000),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      store_birthday_("Store BDay!"),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      store_birthday_sent_(false),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_stuck_(false),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      countdown_to_postbuffer_fail_(0),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      directory_(directory),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mid_commit_observer_(NULL),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throttling_(false),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fail_with_auth_invalid_(false),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fail_non_periodic_get_updates_(false),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_position_in_parent_(2),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      use_legacy_bookmarks_protocol_(false),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_get_updates_requests_(0) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewTimestamp(0);
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetAuthToken(kValidAuthToken);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockConnectionManager::~MockConnectionManager() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update_queue_.empty()) << "Unfetched updates.";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetCommitTimeRename(string prepend) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commit_time_rename_prepended_string_ = prepend;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetMidCommitCallback(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Closure& callback) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mid_commit_callback_ = callback;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetMidCommitObserver(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockConnectionManager::MidCommitObserver* observer) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mid_commit_observer_ = observer;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockConnectionManager::PostBufferToPath(PostBufferParams* params,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string& path,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string& auth_token,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedServerStatusWatcher* watcher) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientToServerMessage post;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(post.ParseFromString(params->buffer_in));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(post.has_protocol_version());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(post.has_api_key());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(post.has_bag_of_chips());
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  requests_.push_back(post);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_stuck_ = post.sync_problem_detected();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::ClientToServerResponse response;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response.Clear();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (directory_) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the Directory's locked when we do this, it's a problem as in normal
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // use this function could take a while to return because it accesses the
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // network. As we can't test this we do the next best thing and hang here
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // when there's an issue.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(directory_->good());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteTransaction wt(FROM_HERE, syncable::UNITTEST, directory_);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (auth_token.empty()) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params->response.server_status = HttpResponse::SYNC_AUTH_ERROR;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (auth_token != kValidAuthToken) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Simulate server-side auth failure.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params->response.server_status = HttpResponse::SYNC_AUTH_ERROR;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvalidateAndClearAuthToken();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (--countdown_to_postbuffer_fail_ == 0) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Fail as countdown hits zero.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params->response.server_status = HttpResponse::SYNC_SERVER_ERROR;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!server_reachable_) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params->response.server_status = HttpResponse::CONNECTION_UNAVAILABLE;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Default to an ok connection.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->response.server_status = HttpResponse::SERVER_CONNECTION_OK;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response.set_error_code(SyncEnums::SUCCESS);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string current_store_birthday = store_birthday();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response.set_store_birthday(current_store_birthday);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (post.has_store_birthday() && post.store_birthday() !=
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_store_birthday) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response.set_error_code(SyncEnums::NOT_MY_BIRTHDAY);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response.set_error_message("Merry Unbirthday!");
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response.SerializeToString(&params->buffer_out);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    store_birthday_sent_ = true;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = true;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(!store_birthday_sent_ || post.has_store_birthday() ||
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              post.message_contents() == ClientToServerMessage::AUTHENTICATE);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_birthday_sent_ = true;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (post.message_contents() == ClientToServerMessage::COMMIT) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProcessCommit(&post, &response);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (post.message_contents() == ClientToServerMessage::GET_UPDATES) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProcessGetUpdates(&post, &response);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(false) << "Unknown/unsupported ClientToServerMessage";
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::AutoLock lock(response_code_override_lock_);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (throttling_) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      response.set_error_code(SyncEnums::THROTTLED);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throttling_ = false;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fail_with_auth_invalid_)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      response.set_error_code(SyncEnums::AUTH_INVALID);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response.SerializeToString(&params->buffer_out);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (post.message_contents() == ClientToServerMessage::COMMIT &&
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !mid_commit_callback_.is_null()) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mid_commit_callback_.Run();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mid_commit_callback_.Reset();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mid_commit_observer_) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mid_commit_observer_->Observe();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::GetUpdatesResponse* MockConnectionManager::GetUpdateResponse() {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (update_queue_.empty()) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NextUpdateBatch();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &update_queue_.back();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::AddDefaultBookmarkData(sync_pb::SyncEntity* entity,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   bool is_folder) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_legacy_bookmarks_protocol_) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::SyncEntity_BookmarkData* data = entity->mutable_bookmarkdata();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_bookmark_folder(is_folder);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!is_folder) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data->set_bookmark_url("http://google.com");
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entity->set_folder(is_folder);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entity->mutable_specifics()->mutable_bookmark();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!is_folder) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entity->mutable_specifics()->mutable_bookmark()->
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          set_url("http://google.com");
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateDirectory(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int parent_id,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string name,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 version,
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 sync_ts,
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string originator_cache_guid,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string originator_client_item_id) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddUpdateDirectory(TestIdFactory::FromNumber(id),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            TestIdFactory::FromNumber(parent_id),
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            name,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            version,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            sync_ts,
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            originator_cache_guid,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            originator_client_item_id);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetGUClientCommand(
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::ClientCommand* command) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gu_client_command_.reset(command);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetCommitClientCommand(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::ClientCommand* command) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commit_client_command_.reset(command);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockConnectionManager::SetTransientErrorId(syncable::Id id) {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transient_error_ids_.push_back(id);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateBookmark(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id, int parent_id,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string name, int64 version,
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 sync_ts,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_client_item_id,
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_cache_guid) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddUpdateBookmark(TestIdFactory::FromNumber(id),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           TestIdFactory::FromNumber(parent_id),
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           name,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           version,
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           sync_ts,
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           originator_client_item_id,
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           originator_cache_guid);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateSpecifics(
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int id,
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int parent_id,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string name,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 version,
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 sync_ts,
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_dir,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 position,
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const sync_pb::EntitySpecifics& specifics) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::SyncEntity* ent = AddUpdateMeta(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestIdFactory::FromNumber(id).GetServerId(),
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestIdFactory::FromNumber(parent_id).GetServerId(),
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name, version, sync_ts);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_position_in_parent(position);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->mutable_specifics()->CopyFrom(specifics);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_folder(is_dir);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ent;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateSpecifics(
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int id,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int parent_id,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string name,
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 version,
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 sync_ts,
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_dir,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 position,
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const sync_pb::EntitySpecifics& specifics,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_cache_guid,
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_client_item_id) {
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_pb::SyncEntity* ent = AddUpdateSpecifics(
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      id, parent_id, name, version, sync_ts, is_dir, position, specifics);
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ent->set_originator_cache_guid(originator_cache_guid);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ent->set_originator_client_item_id(originator_client_item_id);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ent;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::SetNigori(
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int id,
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 version,
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 sync_ts,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const sync_pb::EntitySpecifics& specifics) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::SyncEntity* ent = GetUpdateResponse()->add_entries();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_id_string(TestIdFactory::FromNumber(id).GetServerId());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_parent_id_string(TestIdFactory::FromNumber(0).GetServerId());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_server_defined_unique_tag(ModelTypeToRootTag(NIGORI));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_name("Nigori");
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_non_unique_name("Nigori");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_version(version);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_sync_timestamp(sync_ts);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_mtime(sync_ts);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_ctime(1);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_position_in_parent(0);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_folder(false);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->mutable_specifics()->CopyFrom(specifics);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ent;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdatePref(string id,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                          string parent_id,
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                          string client_tag,
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                          int64 version,
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                          int64 sync_ts) {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_pb::SyncEntity* ent =
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AddUpdateMeta(id, parent_id, " ", version, sync_ts);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ent->set_client_defined_unique_tag(client_tag);
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_pb::EntitySpecifics specifics;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddDefaultFieldValue(PREFERENCES, &specifics);
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ent->mutable_specifics()->CopyFrom(specifics);
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ent;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateFull(
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string id, string parent_id,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string name, int64 version,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 sync_ts, bool is_dir) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::SyncEntity* ent =
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddUpdateMeta(id, parent_id, name, version, sync_ts);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddDefaultBookmarkData(ent, is_dir);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ent;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateMeta(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string id, string parent_id,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string name, int64 version,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 sync_ts) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::SyncEntity* ent = GetUpdateResponse()->add_entries();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_id_string(id);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_parent_id_string(parent_id);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_non_unique_name(name);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_name(name);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_version(version);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_sync_timestamp(sync_ts);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_mtime(sync_ts);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_ctime(1);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_position_in_parent(GeneratePositionInParent());
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This isn't perfect, but it works well enough.  This is an update, which
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // means the ID is a server ID, which means it never changes.  By making
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // kCacheGuid also never change, we guarantee that the same item always has
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the same originator_cache_guid and originator_client_item_id.
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Unfortunately, neither this class nor the tests that use it explicitly
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // track sync entitites, so supporting proper cache guids and client item IDs
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // would require major refactoring.  The ID used here ought to be the "c-"
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // style ID that was sent up on the commit.
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ent->set_originator_cache_guid(kCacheGuid);
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ent->set_originator_client_item_id(id);
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ent;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateDirectory(
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string id,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string parent_id,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string name,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 version,
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 sync_ts,
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string originator_cache_guid,
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string originator_client_item_id) {
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_pb::SyncEntity* ret =
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AddUpdateFull(id, parent_id, name, version, sync_ts, true);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ret->set_originator_cache_guid(originator_cache_guid);
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ret->set_originator_client_item_id(originator_client_item_id);
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ret;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateBookmark(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string id,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string parent_id,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string name, int64 version,
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 sync_ts,
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_cache_guid,
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_client_item_id) {
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sync_pb::SyncEntity* ret =
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AddUpdateFull(id, parent_id, name, version, sync_ts, false);
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ret->set_originator_cache_guid(originator_cache_guid);
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ret->set_originator_client_item_id(originator_client_item_id);
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ret;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateFromLastCommit() {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, last_sent_commit().entries_size());
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, last_commit_response().entryresponse_size());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CommitResponse::SUCCESS,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_commit_response().entryresponse(0).response_type());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_sent_commit().entries(0).deleted()) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddUpdateTombstone(syncable::Id::CreateFromServerId(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_sent_commit().entries(0).id_string()));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::SyncEntity* ent = GetUpdateResponse()->add_entries();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ent->CopyFrom(last_sent_commit().entries(0));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ent->clear_insert_after_item_id();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ent->clear_old_parent_id();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ent->set_position_in_parent(
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_commit_response().entryresponse(0).position_in_parent());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ent->set_version(
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_commit_response().entryresponse(0).version());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ent->set_id_string(
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_commit_response().entryresponse(0).id_string());
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This is the same hack as in AddUpdateMeta.  See the comment in that
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // function for more information.
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ent->set_originator_cache_guid(kCacheGuid);
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ent->set_originator_client_item_id(
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        last_commit_response().entryresponse(0).id_string());
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (last_sent_commit().entries(0).has_unique_position()) {
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ent->mutable_unique_position()->CopyFrom(
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          last_sent_commit().entries(0).unique_position());
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tests don't currently care about the following:
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // parent_id_string, name, non_unique_name.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetMutableLastUpdate();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::AddUpdateTombstone(const syncable::Id& id) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tombstones have only the ID set and dummy values for the required fields.
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::SyncEntity* ent = GetUpdateResponse()->add_entries();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_id_string(id.GetServerId());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_version(0);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_name("");
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ent->set_deleted(true);
4351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Make sure we can still extract the ModelType from this tombstone.
4371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ent->mutable_specifics()->mutable_bookmark();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetLastUpdateDeleted() {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tombstones have only the ID set.  Wipe anything else.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string id_string = GetMutableLastUpdate()->id_string();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetUpdateResponse()->mutable_entries()->RemoveLast();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUpdateTombstone(syncable::Id::CreateFromServerId(id_string));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetLastUpdateOriginatorFields(
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string& client_id,
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string& entry_id) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMutableLastUpdate()->set_originator_cache_guid(client_id);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMutableLastUpdate()->set_originator_client_item_id(entry_id);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetLastUpdateServerTag(const string& tag) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMutableLastUpdate()->set_server_defined_unique_tag(tag);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetLastUpdateClientTag(const string& tag) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMutableLastUpdate()->set_client_defined_unique_tag(tag);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetLastUpdatePosition(int64 server_position) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMutableLastUpdate()->set_position_in_parent(server_position);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetNewTimestamp(int ts) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_token_ = base::StringPrintf("mock connection ts = %d", ts);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ApplyToken();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::ApplyToken() {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!update_queue_.empty()) {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetUpdateResponse()->clear_new_progress_marker();
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::DataTypeProgressMarker* new_marker =
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetUpdateResponse()->add_new_progress_marker();
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_marker->set_data_type_id(-1);  // Invalid -- clients shouldn't see.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_marker->set_token(next_token_);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetChangesRemaining(int64 timestamp) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetUpdateResponse()->set_changes_remaining(timestamp);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::ProcessGetUpdates(
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::ClientToServerMessage* csm,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::ClientToServerResponse* response) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(csm->has_get_updates());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(csm->message_contents(), ClientToServerMessage::GET_UPDATES);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GetUpdatesMessage& gu = csm->get_updates();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  num_get_updates_requests_++;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(gu.has_from_timestamp());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(gu.has_requested_types());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fail_non_periodic_get_updates_) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::PERIODIC,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              gu.caller_info().source());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the items we're about to send back to the client are of
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the types requested by the client.  If this fails, it probably indicates
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a test bug.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gu.fetch_folders());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(gu.has_requested_types());
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (update_queue_.empty()) {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetUpdateResponse();
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::GetUpdatesResponse* updates = &update_queue_.front();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < updates->entries_size(); ++i) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!updates->entries(i).deleted()) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ModelType entry_type = GetModelType(updates->entries(i));
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IsModelTypePresentInSpecifics(gu.from_progress_marker(), entry_type))
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "Syncer did not request updates being provided by the test.";
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response->mutable_get_updates()->CopyFrom(*updates);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set appropriate progress markers, overriding the value squirreled
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // away by ApplyToken().
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string token = response->get_updates().new_progress_marker(0).token();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response->mutable_get_updates()->clear_new_progress_marker();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < gu.from_progress_marker_size(); ++i) {
5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    sync_pb::DataTypeProgressMarker* new_marker =
5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        response->mutable_get_updates()->add_new_progress_marker();
5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    new_marker->set_data_type_id(gu.from_progress_marker(i).data_type_id());
5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    new_marker->set_token(token);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the keystore key if requested.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gu.need_encryption_key())
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response->mutable_get_updates()->add_encryption_keys(keystore_key_);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  update_queue_.pop_front();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (gu_client_command_) {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response->mutable_client_command()->CopyFrom(*gu_client_command_.get());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetKeystoreKey(const std::string& key) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: this is not a thread-safe set, ok for now.  NOT ok if tests
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // run the syncer on the background thread while this method is called.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keystore_key_ = key;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockConnectionManager::ShouldConflictThisCommit() {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool conflict = false;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (conflict_all_commits_) {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    conflict = true;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (conflict_n_commits_ > 0) {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    conflict = true;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    --conflict_n_commits_;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return conflict;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockConnectionManager::ShouldTransientErrorThisId(syncable::Id id) {
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return find(transient_error_ids_.begin(), transient_error_ids_.end(), id)
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      != transient_error_ids_.end();
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::ProcessCommit(
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::ClientToServerMessage* csm,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::ClientToServerResponse* response_buffer) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(csm->has_commit());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(csm->message_contents(), ClientToServerMessage::COMMIT);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map <string, string> changed_ids;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommitMessage& commit_message = csm->commit();
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommitResponse* commit_response = response_buffer->mutable_commit();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commit_messages_.push_back(new CommitMessage);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commit_messages_.back()->CopyFrom(commit_message);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map<string, sync_pb::CommitResponse_EntryResponse*> response_map;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < commit_message.entries_size() ; i++) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const sync_pb::SyncEntity& entry = commit_message.entries(i);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(entry.has_id_string());
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string id_string = entry.id_string();
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LT(entry.name().length(), 256ul) << " name probably too long. True "
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "server name checking not implemented";
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncable::Id id;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry.version() == 0) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Relies on our new item string id format. (string representation of a
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // negative number).
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      id = syncable::Id::CreateFromClientString(id_string);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      id = syncable::Id::CreateFromServerId(id_string);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    committed_ids_.push_back(id);
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (response_map.end() == response_map.find(id_string))
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      response_map[id_string] = commit_response->add_entryresponse();
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_pb::CommitResponse_EntryResponse* er = response_map[id_string];
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ShouldConflictThisCommit()) {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      er->set_response_type(CommitResponse::CONFLICT);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (ShouldTransientErrorThisId(id)) {
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      er->set_response_type(CommitResponse::TRANSIENT_ERROR);
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    er->set_response_type(CommitResponse::SUCCESS);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    er->set_version(entry.version() + 1);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!commit_time_rename_prepended_string_.empty()) {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Commit time rename sent down from the server.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      er->set_name(commit_time_rename_prepended_string_ + entry.name());
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string parent_id_string = entry.parent_id_string();
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Remap id's we've already assigned.
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (changed_ids.end() != changed_ids.find(parent_id_string)) {
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_id_string = changed_ids[parent_id_string];
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      er->set_parent_id_string(parent_id_string);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry.has_version() && 0 != entry.version()) {
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      er->set_id_string(id_string);  // Allows verification.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string new_id = base::StringPrintf("mock_server:%d", next_new_id_++);
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      changed_ids[id_string] = new_id;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      er->set_id_string(new_id);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commit_responses_.push_back(new CommitResponse(*commit_response));
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (commit_client_command_) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response_buffer->mutable_client_command()->CopyFrom(
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *commit_client_command_.get());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateDirectory(
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncable::Id id,
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncable::Id parent_id,
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string name,
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 version,
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 sync_ts,
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_cache_guid,
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_client_item_id) {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddUpdateDirectory(id.GetServerId(), parent_id.GetServerId(),
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            name, version, sync_ts, originator_cache_guid,
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            originator_client_item_id);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::AddUpdateBookmark(
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncable::Id id,
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncable::Id parent_id,
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string name,
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 version,
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 sync_ts,
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_cache_guid,
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string originator_client_item_id) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddUpdateBookmark(id.GetServerId(), parent_id.GetServerId(),
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           name, version, sync_ts, originator_cache_guid,
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           originator_client_item_id);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEntity* MockConnectionManager::GetMutableLastUpdate() {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::GetUpdatesResponse* updates = GetUpdateResponse();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(updates->entries_size(), 0);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return updates->mutable_entries()->Mutable(updates->entries_size() - 1);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::NextUpdateBatch() {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  update_queue_.push_back(sync_pb::GetUpdatesResponse::default_instance());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetChangesRemaining(0);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ApplyToken();
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const CommitMessage& MockConnectionManager::last_sent_commit() const {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(!commit_messages_.empty());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *commit_messages_.back();
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const CommitResponse& MockConnectionManager::last_commit_response() const {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(!commit_responses_.empty());
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *commit_responses_.back();
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const sync_pb::ClientToServerMessage&
679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    MockConnectionManager::last_request() const {
680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(!requests_.empty());
681f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return requests_.back();
682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const std::vector<sync_pb::ClientToServerMessage>&
685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    MockConnectionManager::requests() const {
686f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return requests_;
687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockConnectionManager::IsModelTypePresentInSpecifics(
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const google::protobuf::RepeatedPtrField<
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sync_pb::DataTypeProgressMarker>& filter,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModelType value) {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int data_type_id = GetSpecificsFieldNumberFromModelType(value);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < filter.size(); ++i) {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filter.Get(i).data_type_id() == data_type_id) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::DataTypeProgressMarker const*
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockConnectionManager::GetProgressMarkerForType(
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const google::protobuf::RepeatedPtrField<
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sync_pb::DataTypeProgressMarker>& filter,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ModelType value) {
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int data_type_id = GetSpecificsFieldNumberFromModelType(value);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < filter.size(); ++i) {
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filter.Get(i).data_type_id() == data_type_id) {
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &(filter.Get(i));
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetServerReachable() {
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_reachable_ = true;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::SetServerNotReachable() {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_reachable_ = false;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockConnectionManager::UpdateConnectionStatus() {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!server_reachable_) {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    server_status_ = HttpResponse::CONNECTION_UNAVAILABLE;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    server_status_ = HttpResponse::SERVER_CONNECTION_OK;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid MockConnectionManager::SetServerStatus(
7337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    HttpResponse::ServerConnectionCode server_status) {
7347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  server_status_ = server_status;
7357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
7367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
738