Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(157)

Unified Diff: sync/test/engine/mock_non_blocking_type_processor.cc

Issue 330523002: sync: Refactor NonBlockingTypeProcessorCore tests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix tests Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sync/test/engine/mock_non_blocking_type_processor.h ('k') | sync/test/engine/single_type_mock_server.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sync/test/engine/mock_non_blocking_type_processor.cc
diff --git a/sync/test/engine/mock_non_blocking_type_processor.cc b/sync/test/engine/mock_non_blocking_type_processor.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0c3d8c91ee3613bd4eb450c18daf02d805e7b34f
--- /dev/null
+++ b/sync/test/engine/mock_non_blocking_type_processor.cc
@@ -0,0 +1,258 @@
+// Copyright 2014 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.
+
+#include "sync/test/engine/mock_non_blocking_type_processor.h"
+
+#include "base/bind.h"
+
+namespace syncer {
+
+MockNonBlockingTypeProcessor::MockNonBlockingTypeProcessor()
+ : is_synchronous_(true) {
+}
+
+MockNonBlockingTypeProcessor::~MockNonBlockingTypeProcessor() {
+}
+
+void MockNonBlockingTypeProcessor::ReceiveCommitResponse(
+ const DataTypeState& type_state,
+ const CommitResponseDataList& response_list) {
+ base::Closure task =
+ base::Bind(&MockNonBlockingTypeProcessor::ReceiveCommitResponseImpl,
+ base::Unretained(this),
+ type_state,
+ response_list);
+ pending_tasks_.push_back(task);
+ if (is_synchronous_)
+ RunQueuedTasks();
+}
+
+void MockNonBlockingTypeProcessor::ReceiveUpdateResponse(
+ const DataTypeState& type_state,
+ const UpdateResponseDataList& response_list) {
+ base::Closure task =
+ base::Bind(&MockNonBlockingTypeProcessor::ReceiveUpdateResponseImpl,
+ base::Unretained(this),
+ type_state,
+ response_list);
+ pending_tasks_.push_back(task);
+ if (is_synchronous_)
+ RunQueuedTasks();
+}
+
+void MockNonBlockingTypeProcessor::SetSynchronousExecution(
+ bool is_synchronous) {
+ is_synchronous_ = is_synchronous;
+}
+
+void MockNonBlockingTypeProcessor::RunQueuedTasks() {
+ for (std::vector<base::Closure>::iterator it = pending_tasks_.begin();
+ it != pending_tasks_.end();
+ ++it) {
+ it->Run();
+ }
+ pending_tasks_.clear();
+}
+
+CommitRequestData MockNonBlockingTypeProcessor::CommitRequest(
+ const std::string& tag_hash,
+ const sync_pb::EntitySpecifics& specifics) {
+ const int64 base_version = GetBaseVersion(tag_hash);
+
+ CommitRequestData data;
+
+ if (HasServerAssignedId(tag_hash)) {
+ data.id = GetServerAssignedId(tag_hash);
+ }
+
+ data.client_tag_hash = tag_hash;
+ data.sequence_number = GetNextSequenceNumber(tag_hash);
+ data.deleted = false;
+ data.specifics = specifics;
+ data.base_version = base_version;
+
+ // These fields are not really used for much, but we set them anyway
+ // to make this item look more realistic.
+ data.ctime = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1);
+ data.mtime = data.ctime + base::TimeDelta::FromSeconds(base_version);
+ data.non_unique_name = "Name: " + tag_hash;
+
+ return data;
+}
+
+CommitRequestData MockNonBlockingTypeProcessor::DeleteRequest(
+ const std::string& tag_hash) {
+ const int64 base_version = GetBaseVersion(tag_hash);
+ CommitRequestData data;
+
+ if (HasServerAssignedId(tag_hash)) {
+ data.id = GetServerAssignedId(tag_hash);
+ }
+
+ data.client_tag_hash = tag_hash;
+ data.sequence_number = GetNextSequenceNumber(tag_hash);
+ data.base_version = base_version;
+ data.mtime = data.ctime + base::TimeDelta::FromSeconds(base_version);
+ data.deleted = true;
+
+ // These fields have little or no effect on behavior. We set them anyway to
+ // make the test more realistic.
+ data.ctime = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1);
+ data.non_unique_name = "Name deleted";
+
+ return data;
+}
+
+size_t MockNonBlockingTypeProcessor::GetNumUpdateResponses() const {
+ return received_update_responses_.size();
+}
+
+UpdateResponseDataList MockNonBlockingTypeProcessor::GetNthUpdateResponse(
+ size_t n) const {
+ DCHECK_LT(n, GetNumUpdateResponses());
+ return received_update_responses_[n];
+}
+
+DataTypeState
+MockNonBlockingTypeProcessor::GetNthTypeStateReceivedInUpdateResponse(
+ size_t n) const {
+ DCHECK_LT(n, GetNumUpdateResponses());
+ return type_states_received_on_update_[n];
+}
+
+size_t MockNonBlockingTypeProcessor::GetNumCommitResponses() const {
+ return received_commit_responses_.size();
+}
+
+CommitResponseDataList MockNonBlockingTypeProcessor::GetNthCommitResponse(
+ size_t n) const {
+ DCHECK_LT(n, GetNumCommitResponses());
+ return received_commit_responses_[n];
+}
+
+DataTypeState
+MockNonBlockingTypeProcessor::GetNthTypeStateReceivedInCommitResponse(
+ size_t n) const {
+ DCHECK_LT(n, GetNumCommitResponses());
+ return type_states_received_on_commit_[n];
+}
+
+bool MockNonBlockingTypeProcessor::HasUpdateResponse(
+ const std::string& tag_hash) const {
+ std::map<const std::string, UpdateResponseData>::const_iterator it =
+ update_response_items_.find(tag_hash);
+ return it != update_response_items_.end();
+}
+
+UpdateResponseData MockNonBlockingTypeProcessor::GetUpdateResponse(
+ const std::string& tag_hash) const {
+ DCHECK(HasUpdateResponse(tag_hash));
+ std::map<const std::string, UpdateResponseData>::const_iterator it =
+ update_response_items_.find(tag_hash);
+ return it->second;
+}
+
+bool MockNonBlockingTypeProcessor::HasCommitResponse(
+ const std::string& tag_hash) const {
+ std::map<const std::string, CommitResponseData>::const_iterator it =
+ commit_response_items_.find(tag_hash);
+ return it != commit_response_items_.end();
+}
+
+CommitResponseData MockNonBlockingTypeProcessor::GetCommitResponse(
+ const std::string& tag_hash) const {
+ DCHECK(HasCommitResponse(tag_hash));
+ std::map<const std::string, CommitResponseData>::const_iterator it =
+ commit_response_items_.find(tag_hash);
+ return it->second;
+}
+
+void MockNonBlockingTypeProcessor::ReceiveCommitResponseImpl(
+ const DataTypeState& type_state,
+ const CommitResponseDataList& response_list) {
+ received_commit_responses_.push_back(response_list);
+ type_states_received_on_commit_.push_back(type_state);
+ for (CommitResponseDataList::const_iterator it = response_list.begin();
+ it != response_list.end();
+ ++it) {
+ commit_response_items_.insert(std::make_pair(it->client_tag_hash, *it));
+
+ // Server wins. Set the model's base version.
+ SetBaseVersion(it->client_tag_hash, it->response_version);
+ SetServerAssignedId(it->client_tag_hash, it->id);
+ }
+}
+
+void MockNonBlockingTypeProcessor::ReceiveUpdateResponseImpl(
+ const DataTypeState& type_state,
+ const UpdateResponseDataList& response_list) {
+ received_update_responses_.push_back(response_list);
+ type_states_received_on_update_.push_back(type_state);
+ for (UpdateResponseDataList::const_iterator it = response_list.begin();
+ it != response_list.end();
+ ++it) {
+ update_response_items_.insert(std::make_pair(it->client_tag_hash, *it));
+
+ // Server wins. Set the model's base version.
+ SetBaseVersion(it->client_tag_hash, it->response_version);
+ SetServerAssignedId(it->client_tag_hash, it->id);
+ }
+}
+
+// Fetches the sequence number as of the most recent update request.
+int64 MockNonBlockingTypeProcessor::GetCurrentSequenceNumber(
+ const std::string& tag_hash) const {
+ std::map<const std::string, int64>::const_iterator it =
+ sequence_numbers_.find(tag_hash);
+ if (it == sequence_numbers_.end()) {
+ return 0;
+ } else {
+ return it->second;
+ }
+}
+
+// The model thread should be sending us items with strictly increasing
+// sequence numbers. Here's where we emulate that behavior.
+int64 MockNonBlockingTypeProcessor::GetNextSequenceNumber(
+ const std::string& tag_hash) {
+ int64 sequence_number = GetCurrentSequenceNumber(tag_hash);
+ sequence_number++;
+ sequence_numbers_[tag_hash] = sequence_number;
+ return sequence_number;
+}
+
+int64 MockNonBlockingTypeProcessor::GetBaseVersion(
+ const std::string& tag_hash) const {
+ std::map<const std::string, int64>::const_iterator it =
+ base_versions_.find(tag_hash);
+ if (it == base_versions_.end()) {
+ return kUncommittedVersion;
+ } else {
+ return it->second;
+ }
+}
+
+void MockNonBlockingTypeProcessor::SetBaseVersion(const std::string& tag_hash,
+ int64 version) {
+ base_versions_[tag_hash] = version;
+}
+
+bool MockNonBlockingTypeProcessor::HasServerAssignedId(
+ const std::string& tag_hash) const {
+ return assigned_ids_.find(tag_hash) != assigned_ids_.end();
+}
+
+const std::string& MockNonBlockingTypeProcessor::GetServerAssignedId(
+ const std::string& tag_hash) const {
+ DCHECK(HasServerAssignedId(tag_hash));
+ return assigned_ids_.find(tag_hash)->second;
+}
+
+void MockNonBlockingTypeProcessor::SetServerAssignedId(
+ const std::string& tag_hash,
+ const std::string& id) {
+ assigned_ids_[tag_hash] = id;
+}
+
+} // namespace syncer
« no previous file with comments | « sync/test/engine/mock_non_blocking_type_processor.h ('k') | sync/test/engine/single_type_mock_server.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698