| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "sync/test/fake_server/fake_server.h" | 5 #include "components/sync/test/fake_server/fake_server.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <limits> | 10 #include <limits> |
| 11 #include <memory> | 11 #include <memory> |
| 12 #include <set> | 12 #include <set> |
| 13 #include <string> | 13 #include <string> |
| 14 #include <utility> | 14 #include <utility> |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include "base/guid.h" | 17 #include "base/guid.h" |
| 18 #include "base/logging.h" | 18 #include "base/logging.h" |
| 19 #include "base/stl_util.h" | 19 #include "base/stl_util.h" |
| 20 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
| 21 #include "base/strings/string_util.h" | 21 #include "base/strings/string_util.h" |
| 22 #include "base/strings/stringprintf.h" | 22 #include "base/strings/stringprintf.h" |
| 23 #include "base/synchronization/lock.h" | 23 #include "base/synchronization/lock.h" |
| 24 #include "components/sync/base/model_type.h" |
| 25 #include "components/sync/protocol/sync.pb.h" |
| 26 #include "components/sync/test/fake_server/bookmark_entity.h" |
| 27 #include "components/sync/test/fake_server/permanent_entity.h" |
| 28 #include "components/sync/test/fake_server/tombstone_entity.h" |
| 29 #include "components/sync/test/fake_server/unique_client_entity.h" |
| 24 #include "net/base/net_errors.h" | 30 #include "net/base/net_errors.h" |
| 25 #include "net/http/http_status_code.h" | 31 #include "net/http/http_status_code.h" |
| 26 #include "sync/internal_api/public/base/model_type.h" | |
| 27 #include "sync/protocol/sync.pb.h" | |
| 28 #include "sync/test/fake_server/bookmark_entity.h" | |
| 29 #include "sync/test/fake_server/permanent_entity.h" | |
| 30 #include "sync/test/fake_server/tombstone_entity.h" | |
| 31 #include "sync/test/fake_server/unique_client_entity.h" | |
| 32 | 32 |
| 33 using std::string; | 33 using std::string; |
| 34 using std::vector; | 34 using std::vector; |
| 35 | 35 |
| 36 using syncer::GetModelType; | 36 using syncer::GetModelType; |
| 37 using syncer::GetModelTypeFromSpecifics; | 37 using syncer::GetModelTypeFromSpecifics; |
| 38 using syncer::ModelType; | 38 using syncer::ModelType; |
| 39 using syncer::ModelTypeSet; | 39 using syncer::ModelTypeSet; |
| 40 | 40 |
| 41 namespace fake_server { | 41 namespace fake_server { |
| 42 | 42 |
| 43 class FakeServerEntity; | 43 class FakeServerEntity; |
| 44 | 44 |
| 45 namespace { | 45 namespace { |
| 46 | 46 |
| 47 // The default keystore key. | 47 // The default keystore key. |
| 48 static const char kDefaultKeystoreKey[] = "1111111111111111"; | 48 static const char kDefaultKeystoreKey[] = "1111111111111111"; |
| 49 | 49 |
| 50 // Properties of the bookmark bar permanent folder. | 50 // Properties of the bookmark bar permanent folder. |
| 51 static const char kBookmarkBarFolderServerTag[] = "bookmark_bar"; | 51 static const char kBookmarkBarFolderServerTag[] = "bookmark_bar"; |
| 52 static const char kBookmarkBarFolderName[] = "Bookmark Bar"; | 52 static const char kBookmarkBarFolderName[] = "Bookmark Bar"; |
| 53 | 53 |
| 54 // Properties of the other bookmarks permanent folder. | 54 // Properties of the other bookmarks permanent folder. |
| 55 static const char kOtherBookmarksFolderServerTag[] = "other_bookmarks"; | 55 static const char kOtherBookmarksFolderServerTag[] = "other_bookmarks"; |
| 56 static const char kOtherBookmarksFolderName[] = "Other Bookmarks"; | 56 static const char kOtherBookmarksFolderName[] = "Other Bookmarks"; |
| 57 | 57 |
| 58 // Properties of the synced bookmarks permanent folder. | 58 // Properties of the synced bookmarks permanent folder. |
| 59 static const char kSyncedBookmarksFolderServerTag[] = "synced_bookmarks"; | 59 static const char kSyncedBookmarksFolderServerTag[] = "synced_bookmarks"; |
| 60 static const char kSyncedBookmarksFolderName[] = "Synced Bookmarks"; | 60 static const char kSyncedBookmarksFolderName[] = "Synced Bookmarks"; |
| 61 | 61 |
| 62 // A filter used during GetUpdates calls to determine what information to | 62 // A filter used during GetUpdates calls to determine what information to |
| 63 // send back to the client. There is a 1:1 correspondence between any given | 63 // send back to the client. There is a 1:1 correspondence between any given |
| 64 // GetUpdates call and an UpdateSieve instance. | 64 // GetUpdates call and an UpdateSieve instance. |
| 65 class UpdateSieve { | 65 class UpdateSieve { |
| 66 public: | 66 public: |
| 67 ~UpdateSieve() { } | 67 ~UpdateSieve() {} |
| 68 | 68 |
| 69 // Factory method for creating an UpdateSieve. | 69 // Factory method for creating an UpdateSieve. |
| 70 static std::unique_ptr<UpdateSieve> Create( | 70 static std::unique_ptr<UpdateSieve> Create( |
| 71 const sync_pb::GetUpdatesMessage& get_updates_message); | 71 const sync_pb::GetUpdatesMessage& get_updates_message); |
| 72 | 72 |
| 73 // Sets the progress markers in |get_updates_response| given the progress | 73 // Sets the progress markers in |get_updates_response| given the progress |
| 74 // markers from the original GetUpdatesMessage and |new_version| (the latest | 74 // markers from the original GetUpdatesMessage and |new_version| (the latest |
| 75 // version in the entries sent back). | 75 // version in the entries sent back). |
| 76 void UpdateProgressMarkers( | 76 void UpdateProgressMarkers( |
| 77 int64_t new_version, | 77 int64_t new_version, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 get_updates_message.from_progress_marker(i); | 136 get_updates_message.from_progress_marker(i); |
| 137 | 137 |
| 138 int64_t version = 0; | 138 int64_t version = 0; |
| 139 // Let the version remain zero if there is no token or an empty token (the | 139 // Let the version remain zero if there is no token or an empty token (the |
| 140 // first request for this type). | 140 // first request for this type). |
| 141 if (marker.has_token() && !marker.token().empty()) { | 141 if (marker.has_token() && !marker.token().empty()) { |
| 142 bool parsed = base::StringToInt64(marker.token(), &version); | 142 bool parsed = base::StringToInt64(marker.token(), &version); |
| 143 CHECK(parsed) << "Unable to parse progress marker token."; | 143 CHECK(parsed) << "Unable to parse progress marker token."; |
| 144 } | 144 } |
| 145 | 145 |
| 146 ModelType model_type = syncer::GetModelTypeFromSpecificsFieldNumber( | 146 ModelType model_type = |
| 147 marker.data_type_id()); | 147 syncer::GetModelTypeFromSpecificsFieldNumber(marker.data_type_id()); |
| 148 request_from_version[model_type] = version; | 148 request_from_version[model_type] = version; |
| 149 | 149 |
| 150 if (version < min_version) | 150 if (version < min_version) |
| 151 min_version = version; | 151 min_version = version; |
| 152 } | 152 } |
| 153 | 153 |
| 154 return std::unique_ptr<UpdateSieve>( | 154 return std::unique_ptr<UpdateSieve>( |
| 155 new UpdateSieve(request_from_version, min_version)); | 155 new UpdateSieve(request_from_version, min_version)); |
| 156 } | 156 } |
| 157 | 157 |
| 158 // Returns whether |entity| is deleted or permanent. | 158 // Returns whether |entity| is deleted or permanent. |
| 159 bool IsDeletedOrPermanent(const FakeServerEntity& entity) { | 159 bool IsDeletedOrPermanent(const FakeServerEntity& entity) { |
| 160 return entity.IsDeleted() || entity.IsPermanent(); | 160 return entity.IsDeleted() || entity.IsPermanent(); |
| 161 } | 161 } |
| 162 | 162 |
| 163 } // namespace | 163 } // namespace |
| 164 | 164 |
| 165 FakeServer::FakeServer() : version_(0), | 165 FakeServer::FakeServer() |
| 166 store_birthday_(0), | 166 : version_(0), |
| 167 authenticated_(true), | 167 store_birthday_(0), |
| 168 error_type_(sync_pb::SyncEnums::SUCCESS), | 168 authenticated_(true), |
| 169 alternate_triggered_errors_(false), | 169 error_type_(sync_pb::SyncEnums::SUCCESS), |
| 170 request_counter_(0), | 170 alternate_triggered_errors_(false), |
| 171 network_enabled_(true), | 171 request_counter_(0), |
| 172 weak_ptr_factory_(this) { | 172 network_enabled_(true), |
| 173 weak_ptr_factory_(this) { |
| 173 Init(); | 174 Init(); |
| 174 } | 175 } |
| 175 | 176 |
| 176 FakeServer::~FakeServer() {} | 177 FakeServer::~FakeServer() {} |
| 177 | 178 |
| 178 void FakeServer::Init() { | 179 void FakeServer::Init() { |
| 179 keystore_keys_.push_back(kDefaultKeystoreKey); | 180 keystore_keys_.push_back(kDefaultKeystoreKey); |
| 180 | 181 |
| 181 const bool create_result = CreateDefaultPermanentItems(); | 182 const bool create_result = CreateDefaultPermanentItems(); |
| 182 DCHECK(create_result) << "Permanent items were not created successfully."; | 183 DCHECK(create_result) << "Permanent items were not created successfully."; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 } | 315 } |
| 315 | 316 |
| 316 response_proto.set_store_birthday(GetStoreBirthday()); | 317 response_proto.set_store_birthday(GetStoreBirthday()); |
| 317 | 318 |
| 318 *error_code = 0; | 319 *error_code = 0; |
| 319 *response_code = net::HTTP_OK; | 320 *response_code = net::HTTP_OK; |
| 320 *response = response_proto.SerializeAsString(); | 321 *response = response_proto.SerializeAsString(); |
| 321 completion_closure.Run(); | 322 completion_closure.Run(); |
| 322 } | 323 } |
| 323 | 324 |
| 324 bool FakeServer::GetLastCommitMessage( | 325 bool FakeServer::GetLastCommitMessage(sync_pb::ClientToServerMessage* message) { |
| 325 sync_pb::ClientToServerMessage* message) { | |
| 326 if (!last_commit_message_.has_commit()) | 326 if (!last_commit_message_.has_commit()) |
| 327 return false; | 327 return false; |
| 328 | 328 |
| 329 message->CopyFrom(last_commit_message_); | 329 message->CopyFrom(last_commit_message_); |
| 330 return true; | 330 return true; |
| 331 } | 331 } |
| 332 | 332 |
| 333 bool FakeServer::GetLastGetUpdatesMessage( | 333 bool FakeServer::GetLastGetUpdatesMessage( |
| 334 sync_pb::ClientToServerMessage* message) { | 334 sync_pb::ClientToServerMessage* message) { |
| 335 if (!last_getupdates_message_.has_get_updates()) | 335 if (!last_getupdates_message_.has_get_updates()) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 358 | 358 |
| 359 bool send_encryption_keys_based_on_nigori = false; | 359 bool send_encryption_keys_based_on_nigori = false; |
| 360 int64_t max_response_version = 0; | 360 int64_t max_response_version = 0; |
| 361 for (EntityMap::const_iterator it = entities_.begin(); it != entities_.end(); | 361 for (EntityMap::const_iterator it = entities_.begin(); it != entities_.end(); |
| 362 ++it) { | 362 ++it) { |
| 363 const FakeServerEntity& entity = *it->second; | 363 const FakeServerEntity& entity = *it->second; |
| 364 if (sieve->ClientWantsItem(entity)) { | 364 if (sieve->ClientWantsItem(entity)) { |
| 365 sync_pb::SyncEntity* response_entity = response->add_entries(); | 365 sync_pb::SyncEntity* response_entity = response->add_entries(); |
| 366 entity.SerializeAsProto(response_entity); | 366 entity.SerializeAsProto(response_entity); |
| 367 | 367 |
| 368 max_response_version = std::max(max_response_version, | 368 max_response_version = |
| 369 response_entity->version()); | 369 std::max(max_response_version, response_entity->version()); |
| 370 | 370 |
| 371 if (entity.GetModelType() == syncer::NIGORI) { | 371 if (entity.GetModelType() == syncer::NIGORI) { |
| 372 send_encryption_keys_based_on_nigori = | 372 send_encryption_keys_based_on_nigori = |
| 373 response_entity->specifics().nigori().passphrase_type() == | 373 response_entity->specifics().nigori().passphrase_type() == |
| 374 sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE; | 374 sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE; |
| 375 } | 375 } |
| 376 } | 376 } |
| 377 } | 377 } |
| 378 | 378 |
| 379 if (send_encryption_keys_based_on_nigori || | 379 if (send_encryption_keys_based_on_nigori || |
| 380 get_updates.need_encryption_key()) { | 380 get_updates.need_encryption_key()) { |
| 381 for (vector<string>::iterator it = keystore_keys_.begin(); | 381 for (vector<string>::iterator it = keystore_keys_.begin(); |
| 382 it != keystore_keys_.end(); ++it) { | 382 it != keystore_keys_.end(); ++it) { |
| 383 response->add_encryption_keys(*it); | 383 response->add_encryption_keys(*it); |
| 384 } | 384 } |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 ModelTypeSet committed_model_types; | 488 ModelTypeSet committed_model_types; |
| 489 | 489 |
| 490 // TODO(pvalenzuela): Add validation of CommitMessage.entries. | 490 // TODO(pvalenzuela): Add validation of CommitMessage.entries. |
| 491 ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>::const_iterator it; | 491 ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>::const_iterator it; |
| 492 for (it = commit.entries().begin(); it != commit.entries().end(); ++it) { | 492 for (it = commit.entries().begin(); it != commit.entries().end(); ++it) { |
| 493 sync_pb::CommitResponse_EntryResponse* entry_response = | 493 sync_pb::CommitResponse_EntryResponse* entry_response = |
| 494 response->add_entryresponse(); | 494 response->add_entryresponse(); |
| 495 | 495 |
| 496 sync_pb::SyncEntity client_entity = *it; | 496 sync_pb::SyncEntity client_entity = *it; |
| 497 string parent_id = client_entity.parent_id_string(); | 497 string parent_id = client_entity.parent_id_string(); |
| 498 if (client_to_server_ids.find(parent_id) != | 498 if (client_to_server_ids.find(parent_id) != client_to_server_ids.end()) { |
| 499 client_to_server_ids.end()) { | |
| 500 parent_id = client_to_server_ids[parent_id]; | 499 parent_id = client_to_server_ids[parent_id]; |
| 501 } | 500 } |
| 502 | 501 |
| 503 const string entity_id = | 502 const string entity_id = |
| 504 CommitEntity(client_entity, entry_response, guid, parent_id); | 503 CommitEntity(client_entity, entry_response, guid, parent_id); |
| 505 if (entity_id.empty()) { | 504 if (entity_id.empty()) { |
| 506 return false; | 505 return false; |
| 507 } | 506 } |
| 508 | 507 |
| 509 // Record the ID if it was renamed. | 508 // Record the ID if it was renamed. |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 void FakeServer::DisableNetwork() { | 705 void FakeServer::DisableNetwork() { |
| 707 DCHECK(thread_checker_.CalledOnValidThread()); | 706 DCHECK(thread_checker_.CalledOnValidThread()); |
| 708 network_enabled_ = false; | 707 network_enabled_ = false; |
| 709 } | 708 } |
| 710 | 709 |
| 711 std::string FakeServer::GetBookmarkBarFolderId() const { | 710 std::string FakeServer::GetBookmarkBarFolderId() const { |
| 712 DCHECK(thread_checker_.CalledOnValidThread()); | 711 DCHECK(thread_checker_.CalledOnValidThread()); |
| 713 for (EntityMap::const_iterator it = entities_.begin(); it != entities_.end(); | 712 for (EntityMap::const_iterator it = entities_.begin(); it != entities_.end(); |
| 714 ++it) { | 713 ++it) { |
| 715 FakeServerEntity* entity = it->second.get(); | 714 FakeServerEntity* entity = it->second.get(); |
| 716 if (entity->GetName() == kBookmarkBarFolderName && | 715 if (entity->GetName() == kBookmarkBarFolderName && entity->IsFolder() && |
| 717 entity->IsFolder() && | |
| 718 entity->GetModelType() == syncer::BOOKMARKS) { | 716 entity->GetModelType() == syncer::BOOKMARKS) { |
| 719 return entity->GetId(); | 717 return entity->GetId(); |
| 720 } | 718 } |
| 721 } | 719 } |
| 722 NOTREACHED() << "Bookmark Bar entity not found."; | 720 NOTREACHED() << "Bookmark Bar entity not found."; |
| 723 return ""; | 721 return ""; |
| 724 } | 722 } |
| 725 | 723 |
| 726 base::WeakPtr<FakeServer> FakeServer::AsWeakPtr() { | 724 base::WeakPtr<FakeServer> FakeServer::AsWeakPtr() { |
| 727 DCHECK(thread_checker_.CalledOnValidThread()); | 725 DCHECK(thread_checker_.CalledOnValidThread()); |
| 728 return weak_ptr_factory_.GetWeakPtr(); | 726 return weak_ptr_factory_.GetWeakPtr(); |
| 729 } | 727 } |
| 730 | 728 |
| 731 std::string FakeServer::GetStoreBirthday() const { | 729 std::string FakeServer::GetStoreBirthday() const { |
| 732 DCHECK(thread_checker_.CalledOnValidThread()); | 730 DCHECK(thread_checker_.CalledOnValidThread()); |
| 733 return base::Int64ToString(store_birthday_); | 731 return base::Int64ToString(store_birthday_); |
| 734 } | 732 } |
| 735 | 733 |
| 736 } // namespace fake_server | 734 } // namespace fake_server |
| OLD | NEW |