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

Unified Diff: chrome/test/sync/engine/mock_connection_manager.cc

Issue 6104003: sync: use progress markers instead of timestamps during GetUpdates (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Tim's fixes Created 9 years, 11 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 | « chrome/test/sync/engine/mock_connection_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/test/sync/engine/mock_connection_manager.cc
diff --git a/chrome/test/sync/engine/mock_connection_manager.cc b/chrome/test/sync/engine/mock_connection_manager.cc
index ade90a6fef40f02f57d2648b5ebd41f596e5c935..04758aafcf1aecf741afea77ea55b64c46e1da28 100644
--- a/chrome/test/sync/engine/mock_connection_manager.cc
+++ b/chrome/test/sync/engine/mock_connection_manager.cc
@@ -52,10 +52,12 @@ MockConnectionManager::MockConnectionManager(DirectoryManager* dirmgr,
next_position_in_parent_(2),
use_legacy_bookmarks_protocol_(false),
num_get_updates_requests_(0) {
- server_reachable_ = true;
+ server_reachable_ = true;
+ SetNewTimestamp(0);
};
MockConnectionManager::~MockConnectionManager() {
+ EXPECT_TRUE(update_queue_.empty()) << "Unfetched updates.";
}
void MockConnectionManager::SetCommitTimeRename(string prepend) {
@@ -168,8 +170,11 @@ bool MockConnectionManager::IsUserAuthenticated() {
return true;
}
-void MockConnectionManager::ResetUpdates() {
- updates_.Clear();
+sync_pb::GetUpdatesResponse* MockConnectionManager::GetUpdateResponse() {
+ if (update_queue_.empty()) {
+ NextUpdateBatch();
+ }
+ return &update_queue_.back();
}
void MockConnectionManager::AddDefaultBookmarkData(sync_pb::SyncEntity* entity,
@@ -222,7 +227,7 @@ SyncEntity* MockConnectionManager::AddUpdateBookmark(int id, int parent_id,
SyncEntity* MockConnectionManager::AddUpdateFull(string id, string parent_id,
string name, int64 version,
int64 sync_ts, bool is_dir) {
- SyncEntity* ent = updates_.add_entries();
+ SyncEntity* ent = GetUpdateResponse()->add_entries();
ent->set_id_string(id);
ent->set_parent_id_string(parent_id);
ent->set_non_unique_name(name);
@@ -262,7 +267,7 @@ SyncEntity* MockConnectionManager::AddUpdateFromLastCommit() {
AddUpdateTombstone(syncable::Id::CreateFromServerId(
last_sent_commit().entries(0).id_string()));
} else {
- SyncEntity* ent = updates_.add_entries();
+ SyncEntity* ent = GetUpdateResponse()->add_entries();
ent->CopyFrom(last_sent_commit().entries(0));
ent->clear_insert_after_item_id();
ent->clear_old_parent_id();
@@ -281,7 +286,7 @@ SyncEntity* MockConnectionManager::AddUpdateFromLastCommit() {
void MockConnectionManager::AddUpdateTombstone(const syncable::Id& id) {
// Tombstones have only the ID set and dummy values for the required fields.
- SyncEntity* ent = updates_.add_entries();
+ SyncEntity* ent = GetUpdateResponse()->add_entries();
ent->set_id_string(id.GetServerId());
ent->set_version(0);
ent->set_name("");
@@ -291,7 +296,7 @@ void MockConnectionManager::AddUpdateTombstone(const syncable::Id& id) {
void MockConnectionManager::SetLastUpdateDeleted() {
// Tombstones have only the ID set. Wipe anything else.
string id_string = GetMutableLastUpdate()->id_string();
- updates_.mutable_entries()->RemoveLast();
+ GetUpdateResponse()->mutable_entries()->RemoveLast();
AddUpdateTombstone(syncable::Id::CreateFromServerId(id_string));
}
@@ -314,12 +319,23 @@ void MockConnectionManager::SetLastUpdatePosition(int64 server_position) {
GetMutableLastUpdate()->set_position_in_parent(server_position);
}
-void MockConnectionManager::SetNewTimestamp(int64 ts) {
- updates_.set_new_timestamp(ts);
+void MockConnectionManager::SetNewTimestamp(int ts) {
+ next_token_ = base::StringPrintf("mock connection ts = %d", ts);
+ ApplyToken();
+}
+
+void MockConnectionManager::ApplyToken() {
+ if (!update_queue_.empty()) {
+ GetUpdateResponse()->clear_new_progress_marker();
+ sync_pb::DataTypeProgressMarker* new_marker =
+ GetUpdateResponse()->add_new_progress_marker();
+ new_marker->set_data_type_id(-1); // Invalid -- clients shouldn't see.
+ new_marker->set_token(next_token_);
+ }
}
void MockConnectionManager::SetChangesRemaining(int64 timestamp) {
- updates_.set_changes_remaining(timestamp);
+ GetUpdateResponse()->set_changes_remaining(timestamp);
}
void MockConnectionManager::ProcessGetUpdates(ClientToServerMessage* csm,
@@ -328,7 +344,9 @@ void MockConnectionManager::ProcessGetUpdates(ClientToServerMessage* csm,
ASSERT_EQ(csm->message_contents(), ClientToServerMessage::GET_UPDATES);
const GetUpdatesMessage& gu = csm->get_updates();
num_get_updates_requests_++;
- EXPECT_TRUE(gu.has_from_timestamp());
+ 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());
@@ -339,7 +357,7 @@ void MockConnectionManager::ProcessGetUpdates(ClientToServerMessage* csm,
for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) {
ModelType model_type = syncable::ModelTypeFromInt(i);
EXPECT_EQ(expected_filter_[i],
- IsModelTypePresentInSpecifics(gu.requested_types(), model_type))
+ IsModelTypePresentInSpecifics(gu.from_progress_marker(), model_type))
<< "Syncer requested_types differs from test expectation.";
}
@@ -347,19 +365,36 @@ void MockConnectionManager::ProcessGetUpdates(ClientToServerMessage* csm,
// the types requested by the client. If this fails, it probably indicates
// a test bug.
EXPECT_TRUE(gu.fetch_folders());
- EXPECT_TRUE(gu.has_requested_types());
- for (int i = 0; i < updates_.entries_size(); ++i) {
- if (!updates_.entries(i).deleted()) {
- ModelType entry_type = syncable::GetModelType(updates_.entries(i));
+ 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 = syncable::GetModelType(updates->entries(i));
EXPECT_TRUE(
- IsModelTypePresentInSpecifics(gu.requested_types(), entry_type))
+ IsModelTypePresentInSpecifics(gu.from_progress_marker(), entry_type))
<< "Syncer did not request updates being provided by the test.";
}
}
- // TODO(sync): filter results dependant on timestamp? or check limits?
- response->mutable_get_updates()->CopyFrom(updates_);
- ResetUpdates();
+ 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) {
+ if (gu.from_progress_marker(i).token() != token) {
+ 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);
+ }
+ }
+
+ update_queue_.pop_front();
}
void MockConnectionManager::SetClearUserDataResponseStatus(
@@ -485,8 +520,15 @@ SyncEntity* MockConnectionManager::AddUpdateBookmark(
}
SyncEntity* MockConnectionManager::GetMutableLastUpdate() {
- EXPECT_TRUE(updates_.entries_size() > 0);
- return updates_.mutable_entries()->Mutable(updates_.entries_size() - 1);
+ sync_pb::GetUpdatesResponse* updates = GetUpdateResponse();
+ EXPECT_TRUE(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 {
@@ -524,14 +566,16 @@ void MockConnectionManager::StopFailingWithAuthInvalid(
}
bool MockConnectionManager::IsModelTypePresentInSpecifics(
- const sync_pb::EntitySpecifics& filter, syncable::ModelType value) {
- // This implementation is a little contorted; it's done this way
- // to avoid having to switch on the ModelType. We're basically doing
- // the protobuf equivalent of ((value & filter) == filter).
- sync_pb::EntitySpecifics value_filter;
- syncable::AddDefaultExtensionValue(value, &value_filter);
- value_filter.MergeFrom(filter);
- return value_filter.SerializeAsString() == filter.SerializeAsString();
+ const google::protobuf::RepeatedPtrField<
+ sync_pb::DataTypeProgressMarker>& filter,
+ syncable::ModelType value) {
+ int data_type_id = syncable::GetExtensionFieldNumberFromModelType(value);
+ for (int i = 0; i < filter.size(); ++i) {
+ if (filter.Get(i).data_type_id() == data_type_id) {
+ return true;
+ }
+ }
+ return false;
}
void MockConnectionManager::SetServerReachable() {
« no previous file with comments | « chrome/test/sync/engine/mock_connection_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698