summaryrefslogtreecommitdiffstats
path: root/sync/test
diff options
context:
space:
mode:
Diffstat (limited to 'sync/test')
-rw-r--r--sync/test/fake_server/fake_server.cc53
-rw-r--r--sync/test/fake_server/fake_server.h14
-rw-r--r--sync/test/fake_server/permanent_entity.cc43
-rw-r--r--sync/test/fake_server/permanent_entity.h13
-rw-r--r--sync/test/fake_server/unique_client_entity.cc27
-rw-r--r--sync/test/fake_server/unique_client_entity.h10
6 files changed, 139 insertions, 21 deletions
diff --git a/sync/test/fake_server/fake_server.cc b/sync/test/fake_server/fake_server.cc
index d44814e..3827a85 100644
--- a/sync/test/fake_server/fake_server.cc
+++ b/sync/test/fake_server/fake_server.cc
@@ -16,6 +16,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
+#include "base/synchronization/lock.h"
#include "net/base/net_errors.h"
#include "net/http/http_status_code.h"
#include "sync/internal_api/public/base/model_type.h"
@@ -28,6 +29,8 @@
using std::string;
using std::vector;
+using base::AutoLock;
+using syncer::GetModelType;
using syncer::ModelType;
// The default birthday value.
@@ -94,13 +97,14 @@ class UpdateSieve {
}
// Returns the data type IDs of types being synced for the first time.
- vector<ModelType> GetFirstTimeTypes() const {
+ vector<ModelType> GetFirstTimeTypes(
+ syncer::ModelTypeSet created_permanent_entity_types) const {
vector<ModelType> types;
ModelTypeToVersionMap::const_iterator it;
for (it = request_from_version_.begin(); it != request_from_version_.end();
++it) {
- if (it->second == 0)
+ if (it->second == 0 && !created_permanent_entity_types.Has(it->first))
types.push_back(it->first);
}
@@ -172,6 +176,11 @@ bool FakeServer::CreateDefaultPermanentItems(
}
ModelType model_type = *it;
+ if (created_permanent_entity_types_.Has(model_type)) {
+ // Do not create an entity for the type if it has already been created.
+ continue;
+ }
+
FakeServerEntity* top_level_entity =
PermanentEntity::CreateTopLevel(model_type);
if (top_level_entity == NULL) {
@@ -200,6 +209,8 @@ bool FakeServer::CreateDefaultPermanentItems(
}
SaveEntity(other_bookmarks_entity);
}
+
+ created_permanent_entity_types_.Put(model_type);
}
return true;
@@ -229,6 +240,8 @@ void FakeServer::SaveEntity(FakeServerEntity* entity) {
int FakeServer::HandleCommand(const string& request,
int* response_code,
string* response) {
+ AutoLock lock(lock_);
+
sync_pb::ClientToServerMessage message;
bool parsed = message.ParseFromString(request);
DCHECK(parsed);
@@ -269,7 +282,9 @@ bool FakeServer::HandleGetUpdatesRequest(
response->set_changes_remaining(0);
scoped_ptr<UpdateSieve> sieve = UpdateSieve::Create(get_updates);
- if (!CreateDefaultPermanentItems(sieve->GetFirstTimeTypes())) {
+ vector<ModelType> first_time_types = sieve->GetFirstTimeTypes(
+ created_permanent_entity_types_);
+ if (!CreateDefaultPermanentItems(first_time_types)) {
return false;
}
if (get_updates.create_mobile_bookmarks_folder() &&
@@ -325,8 +340,20 @@ bool FakeServer::CommitEntity(
if (!DeleteChildren(client_entity.id_string())) {
return false;
}
+ } else if (GetModelType(client_entity) == syncer::NIGORI) {
+ // NIGORI is the only permanent item type that should be updated by the
+ // client.
+ entity = PermanentEntity::CreateUpdatedNigoriEntity(
+ client_entity,
+ entities_[client_entity.id_string()]);
} else if (client_entity.has_client_defined_unique_tag()) {
- entity = UniqueClientEntity::Create(client_entity);
+ if (entities_.find(client_entity.id_string()) != entities_.end()) {
+ entity = UniqueClientEntity::CreateUpdatedVersion(
+ client_entity,
+ entities_[client_entity.id_string()]);
+ } else {
+ entity = UniqueClientEntity::CreateNew(client_entity);
+ }
} else {
string parent_id = client_entity.parent_id_string();
if (client_to_server_ids->find(parent_id) !=
@@ -388,16 +415,24 @@ bool FakeServer::IsChild(const string& id, const string& potential_parent_id) {
}
bool FakeServer::DeleteChildren(const string& id) {
+ vector<string> child_ids;
for (EntityMap::iterator it = entities_.begin(); it != entities_.end();
++it) {
if (IsChild(it->first, id)) {
- FakeServerEntity* tombstone = TombstoneEntity::Create(it->first);
- if (tombstone == NULL) {
- return false;
- }
- SaveEntity(tombstone);
+ child_ids.push_back(it->first);
+ }
+ }
+
+ for (vector<string>::iterator it = child_ids.begin(); it != child_ids.end();
+ ++it) {
+ FakeServerEntity* tombstone = TombstoneEntity::Create(*it);
+ if (tombstone == NULL) {
+ LOG(WARNING) << "Tombstone creation failed for entity with ID " << *it;
+ return false;
}
+ SaveEntity(tombstone);
}
+
return true;
}
diff --git a/sync/test/fake_server/fake_server.h b/sync/test/fake_server/fake_server.h
index 511bcae..a13cc98 100644
--- a/sync/test/fake_server/fake_server.h
+++ b/sync/test/fake_server/fake_server.h
@@ -10,6 +10,7 @@
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
+#include "base/synchronization/lock.h"
#include "sync/internal_api/public/base/model_type.h"
#include "sync/protocol/sync.pb.h"
#include "sync/test/fake_server/fake_server_entity.h"
@@ -74,6 +75,14 @@ class FakeServer {
// |id|. A tombstone is not created for the entity itself.
bool DeleteChildren(const std::string& id);
+ // The lock used to ensure that only one client is communicating with server
+ // at any given time.
+ //
+ // It is probably preferable to have FakeServer operate on its own thread and
+ // communicate with it via PostTask, but clients would still need to wait for
+ // requests to finish before proceeding.
+ base::Lock lock_;
+
// This is the last version number assigned to an entity. The next entity will
// have a version number of version_ + 1.
int64 version_;
@@ -87,6 +96,11 @@ class FakeServer {
// All Keystore keys known to the server.
std::vector<std::string> keystore_keys_;
+
+ // All ModelTypes for which permanent entities have been created. These types
+ // are kept track of so that permanent entities are not recreated for new
+ // clients.
+ syncer::ModelTypeSet created_permanent_entity_types_;
};
} // namespace fake_server
diff --git a/sync/test/fake_server/permanent_entity.cc b/sync/test/fake_server/permanent_entity.cc
index 2aa371a..480e380 100644
--- a/sync/test/fake_server/permanent_entity.cc
+++ b/sync/test/fake_server/permanent_entity.cc
@@ -39,7 +39,14 @@ FakeServerEntity* PermanentEntity::Create(const ModelType& model_type,
string id = FakeServerEntity::CreateId(model_type, server_tag);
string parent_id = FakeServerEntity::CreateId(model_type, parent_server_tag);
- return new PermanentEntity(id, model_type, name, parent_id, server_tag);
+ sync_pb::EntitySpecifics entity_specifics;
+ AddDefaultFieldValue(model_type, &entity_specifics);
+ return new PermanentEntity(id,
+ model_type,
+ name,
+ parent_id,
+ server_tag,
+ entity_specifics);
}
// static
@@ -48,17 +55,43 @@ FakeServerEntity* PermanentEntity::CreateTopLevel(
string server_tag = syncer::ModelTypeToRootTag(model_type);
string name = syncer::ModelTypeToString(model_type);
string id = FakeServerEntity::CreateId(model_type, server_tag);
- return new PermanentEntity(id, model_type, name, kRootParentTag, server_tag);
+ sync_pb::EntitySpecifics entity_specifics;
+ AddDefaultFieldValue(model_type, &entity_specifics);
+ return new PermanentEntity(id,
+ model_type,
+ name,
+ kRootParentTag,
+ server_tag,
+ entity_specifics);
+}
+
+// static
+FakeServerEntity* PermanentEntity::CreateUpdatedNigoriEntity(
+ const sync_pb::SyncEntity& client_entity,
+ FakeServerEntity* current_server_entity) {
+ ModelType model_type = current_server_entity->GetModelType();
+ if (model_type != syncer::NIGORI) {
+ return NULL;
+ }
+
+ return new PermanentEntity(current_server_entity->GetId(),
+ model_type,
+ current_server_entity->GetName(),
+ current_server_entity->GetParentId(),
+ syncer::ModelTypeToRootTag(model_type),
+ client_entity.specifics());
}
PermanentEntity::PermanentEntity(const string& id,
const ModelType& model_type,
const string& name,
const string& parent_id,
- const string& server_defined_unique_tag)
+ const string& server_defined_unique_tag,
+ const sync_pb::EntitySpecifics& specifics)
: FakeServerEntity(id, model_type, 0, name),
server_defined_unique_tag_(server_defined_unique_tag),
- parent_id_(parent_id) { }
+ parent_id_(parent_id),
+ specifics_(specifics) { }
string PermanentEntity::GetParentId() const {
return parent_id_;
@@ -69,7 +102,7 @@ sync_pb::SyncEntity* PermanentEntity::SerializeAsProto() {
FakeServerEntity::SerializeBaseProtoFields(sync_entity);
sync_pb::EntitySpecifics* specifics = sync_entity->mutable_specifics();
- AddDefaultFieldValue(FakeServerEntity::GetModelType(), specifics);
+ specifics->CopyFrom(specifics_);
sync_entity->set_parent_id_string(parent_id_);
sync_entity->set_server_defined_unique_tag(server_defined_unique_tag_);
diff --git a/sync/test/fake_server/permanent_entity.h b/sync/test/fake_server/permanent_entity.h
index 3579720..ea84cfc 100644
--- a/sync/test/fake_server/permanent_entity.h
+++ b/sync/test/fake_server/permanent_entity.h
@@ -26,10 +26,17 @@ class PermanentEntity : public FakeServerEntity {
const std::string& name,
const std::string& parent_server_tag);
- // Factory function for a top level BookmarkEntity. Top level means that the
+ // Factory function for a top level PermanentEntity. Top level means that the
// entity's parent is the root entity (no PermanentEntity exists for root).
static FakeServerEntity* CreateTopLevel(const syncer::ModelType& model_type);
+ // Factory function for creating an updated version of a PermanentEntity.
+ // This function should only be called for the Nigori entity and will return
+ // NULL if any other type is specified.
+ static FakeServerEntity* CreateUpdatedNigoriEntity(
+ const sync_pb::SyncEntity& client_entity,
+ FakeServerEntity* current_server_entity);
+
// FakeServerEntity implementation.
virtual std::string GetParentId() const OVERRIDE;
virtual sync_pb::SyncEntity* SerializeAsProto() OVERRIDE;
@@ -41,11 +48,13 @@ class PermanentEntity : public FakeServerEntity {
const syncer::ModelType& model_type,
const std::string& name,
const std::string& parent_id,
- const std::string& server_defined_unique_tag);
+ const std::string& server_defined_unique_tag,
+ const sync_pb::EntitySpecifics& entity_specifics);
// All member values have equivalent fields in SyncEntity.
std::string server_defined_unique_tag_;
std::string parent_id_;
+ sync_pb::EntitySpecifics specifics_;
};
} // namespace fake_server
diff --git a/sync/test/fake_server/unique_client_entity.cc b/sync/test/fake_server/unique_client_entity.cc
index 06fc082..693b24a 100644
--- a/sync/test/fake_server/unique_client_entity.cc
+++ b/sync/test/fake_server/unique_client_entity.cc
@@ -21,7 +21,7 @@ namespace fake_server {
UniqueClientEntity::~UniqueClientEntity() { }
// static
-FakeServerEntity* UniqueClientEntity::Create(
+FakeServerEntity* UniqueClientEntity::CreateNew(
const sync_pb::SyncEntity& client_entity) {
DCHECK(client_entity.has_client_defined_unique_tag());
DCHECK(!client_entity.folder());
@@ -35,6 +35,22 @@ FakeServerEntity* UniqueClientEntity::Create(
model_type,
client_entity.version(),
client_entity.name(),
+ client_entity.parent_id_string(),
+ client_entity.client_defined_unique_tag(),
+ client_entity.specifics(),
+ client_entity.ctime(),
+ client_entity.mtime());
+}
+
+// static
+FakeServerEntity* UniqueClientEntity::CreateUpdatedVersion(
+ const sync_pb::SyncEntity& client_entity,
+ FakeServerEntity* current_server_entity) {
+ return new UniqueClientEntity(client_entity.id_string(),
+ current_server_entity->GetModelType(),
+ client_entity.version(),
+ client_entity.name(),
+ client_entity.parent_id_string(),
client_entity.client_defined_unique_tag(),
client_entity.specifics(),
client_entity.ctime(),
@@ -46,20 +62,22 @@ UniqueClientEntity::UniqueClientEntity(
const ModelType& model_type,
int64 version,
const string& name,
+ const string& parent_id,
const string& client_defined_unique_tag,
const sync_pb::EntitySpecifics& specifics,
int64 creation_time,
int64 last_modified_time)
: FakeServerEntity(id, model_type, version, name),
+ parent_id_(parent_id),
client_defined_unique_tag_(client_defined_unique_tag),
specifics_(specifics),
creation_time_(creation_time),
last_modified_time_(last_modified_time) { }
string UniqueClientEntity::GetParentId() const {
- // Return a dummy value that cannot be a real parent ID. This type should
- // never have parents.
- return string();
+ // The parent ID for this type of entity should always be its ModelType's
+ // root node.
+ return parent_id_;
}
sync_pb::SyncEntity* UniqueClientEntity::SerializeAsProto() {
@@ -69,6 +87,7 @@ sync_pb::SyncEntity* UniqueClientEntity::SerializeAsProto() {
sync_pb::EntitySpecifics* specifics = sync_entity->mutable_specifics();
specifics->CopyFrom(specifics_);
+ sync_entity->set_parent_id_string(parent_id_);
sync_entity->set_client_defined_unique_tag(client_defined_unique_tag_);
sync_entity->set_ctime(creation_time_);
sync_entity->set_mtime(last_modified_time_);
diff --git a/sync/test/fake_server/unique_client_entity.h b/sync/test/fake_server/unique_client_entity.h
index 6069222..6e876e3 100644
--- a/sync/test/fake_server/unique_client_entity.h
+++ b/sync/test/fake_server/unique_client_entity.h
@@ -20,7 +20,13 @@ class UniqueClientEntity : public FakeServerEntity {
virtual ~UniqueClientEntity();
// Factory function for UniqueClientEntity.
- static FakeServerEntity* Create(const sync_pb::SyncEntity& client_entity);
+ static FakeServerEntity* CreateNew(const sync_pb::SyncEntity& client_entity);
+
+ // Factory function for creating a new version of an existing
+ // UniqueClientEntity.
+ static FakeServerEntity* CreateUpdatedVersion(
+ const sync_pb::SyncEntity& client_entity,
+ FakeServerEntity* current_server_entity);
// FakeServerEntity implementation.
virtual std::string GetParentId() const OVERRIDE;
@@ -33,12 +39,14 @@ class UniqueClientEntity : public FakeServerEntity {
const syncer::ModelType& model_type,
int64 version,
const std::string& name,
+ const std::string& parent_id,
const std::string& client_defined_unique_tag,
const sync_pb::EntitySpecifics& specifics,
int64 creation_time,
int64 last_modified_time);
// All member values have equivalent fields in SyncEntity.
+ std::string parent_id_;
std::string client_defined_unique_tag_;
sync_pb::EntitySpecifics specifics_;
int64 creation_time_;