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(¶ms->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(¶ms->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