| Index: sync/test/engine/mock_connection_manager.cc
|
| diff --git a/sync/test/engine/mock_connection_manager.cc b/sync/test/engine/mock_connection_manager.cc
|
| deleted file mode 100644
|
| index 5a7ecd943418bc6c8829f06f083d3a6ad3dbb81c..0000000000000000000000000000000000000000
|
| --- a/sync/test/engine/mock_connection_manager.cc
|
| +++ /dev/null
|
| @@ -1,777 +0,0 @@
|
| -// Copyright 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -//
|
| -// Mock ServerConnectionManager class for use in client regression tests.
|
| -
|
| -#include "sync/test/engine/mock_connection_manager.h"
|
| -
|
| -#include <stdint.h>
|
| -
|
| -#include <map>
|
| -
|
| -#include "base/location.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "sync/engine/syncer_proto_util.h"
|
| -#include "sync/protocol/bookmark_specifics.pb.h"
|
| -#include "sync/syncable/directory.h"
|
| -#include "sync/syncable/syncable_write_transaction.h"
|
| -#include "sync/test/engine/test_id_factory.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using std::find;
|
| -using std::map;
|
| -using std::string;
|
| -using sync_pb::ClientToServerMessage;
|
| -using sync_pb::CommitMessage;
|
| -using sync_pb::CommitResponse;
|
| -using sync_pb::GetUpdatesMessage;
|
| -using sync_pb::SyncEnums;
|
| -
|
| -namespace syncer {
|
| -
|
| -using syncable::WriteTransaction;
|
| -
|
| -static char kValidAuthToken[] = "AuthToken";
|
| -static char kCacheGuid[] = "kqyg7097kro6GSUod+GSg==";
|
| -
|
| -MockConnectionManager::MockConnectionManager(syncable::Directory* directory,
|
| - CancelationSignal* signal)
|
| - : ServerConnectionManager("unused", 0, false, signal),
|
| - server_reachable_(true),
|
| - conflict_all_commits_(false),
|
| - conflict_n_commits_(0),
|
| - next_new_id_(10000),
|
| - store_birthday_("Store BDay!"),
|
| - store_birthday_sent_(false),
|
| - client_stuck_(false),
|
| - countdown_to_postbuffer_fail_(0),
|
| - directory_(directory),
|
| - mid_commit_observer_(NULL),
|
| - throttling_(false),
|
| - partialThrottling_(false),
|
| - fail_non_periodic_get_updates_(false),
|
| - next_position_in_parent_(2),
|
| - use_legacy_bookmarks_protocol_(false),
|
| - num_get_updates_requests_(0) {
|
| - SetNewTimestamp(0);
|
| - SetAuthToken(kValidAuthToken);
|
| -}
|
| -
|
| -MockConnectionManager::~MockConnectionManager() {
|
| - EXPECT_TRUE(update_queue_.empty()) << "Unfetched updates.";
|
| -}
|
| -
|
| -void MockConnectionManager::SetCommitTimeRename(const string& prepend) {
|
| - commit_time_rename_prepended_string_ = prepend;
|
| -}
|
| -
|
| -void MockConnectionManager::SetMidCommitCallback(
|
| - const base::Closure& callback) {
|
| - mid_commit_callback_ = callback;
|
| -}
|
| -
|
| -void MockConnectionManager::SetMidCommitObserver(
|
| - MockConnectionManager::MidCommitObserver* observer) {
|
| - mid_commit_observer_ = observer;
|
| -}
|
| -
|
| -bool MockConnectionManager::PostBufferToPath(PostBufferParams* params,
|
| - const string& path,
|
| - const string& auth_token) {
|
| - ClientToServerMessage post;
|
| - CHECK(post.ParseFromString(params->buffer_in));
|
| - CHECK(post.has_protocol_version());
|
| - CHECK(post.has_api_key());
|
| - CHECK(post.has_bag_of_chips());
|
| -
|
| - requests_.push_back(post);
|
| - client_stuck_ = post.sync_problem_detected();
|
| - sync_pb::ClientToServerResponse response;
|
| - response.Clear();
|
| -
|
| - if (directory_) {
|
| - // If the Directory's locked when we do this, it's a problem as in normal
|
| - // use this function could take a while to return because it accesses the
|
| - // network. As we can't test this we do the next best thing and hang here
|
| - // when there's an issue.
|
| - CHECK(directory_->good());
|
| - WriteTransaction wt(FROM_HERE, syncable::UNITTEST, directory_);
|
| - }
|
| -
|
| - if (auth_token.empty()) {
|
| - params->response.server_status = HttpResponse::SYNC_AUTH_ERROR;
|
| - return false;
|
| - }
|
| -
|
| - if (auth_token != kValidAuthToken) {
|
| - // Simulate server-side auth failure.
|
| - params->response.server_status = HttpResponse::SYNC_AUTH_ERROR;
|
| - InvalidateAndClearAuthToken();
|
| - }
|
| -
|
| - if (--countdown_to_postbuffer_fail_ == 0) {
|
| - // Fail as countdown hits zero.
|
| - params->response.server_status = HttpResponse::SYNC_SERVER_ERROR;
|
| - return false;
|
| - }
|
| -
|
| - if (!server_reachable_) {
|
| - params->response.server_status = HttpResponse::CONNECTION_UNAVAILABLE;
|
| - return false;
|
| - }
|
| -
|
| - // Default to an ok connection.
|
| - params->response.server_status = HttpResponse::SERVER_CONNECTION_OK;
|
| - response.set_error_code(SyncEnums::SUCCESS);
|
| - const string current_store_birthday = store_birthday();
|
| - response.set_store_birthday(current_store_birthday);
|
| - if (post.has_store_birthday() && post.store_birthday() !=
|
| - current_store_birthday) {
|
| - response.set_error_code(SyncEnums::NOT_MY_BIRTHDAY);
|
| - response.set_error_message("Merry Unbirthday!");
|
| - response.SerializeToString(¶ms->buffer_out);
|
| - store_birthday_sent_ = true;
|
| - return true;
|
| - }
|
| - bool result = true;
|
| - EXPECT_TRUE(!store_birthday_sent_ || post.has_store_birthday() ||
|
| - post.message_contents() == ClientToServerMessage::AUTHENTICATE ||
|
| - post.message_contents() ==
|
| - ClientToServerMessage::CLEAR_SERVER_DATA);
|
| - store_birthday_sent_ = true;
|
| -
|
| - if (post.message_contents() == ClientToServerMessage::COMMIT) {
|
| - ProcessCommit(&post, &response);
|
| - } else if (post.message_contents() == ClientToServerMessage::GET_UPDATES) {
|
| - ProcessGetUpdates(&post, &response);
|
| - } else if (post.message_contents() ==
|
| - ClientToServerMessage::CLEAR_SERVER_DATA) {
|
| - ProcessClearServerData(&post, &response);
|
| - } else {
|
| - EXPECT_TRUE(false) << "Unknown/unsupported ClientToServerMessage";
|
| - return false;
|
| - }
|
| -
|
| - {
|
| - base::AutoLock lock(response_code_override_lock_);
|
| - if (throttling_) {
|
| - response.set_error_code(SyncEnums::THROTTLED);
|
| - throttling_ = false;
|
| - }
|
| -
|
| - if (partialThrottling_) {
|
| - sync_pb::ClientToServerResponse_Error* response_error =
|
| - response.mutable_error();
|
| - response_error->set_error_type(SyncEnums::PARTIAL_FAILURE);
|
| - for (ModelTypeSet::Iterator it = throttled_type_.First(); it.Good();
|
| - it.Inc()) {
|
| - response_error->add_error_data_type_ids(
|
| - GetSpecificsFieldNumberFromModelType(it.Get()));
|
| - }
|
| - partialThrottling_ = false;
|
| - }
|
| - }
|
| -
|
| - response.SerializeToString(¶ms->buffer_out);
|
| - if (post.message_contents() == ClientToServerMessage::COMMIT &&
|
| - !mid_commit_callback_.is_null()) {
|
| - mid_commit_callback_.Run();
|
| - mid_commit_callback_.Reset();
|
| - }
|
| - if (mid_commit_observer_) {
|
| - mid_commit_observer_->Observe();
|
| - }
|
| -
|
| - return result;
|
| -}
|
| -
|
| -sync_pb::GetUpdatesResponse* MockConnectionManager::GetUpdateResponse() {
|
| - if (update_queue_.empty()) {
|
| - NextUpdateBatch();
|
| - }
|
| - return &update_queue_.back();
|
| -}
|
| -
|
| -void MockConnectionManager::AddDefaultBookmarkData(sync_pb::SyncEntity* entity,
|
| - bool is_folder) {
|
| - if (use_legacy_bookmarks_protocol_) {
|
| - sync_pb::SyncEntity_BookmarkData* data = entity->mutable_bookmarkdata();
|
| - data->set_bookmark_folder(is_folder);
|
| -
|
| - if (!is_folder) {
|
| - data->set_bookmark_url("http://google.com");
|
| - }
|
| - } else {
|
| - entity->set_folder(is_folder);
|
| - entity->mutable_specifics()->mutable_bookmark();
|
| - if (!is_folder) {
|
| - entity->mutable_specifics()->mutable_bookmark()->
|
| - set_url("http://google.com");
|
| - }
|
| - }
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateDirectory(
|
| - int id,
|
| - int parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - const std::string& originator_cache_guid,
|
| - const std::string& originator_client_item_id) {
|
| - return AddUpdateDirectory(TestIdFactory::FromNumber(id),
|
| - TestIdFactory::FromNumber(parent_id),
|
| - name,
|
| - version,
|
| - sync_ts,
|
| - originator_cache_guid,
|
| - originator_client_item_id);
|
| -}
|
| -
|
| -void MockConnectionManager::SetGUClientCommand(
|
| - sync_pb::ClientCommand* command) {
|
| - gu_client_command_.reset(command);
|
| -}
|
| -
|
| -void MockConnectionManager::SetCommitClientCommand(
|
| - sync_pb::ClientCommand* command) {
|
| - commit_client_command_.reset(command);
|
| -}
|
| -
|
| -void MockConnectionManager::SetTransientErrorId(syncable::Id id) {
|
| - transient_error_ids_.push_back(id);
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateBookmark(
|
| - int id,
|
| - int parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - const string& originator_client_item_id,
|
| - const string& originator_cache_guid) {
|
| - return AddUpdateBookmark(TestIdFactory::FromNumber(id),
|
| - TestIdFactory::FromNumber(parent_id),
|
| - name,
|
| - version,
|
| - sync_ts,
|
| - originator_client_item_id,
|
| - originator_cache_guid);
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateSpecifics(
|
| - int id,
|
| - int parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - bool is_dir,
|
| - int64_t position,
|
| - const sync_pb::EntitySpecifics& specifics) {
|
| - sync_pb::SyncEntity* ent = AddUpdateMeta(
|
| - TestIdFactory::FromNumber(id).GetServerId(),
|
| - TestIdFactory::FromNumber(parent_id).GetServerId(),
|
| - name, version, sync_ts);
|
| - ent->set_position_in_parent(position);
|
| - ent->mutable_specifics()->CopyFrom(specifics);
|
| - ent->set_folder(is_dir);
|
| - return ent;
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateSpecifics(
|
| - int id,
|
| - int parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - bool is_dir,
|
| - int64_t position,
|
| - const sync_pb::EntitySpecifics& specifics,
|
| - const string& originator_cache_guid,
|
| - const string& originator_client_item_id) {
|
| - sync_pb::SyncEntity* ent = AddUpdateSpecifics(
|
| - id, parent_id, name, version, sync_ts, is_dir, position, specifics);
|
| - ent->set_originator_cache_guid(originator_cache_guid);
|
| - ent->set_originator_client_item_id(originator_client_item_id);
|
| - return ent;
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::SetNigori(
|
| - int id,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - const sync_pb::EntitySpecifics& specifics) {
|
| - sync_pb::SyncEntity* ent = GetUpdateResponse()->add_entries();
|
| - ent->set_id_string(TestIdFactory::FromNumber(id).GetServerId());
|
| - ent->set_parent_id_string(TestIdFactory::FromNumber(0).GetServerId());
|
| - ent->set_server_defined_unique_tag(ModelTypeToRootTag(NIGORI));
|
| - ent->set_name("Nigori");
|
| - ent->set_non_unique_name("Nigori");
|
| - ent->set_version(version);
|
| - ent->set_sync_timestamp(sync_ts);
|
| - ent->set_mtime(sync_ts);
|
| - ent->set_ctime(1);
|
| - ent->set_position_in_parent(0);
|
| - ent->set_folder(false);
|
| - ent->mutable_specifics()->CopyFrom(specifics);
|
| - return ent;
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdatePref(
|
| - const string& id,
|
| - const string& parent_id,
|
| - const string& client_tag,
|
| - int64_t version,
|
| - int64_t sync_ts) {
|
| - sync_pb::SyncEntity* ent =
|
| - AddUpdateMeta(id, parent_id, " ", version, sync_ts);
|
| -
|
| - ent->set_client_defined_unique_tag(client_tag);
|
| -
|
| - sync_pb::EntitySpecifics specifics;
|
| - AddDefaultFieldValue(PREFERENCES, &specifics);
|
| - ent->mutable_specifics()->CopyFrom(specifics);
|
| -
|
| - return ent;
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateFull(
|
| - const string& id,
|
| - const string& parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - bool is_dir) {
|
| - sync_pb::SyncEntity* ent =
|
| - AddUpdateMeta(id, parent_id, name, version, sync_ts);
|
| - AddDefaultBookmarkData(ent, is_dir);
|
| - return ent;
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateMeta(
|
| - const string& id,
|
| - const string& parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts) {
|
| - sync_pb::SyncEntity* ent = GetUpdateResponse()->add_entries();
|
| - ent->set_id_string(id);
|
| - ent->set_parent_id_string(parent_id);
|
| - ent->set_non_unique_name(name);
|
| - ent->set_name(name);
|
| - ent->set_version(version);
|
| - ent->set_sync_timestamp(sync_ts);
|
| - ent->set_mtime(sync_ts);
|
| - ent->set_ctime(1);
|
| - ent->set_position_in_parent(GeneratePositionInParent());
|
| -
|
| - // This isn't perfect, but it works well enough. This is an update, which
|
| - // means the ID is a server ID, which means it never changes. By making
|
| - // kCacheGuid also never change, we guarantee that the same item always has
|
| - // the same originator_cache_guid and originator_client_item_id.
|
| - //
|
| - // Unfortunately, neither this class nor the tests that use it explicitly
|
| - // track sync entitites, so supporting proper cache guids and client item IDs
|
| - // would require major refactoring. The ID used here ought to be the "c-"
|
| - // style ID that was sent up on the commit.
|
| - ent->set_originator_cache_guid(kCacheGuid);
|
| - ent->set_originator_client_item_id(id);
|
| -
|
| - return ent;
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateDirectory(
|
| - const string& id,
|
| - const string& parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - const std::string& originator_cache_guid,
|
| - const std::string& originator_client_item_id) {
|
| - sync_pb::SyncEntity* ret =
|
| - AddUpdateFull(id, parent_id, name, version, sync_ts, true);
|
| - ret->set_originator_cache_guid(originator_cache_guid);
|
| - ret->set_originator_client_item_id(originator_client_item_id);
|
| - return ret;
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateBookmark(
|
| - const string& id,
|
| - const string& parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - const string& originator_cache_guid,
|
| - const string& originator_client_item_id) {
|
| - sync_pb::SyncEntity* ret =
|
| - AddUpdateFull(id, parent_id, name, version, sync_ts, false);
|
| - ret->set_originator_cache_guid(originator_cache_guid);
|
| - ret->set_originator_client_item_id(originator_client_item_id);
|
| - return ret;
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateFromLastCommit() {
|
| - EXPECT_EQ(1, last_sent_commit().entries_size());
|
| - EXPECT_EQ(1, last_commit_response().entryresponse_size());
|
| - EXPECT_EQ(CommitResponse::SUCCESS,
|
| - last_commit_response().entryresponse(0).response_type());
|
| -
|
| - if (last_sent_commit().entries(0).deleted()) {
|
| - ModelType type = GetModelType(last_sent_commit().entries(0));
|
| - AddUpdateTombstone(syncable::Id::CreateFromServerId(
|
| - last_sent_commit().entries(0).id_string()), type);
|
| - } else {
|
| - sync_pb::SyncEntity* ent = GetUpdateResponse()->add_entries();
|
| - ent->CopyFrom(last_sent_commit().entries(0));
|
| - ent->clear_insert_after_item_id();
|
| - ent->clear_old_parent_id();
|
| - ent->set_position_in_parent(
|
| - last_commit_response().entryresponse(0).position_in_parent());
|
| - ent->set_version(
|
| - last_commit_response().entryresponse(0).version());
|
| - ent->set_id_string(
|
| - last_commit_response().entryresponse(0).id_string());
|
| -
|
| - // This is the same hack as in AddUpdateMeta. See the comment in that
|
| - // function for more information.
|
| - ent->set_originator_cache_guid(kCacheGuid);
|
| - ent->set_originator_client_item_id(
|
| - last_commit_response().entryresponse(0).id_string());
|
| -
|
| - if (last_sent_commit().entries(0).has_unique_position()) {
|
| - ent->mutable_unique_position()->CopyFrom(
|
| - last_sent_commit().entries(0).unique_position());
|
| - }
|
| -
|
| - // Tests don't currently care about the following:
|
| - // parent_id_string, name, non_unique_name.
|
| - }
|
| - return GetMutableLastUpdate();
|
| -}
|
| -
|
| -void MockConnectionManager::AddUpdateTombstone(
|
| - const syncable::Id& id,
|
| - ModelType type) {
|
| - // Tombstones have only the ID set and dummy values for the required fields.
|
| - sync_pb::SyncEntity* ent = GetUpdateResponse()->add_entries();
|
| - ent->set_id_string(id.GetServerId());
|
| - ent->set_version(0);
|
| - ent->set_name("");
|
| - ent->set_deleted(true);
|
| -
|
| - // Make sure we can still extract the ModelType from this tombstone.
|
| - AddDefaultFieldValue(type, ent->mutable_specifics());
|
| -}
|
| -
|
| -void MockConnectionManager::SetLastUpdateDeleted() {
|
| - // Tombstones have only the ID set. Wipe anything else.
|
| - string id_string = GetMutableLastUpdate()->id_string();
|
| - ModelType type = GetModelType(*GetMutableLastUpdate());
|
| - GetUpdateResponse()->mutable_entries()->RemoveLast();
|
| - AddUpdateTombstone(syncable::Id::CreateFromServerId(id_string), type);
|
| -}
|
| -
|
| -void MockConnectionManager::SetLastUpdateOriginatorFields(
|
| - const string& client_id,
|
| - const string& entry_id) {
|
| - GetMutableLastUpdate()->set_originator_cache_guid(client_id);
|
| - GetMutableLastUpdate()->set_originator_client_item_id(entry_id);
|
| -}
|
| -
|
| -void MockConnectionManager::SetLastUpdateServerTag(const string& tag) {
|
| - GetMutableLastUpdate()->set_server_defined_unique_tag(tag);
|
| -}
|
| -
|
| -void MockConnectionManager::SetLastUpdateClientTag(const string& tag) {
|
| - GetMutableLastUpdate()->set_client_defined_unique_tag(tag);
|
| -}
|
| -
|
| -void MockConnectionManager::SetLastUpdatePosition(int64_t server_position) {
|
| - GetMutableLastUpdate()->set_position_in_parent(server_position);
|
| -}
|
| -
|
| -void MockConnectionManager::SetNewTimestamp(int ts) {
|
| - next_token_ = base::StringPrintf("mock connection ts = %d", ts);
|
| - ApplyToken();
|
| -}
|
| -
|
| -sync_pb::DataTypeProgressMarker*
|
| -MockConnectionManager::AddUpdateProgressMarker() {
|
| - return GetUpdateResponse()->add_new_progress_marker();
|
| -}
|
| -
|
| -void MockConnectionManager::ApplyToken() {
|
| - if (!update_queue_.empty()) {
|
| - GetUpdateResponse()->clear_new_progress_marker();
|
| - sync_pb::DataTypeProgressMarker* new_marker = AddUpdateProgressMarker();
|
| - new_marker->set_data_type_id(-1); // Invalid -- clients shouldn't see.
|
| - new_marker->set_token(next_token_);
|
| - }
|
| -}
|
| -
|
| -void MockConnectionManager::SetChangesRemaining(int64_t timestamp) {
|
| - GetUpdateResponse()->set_changes_remaining(timestamp);
|
| -}
|
| -
|
| -void MockConnectionManager::ProcessGetUpdates(
|
| - sync_pb::ClientToServerMessage* csm,
|
| - sync_pb::ClientToServerResponse* response) {
|
| - CHECK(csm->has_get_updates());
|
| - ASSERT_EQ(csm->message_contents(), ClientToServerMessage::GET_UPDATES);
|
| - const GetUpdatesMessage& gu = csm->get_updates();
|
| - num_get_updates_requests_++;
|
| - EXPECT_FALSE(gu.has_from_timestamp());
|
| - EXPECT_FALSE(gu.has_requested_types());
|
| -
|
| - if (fail_non_periodic_get_updates_) {
|
| - EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::PERIODIC,
|
| - gu.caller_info().source());
|
| - }
|
| -
|
| - // Verify that the items we're about to send back to the client are of
|
| - // the types requested by the client. If this fails, it probably indicates
|
| - // a test bug.
|
| - EXPECT_TRUE(gu.fetch_folders());
|
| - EXPECT_FALSE(gu.has_requested_types());
|
| - if (update_queue_.empty()) {
|
| - GetUpdateResponse();
|
| - }
|
| - sync_pb::GetUpdatesResponse* updates = &update_queue_.front();
|
| - for (int i = 0; i < updates->entries_size(); ++i) {
|
| - if (!updates->entries(i).deleted()) {
|
| - ModelType entry_type = GetModelType(updates->entries(i));
|
| - EXPECT_TRUE(
|
| - IsModelTypePresentInSpecifics(gu.from_progress_marker(), entry_type))
|
| - << "Syncer did not request updates being provided by the test.";
|
| - }
|
| - }
|
| -
|
| - response->mutable_get_updates()->CopyFrom(*updates);
|
| -
|
| - // Set appropriate progress markers, overriding the value squirreled
|
| - // away by ApplyToken().
|
| - std::string token = response->get_updates().new_progress_marker(0).token();
|
| - response->mutable_get_updates()->clear_new_progress_marker();
|
| - for (int i = 0; i < gu.from_progress_marker_size(); ++i) {
|
| - sync_pb::DataTypeProgressMarker* new_marker =
|
| - response->mutable_get_updates()->add_new_progress_marker();
|
| - new_marker->set_data_type_id(gu.from_progress_marker(i).data_type_id());
|
| - new_marker->set_token(token);
|
| - }
|
| -
|
| - // Fill the keystore key if requested.
|
| - if (gu.need_encryption_key())
|
| - response->mutable_get_updates()->add_encryption_keys(keystore_key_);
|
| -
|
| - update_queue_.pop_front();
|
| -
|
| - if (gu_client_command_) {
|
| - response->mutable_client_command()->CopyFrom(*gu_client_command_.get());
|
| - }
|
| -}
|
| -
|
| -void MockConnectionManager::SetKeystoreKey(const std::string& key) {
|
| - // Note: this is not a thread-safe set, ok for now. NOT ok if tests
|
| - // run the syncer on the background thread while this method is called.
|
| - keystore_key_ = key;
|
| -}
|
| -
|
| -bool MockConnectionManager::ShouldConflictThisCommit() {
|
| - bool conflict = false;
|
| - if (conflict_all_commits_) {
|
| - conflict = true;
|
| - } else if (conflict_n_commits_ > 0) {
|
| - conflict = true;
|
| - --conflict_n_commits_;
|
| - }
|
| - return conflict;
|
| -}
|
| -
|
| -bool MockConnectionManager::ShouldTransientErrorThisId(syncable::Id id) {
|
| - return find(transient_error_ids_.begin(), transient_error_ids_.end(), id)
|
| - != transient_error_ids_.end();
|
| -}
|
| -
|
| -void MockConnectionManager::ProcessCommit(
|
| - sync_pb::ClientToServerMessage* csm,
|
| - sync_pb::ClientToServerResponse* response_buffer) {
|
| - CHECK(csm->has_commit());
|
| - ASSERT_EQ(csm->message_contents(), ClientToServerMessage::COMMIT);
|
| - map <string, string> changed_ids;
|
| - const CommitMessage& commit_message = csm->commit();
|
| - CommitResponse* commit_response = response_buffer->mutable_commit();
|
| - commit_messages_.push_back(new CommitMessage);
|
| - commit_messages_.back()->CopyFrom(commit_message);
|
| - map<string, sync_pb::CommitResponse_EntryResponse*> response_map;
|
| - for (int i = 0; i < commit_message.entries_size() ; i++) {
|
| - const sync_pb::SyncEntity& entry = commit_message.entries(i);
|
| - CHECK(entry.has_id_string());
|
| - string id_string = entry.id_string();
|
| - ASSERT_LT(entry.name().length(), 256ul) << " name probably too long. True "
|
| - "server name checking not implemented";
|
| - syncable::Id id;
|
| - if (entry.version() == 0) {
|
| - // Relies on our new item string id format. (string representation of a
|
| - // negative number).
|
| - id = syncable::Id::CreateFromClientString(id_string);
|
| - } else {
|
| - id = syncable::Id::CreateFromServerId(id_string);
|
| - }
|
| - committed_ids_.push_back(id);
|
| -
|
| - if (response_map.end() == response_map.find(id_string))
|
| - response_map[id_string] = commit_response->add_entryresponse();
|
| - sync_pb::CommitResponse_EntryResponse* er = response_map[id_string];
|
| - if (ShouldConflictThisCommit()) {
|
| - er->set_response_type(CommitResponse::CONFLICT);
|
| - continue;
|
| - }
|
| - if (ShouldTransientErrorThisId(id)) {
|
| - er->set_response_type(CommitResponse::TRANSIENT_ERROR);
|
| - continue;
|
| - }
|
| - er->set_response_type(CommitResponse::SUCCESS);
|
| - er->set_version(entry.version() + 1);
|
| - if (!commit_time_rename_prepended_string_.empty()) {
|
| - // Commit time rename sent down from the server.
|
| - er->set_name(commit_time_rename_prepended_string_ + entry.name());
|
| - }
|
| - string parent_id_string = entry.parent_id_string();
|
| - // Remap id's we've already assigned.
|
| - if (changed_ids.end() != changed_ids.find(parent_id_string)) {
|
| - parent_id_string = changed_ids[parent_id_string];
|
| - er->set_parent_id_string(parent_id_string);
|
| - }
|
| - if (entry.has_version() && 0 != entry.version()) {
|
| - er->set_id_string(id_string); // Allows verification.
|
| - } else {
|
| - string new_id = base::StringPrintf("mock_server:%d", next_new_id_++);
|
| - changed_ids[id_string] = new_id;
|
| - er->set_id_string(new_id);
|
| - }
|
| - }
|
| - commit_responses_.push_back(new CommitResponse(*commit_response));
|
| -
|
| - if (commit_client_command_) {
|
| - response_buffer->mutable_client_command()->CopyFrom(
|
| - *commit_client_command_.get());
|
| - }
|
| -}
|
| -
|
| -void MockConnectionManager::ProcessClearServerData(
|
| - sync_pb::ClientToServerMessage* csm,
|
| - sync_pb::ClientToServerResponse* response) {
|
| - CHECK(csm->has_clear_server_data());
|
| - ASSERT_EQ(csm->message_contents(), ClientToServerMessage::CLEAR_SERVER_DATA);
|
| - response->mutable_clear_server_data();
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateDirectory(
|
| - syncable::Id id,
|
| - syncable::Id parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - const string& originator_cache_guid,
|
| - const string& originator_client_item_id) {
|
| - return AddUpdateDirectory(id.GetServerId(), parent_id.GetServerId(),
|
| - name, version, sync_ts, originator_cache_guid,
|
| - originator_client_item_id);
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::AddUpdateBookmark(
|
| - syncable::Id id,
|
| - syncable::Id parent_id,
|
| - const string& name,
|
| - int64_t version,
|
| - int64_t sync_ts,
|
| - const string& originator_cache_guid,
|
| - const string& originator_client_item_id) {
|
| - return AddUpdateBookmark(id.GetServerId(), parent_id.GetServerId(),
|
| - name, version, sync_ts, originator_cache_guid,
|
| - originator_client_item_id);
|
| -}
|
| -
|
| -sync_pb::SyncEntity* MockConnectionManager::GetMutableLastUpdate() {
|
| - sync_pb::GetUpdatesResponse* updates = GetUpdateResponse();
|
| - EXPECT_GT(updates->entries_size(), 0);
|
| - return updates->mutable_entries()->Mutable(updates->entries_size() - 1);
|
| -}
|
| -
|
| -void MockConnectionManager::NextUpdateBatch() {
|
| - update_queue_.push_back(sync_pb::GetUpdatesResponse::default_instance());
|
| - SetChangesRemaining(0);
|
| - ApplyToken();
|
| -}
|
| -
|
| -const CommitMessage& MockConnectionManager::last_sent_commit() const {
|
| - EXPECT_TRUE(!commit_messages_.empty());
|
| - return *commit_messages_.back();
|
| -}
|
| -
|
| -const CommitResponse& MockConnectionManager::last_commit_response() const {
|
| - EXPECT_TRUE(!commit_responses_.empty());
|
| - return *commit_responses_.back();
|
| -}
|
| -
|
| -const sync_pb::ClientToServerMessage&
|
| - MockConnectionManager::last_request() const {
|
| - EXPECT_TRUE(!requests_.empty());
|
| - return requests_.back();
|
| -}
|
| -
|
| -const std::vector<sync_pb::ClientToServerMessage>&
|
| - MockConnectionManager::requests() const {
|
| - return requests_;
|
| -}
|
| -
|
| -bool MockConnectionManager::IsModelTypePresentInSpecifics(
|
| - const google::protobuf::RepeatedPtrField<
|
| - sync_pb::DataTypeProgressMarker>& filter,
|
| - ModelType value) {
|
| - int data_type_id = GetSpecificsFieldNumberFromModelType(value);
|
| - for (int i = 0; i < filter.size(); ++i) {
|
| - if (filter.Get(i).data_type_id() == data_type_id) {
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -sync_pb::DataTypeProgressMarker const*
|
| - MockConnectionManager::GetProgressMarkerForType(
|
| - const google::protobuf::RepeatedPtrField<
|
| - sync_pb::DataTypeProgressMarker>& filter,
|
| - ModelType value) {
|
| - int data_type_id = GetSpecificsFieldNumberFromModelType(value);
|
| - for (int i = 0; i < filter.size(); ++i) {
|
| - if (filter.Get(i).data_type_id() == data_type_id) {
|
| - return &(filter.Get(i));
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -void MockConnectionManager::SetServerReachable() {
|
| - server_reachable_ = true;
|
| -}
|
| -
|
| -void MockConnectionManager::SetServerNotReachable() {
|
| - server_reachable_ = false;
|
| -}
|
| -
|
| -void MockConnectionManager::UpdateConnectionStatus() {
|
| - if (!server_reachable_) {
|
| - server_status_ = HttpResponse::CONNECTION_UNAVAILABLE;
|
| - } else {
|
| - server_status_ = HttpResponse::SERVER_CONNECTION_OK;
|
| - }
|
| -}
|
| -
|
| -void MockConnectionManager::SetServerStatus(
|
| - HttpResponse::ServerConnectionCode server_status) {
|
| - server_status_ = server_status;
|
| -}
|
| -
|
| -} // namespace syncer
|
|
|