Home | History | Annotate | Download | only in engine
      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
      3 // found in the LICENSE file.
      4 
      5 #include "sync/test/engine/single_type_mock_server.h"
      6 
      7 #include "sync/util/time.h"
      8 
      9 using google::protobuf::RepeatedPtrField;
     10 
     11 namespace syncer {
     12 
     13 SingleTypeMockServer::SingleTypeMockServer(syncer::ModelType type)
     14     : type_(type), type_root_id_(ModelTypeToRootTag(type)) {
     15 }
     16 
     17 SingleTypeMockServer::~SingleTypeMockServer() {
     18 }
     19 
     20 sync_pb::SyncEntity SingleTypeMockServer::TypeRootUpdate() {
     21   sync_pb::SyncEntity entity;
     22 
     23   entity.set_id_string(type_root_id_);
     24   entity.set_parent_id_string("r");
     25   entity.set_version(1000);
     26   entity.set_ctime(TimeToProtoTime(base::Time::UnixEpoch()));
     27   entity.set_mtime(TimeToProtoTime(base::Time::UnixEpoch()));
     28   entity.set_server_defined_unique_tag(ModelTypeToRootTag(type_));
     29   entity.set_deleted(false);
     30   AddDefaultFieldValue(type_, entity.mutable_specifics());
     31 
     32   return entity;
     33 }
     34 
     35 sync_pb::SyncEntity SingleTypeMockServer::UpdateFromServer(
     36     int64 version_offset,
     37     const std::string& tag_hash,
     38     const sync_pb::EntitySpecifics& specifics) {
     39   int64 old_version = GetServerVersion(tag_hash);
     40   int64 version = old_version + version_offset;
     41   if (version > old_version) {
     42     SetServerVersion(tag_hash, version);
     43   }
     44 
     45   sync_pb::SyncEntity entity;
     46 
     47   entity.set_id_string(GenerateId(tag_hash));
     48   entity.set_parent_id_string(type_root_id_);
     49   entity.set_version(version);
     50   entity.set_client_defined_unique_tag(tag_hash);
     51   entity.set_deleted(false);
     52   entity.mutable_specifics()->CopyFrom(specifics);
     53 
     54   // Unimportant fields, set for completeness only.
     55   base::Time ctime = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1);
     56   base::Time mtime = ctime + base::TimeDelta::FromSeconds(version);
     57   entity.set_ctime(TimeToProtoTime(ctime));
     58   entity.set_mtime(TimeToProtoTime(mtime));
     59   entity.set_name("Name: " + tag_hash);
     60 
     61   return entity;
     62 }
     63 
     64 sync_pb::SyncEntity SingleTypeMockServer::TombstoneFromServer(
     65     int64 version_offset,
     66     const std::string& tag_hash) {
     67   int64 old_version = GetServerVersion(tag_hash);
     68   int64 version = old_version + version_offset;
     69   if (version > old_version) {
     70     SetServerVersion(tag_hash, version);
     71   }
     72 
     73   sync_pb::SyncEntity entity;
     74 
     75   entity.set_id_string(GenerateId(tag_hash));
     76   entity.set_parent_id_string(type_root_id_);
     77   entity.set_version(version);
     78   entity.set_client_defined_unique_tag(tag_hash);
     79   entity.set_deleted(false);
     80   AddDefaultFieldValue(type_, entity.mutable_specifics());
     81 
     82   // Unimportant fields, set for completeness only.
     83   base::Time ctime = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1);
     84   base::Time mtime = ctime + base::TimeDelta::FromSeconds(version);
     85   entity.set_ctime(TimeToProtoTime(ctime));
     86   entity.set_mtime(TimeToProtoTime(mtime));
     87   entity.set_name("Tombstone");
     88 
     89   return entity;
     90 }
     91 
     92 sync_pb::ClientToServerResponse SingleTypeMockServer::DoSuccessfulCommit(
     93     const sync_pb::ClientToServerMessage& message) {
     94   commit_messages_.push_back(message);
     95 
     96   sync_pb::ClientToServerResponse response;
     97   sync_pb::CommitResponse* commit_response = response.mutable_commit();
     98 
     99   const RepeatedPtrField<sync_pb::SyncEntity>& entries =
    100       message.commit().entries();
    101   for (RepeatedPtrField<sync_pb::SyncEntity>::const_iterator it =
    102            entries.begin();
    103        it != entries.end();
    104        ++it) {
    105     const std::string tag_hash = it->client_defined_unique_tag();
    106 
    107     committed_items_[tag_hash] = *it;
    108 
    109     // Every commit increments the version number.
    110     int64 version = GetServerVersion(tag_hash);
    111     version++;
    112     SetServerVersion(tag_hash, version);
    113 
    114     sync_pb::CommitResponse_EntryResponse* entryresponse =
    115         commit_response->add_entryresponse();
    116     entryresponse->set_response_type(sync_pb::CommitResponse::SUCCESS);
    117     entryresponse->set_id_string(GenerateId(tag_hash));
    118     entryresponse->set_parent_id_string(it->parent_id_string());
    119     entryresponse->set_version(version);
    120     entryresponse->set_name(it->name());
    121     entryresponse->set_mtime(it->mtime());
    122   }
    123 
    124   return response;
    125 }
    126 
    127 size_t SingleTypeMockServer::GetNumCommitMessages() const {
    128   return commit_messages_.size();
    129 }
    130 
    131 sync_pb::ClientToServerMessage SingleTypeMockServer::GetNthCommitMessage(
    132     size_t n) const {
    133   DCHECK_LT(n, GetNumCommitMessages());
    134   return commit_messages_[n];
    135 }
    136 
    137 bool SingleTypeMockServer::HasCommitEntity(const std::string& tag_hash) const {
    138   return committed_items_.find(tag_hash) != committed_items_.end();
    139 }
    140 
    141 sync_pb::SyncEntity SingleTypeMockServer::GetLastCommittedEntity(
    142     const std::string& tag_hash) const {
    143   DCHECK(HasCommitEntity(tag_hash));
    144   return committed_items_.find(tag_hash)->second;
    145 }
    146 
    147 sync_pb::DataTypeProgressMarker SingleTypeMockServer::GetProgress() const {
    148   sync_pb::DataTypeProgressMarker progress;
    149   progress.set_data_type_id(type_);
    150   progress.set_token("non_null_progress_token");
    151   return progress;
    152 }
    153 
    154 sync_pb::DataTypeContext SingleTypeMockServer::GetContext() const {
    155   return sync_pb::DataTypeContext();
    156 }
    157 
    158 std::string SingleTypeMockServer::GenerateId(const std::string& tag_hash) {
    159   return "FakeId:" + tag_hash;
    160 }
    161 
    162 int64 SingleTypeMockServer::GetServerVersion(
    163     const std::string& tag_hash) const {
    164   std::map<const std::string, int64>::const_iterator it;
    165   it = server_versions_.find(tag_hash);
    166   // Server versions do not necessarily start at 1 or 0.
    167   if (it == server_versions_.end()) {
    168     return 2048;
    169   } else {
    170     return it->second;
    171   }
    172 }
    173 
    174 void SingleTypeMockServer::SetServerVersion(const std::string& tag_hash,
    175                                             int64 version) {
    176   server_versions_[tag_hash] = version;
    177 }
    178 
    179 }  // namespace syncer
    180