| Index: sync/internal_api/processor_entity_tracker_unittest.cc
|
| diff --git a/sync/internal_api/processor_entity_tracker_unittest.cc b/sync/internal_api/processor_entity_tracker_unittest.cc
|
| deleted file mode 100644
|
| index 76b29f819a0421ca19aaaea5c3302d0254649ac8..0000000000000000000000000000000000000000
|
| --- a/sync/internal_api/processor_entity_tracker_unittest.cc
|
| +++ /dev/null
|
| @@ -1,485 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "sync/internal_api/public/processor_entity_tracker.h"
|
| -
|
| -#include <stdint.h>
|
| -
|
| -#include <memory>
|
| -#include <utility>
|
| -
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/time/time.h"
|
| -#include "sync/internal_api/public/base/model_type.h"
|
| -#include "sync/internal_api/public/non_blocking_sync_common.h"
|
| -#include "sync/protocol/sync.pb.h"
|
| -#include "sync/syncable/syncable_util.h"
|
| -#include "sync/util/time.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace syncer_v2 {
|
| -
|
| -namespace {
|
| -
|
| -const std::string kTag = "tag";
|
| -const std::string kId = "id";
|
| -const std::string kValue1 = "value1";
|
| -const std::string kValue2 = "value2";
|
| -const std::string kValue3 = "value3";
|
| -
|
| -std::string GenerateTagHash(const std::string& tag) {
|
| - return syncer::syncable::GenerateSyncableHash(syncer::PREFERENCES, tag);
|
| -}
|
| -
|
| -sync_pb::EntitySpecifics GenerateSpecifics(const std::string& tag,
|
| - const std::string& value) {
|
| - sync_pb::EntitySpecifics specifics;
|
| - specifics.mutable_preference()->set_name(tag);
|
| - specifics.mutable_preference()->set_value(value);
|
| - return specifics;
|
| -}
|
| -
|
| -std::unique_ptr<EntityData> GenerateEntityData(const std::string& tag,
|
| - const std::string& value) {
|
| - std::unique_ptr<EntityData> entity_data(new EntityData());
|
| - entity_data->client_tag_hash = GenerateTagHash(tag);
|
| - entity_data->specifics = GenerateSpecifics(tag, value);
|
| - entity_data->non_unique_name = tag;
|
| - return entity_data;
|
| -}
|
| -
|
| -UpdateResponseData GenerateUpdate(const ProcessorEntityTracker& entity,
|
| - const std::string& id,
|
| - const std::string& value,
|
| - const base::Time& mtime,
|
| - int64_t version) {
|
| - std::unique_ptr<EntityData> data =
|
| - GenerateEntityData(entity.client_tag(), value);
|
| - data->id = id;
|
| - data->modification_time = mtime;
|
| - UpdateResponseData update;
|
| - update.entity = data->PassToPtr();
|
| - update.response_version = version;
|
| - return update;
|
| -}
|
| -
|
| -UpdateResponseData GenerateTombstone(const ProcessorEntityTracker& entity,
|
| - const std::string& id,
|
| - const base::Time& mtime,
|
| - int64_t version) {
|
| - std::unique_ptr<EntityData> data = base::WrapUnique(new EntityData());
|
| - data->client_tag_hash = GenerateTagHash(entity.client_tag());
|
| - data->non_unique_name = entity.client_tag();
|
| - data->id = id;
|
| - data->modification_time = mtime;
|
| - UpdateResponseData update;
|
| - update.entity = data->PassToPtr();
|
| - update.response_version = version;
|
| - return update;
|
| -}
|
| -
|
| -CommitResponseData GenerateAckData(const CommitRequestData& request,
|
| - int64_t version) {
|
| - CommitResponseData response;
|
| - response.id = kId;
|
| - response.client_tag_hash = request.entity->client_tag_hash;
|
| - response.sequence_number = request.sequence_number;
|
| - response.response_version = version;
|
| - response.specifics_hash = request.specifics_hash;
|
| - return response;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// Some simple sanity tests for the ProcessorEntityTracker.
|
| -//
|
| -// A lot of the more complicated sync logic is implemented in the
|
| -// SharedModelTypeProcessor that owns the ProcessorEntityTracker. We can't unit
|
| -// test it here.
|
| -//
|
| -// Instead, we focus on simple tests to make sure that variables are getting
|
| -// properly intialized and flags properly set. Anything more complicated would
|
| -// be a redundant and incomplete version of the SharedModelTypeProcessor tests.
|
| -class ProcessorEntityTrackerTest : public ::testing::Test {
|
| - public:
|
| - ProcessorEntityTrackerTest()
|
| - : tag_hash_(GenerateTagHash(kTag)),
|
| - ctime_(base::Time::Now() - base::TimeDelta::FromSeconds(1)){};
|
| -
|
| - std::unique_ptr<ProcessorEntityTracker> CreateNew() {
|
| - return ProcessorEntityTracker::CreateNew(kTag, tag_hash_, "", ctime_);
|
| - }
|
| -
|
| - std::unique_ptr<ProcessorEntityTracker> CreateSynced() {
|
| - std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
|
| - entity->RecordAcceptedUpdate(
|
| - GenerateUpdate(*entity, kId, kValue1, ctime_, 1));
|
| - DCHECK(!entity->IsUnsynced());
|
| - return entity;
|
| - }
|
| -
|
| - const std::string tag_hash_;
|
| - const base::Time ctime_;
|
| -};
|
| -
|
| -// Test the state of the default new tracker.
|
| -TEST_F(ProcessorEntityTrackerTest, DefaultTracker) {
|
| - std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
|
| -
|
| - EXPECT_EQ(kTag, entity->client_tag());
|
| - EXPECT_EQ(tag_hash_, entity->metadata().client_tag_hash());
|
| - EXPECT_EQ("", entity->metadata().server_id());
|
| - EXPECT_FALSE(entity->metadata().is_deleted());
|
| - EXPECT_EQ(0, entity->metadata().sequence_number());
|
| - EXPECT_EQ(0, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(kUncommittedVersion, entity->metadata().server_version());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(ctime_),
|
| - entity->metadata().creation_time());
|
| - EXPECT_EQ(0, entity->metadata().modification_time());
|
| - EXPECT_TRUE(entity->metadata().specifics_hash().empty());
|
| - EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
|
| -
|
| - EXPECT_FALSE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_FALSE(entity->UpdateIsReflection(1));
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -}
|
| -
|
| -// Test creating and commiting a new local item.
|
| -TEST_F(ProcessorEntityTrackerTest, NewLocalItem) {
|
| - std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
|
| - entity->MakeLocalChange(GenerateEntityData(kTag, kValue1));
|
| -
|
| - EXPECT_EQ("", entity->metadata().server_id());
|
| - EXPECT_FALSE(entity->metadata().is_deleted());
|
| - EXPECT_EQ(1, entity->metadata().sequence_number());
|
| - EXPECT_EQ(0, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(kUncommittedVersion, entity->metadata().server_version());
|
| - EXPECT_NE(0, entity->metadata().modification_time());
|
| - EXPECT_FALSE(entity->metadata().specifics_hash().empty());
|
| - EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
|
| -
|
| - EXPECT_TRUE(entity->IsUnsynced());
|
| - EXPECT_TRUE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_FALSE(entity->UpdateIsReflection(1));
|
| - EXPECT_TRUE(entity->HasCommitData());
|
| -
|
| - EXPECT_EQ(kValue1, entity->commit_data()->specifics.preference().value());
|
| -
|
| - // Generate a commit request. The metadata should not change.
|
| - const sync_pb::EntityMetadata metadata_v1 = entity->metadata();
|
| - CommitRequestData request;
|
| - entity->InitializeCommitRequestData(&request);
|
| - EXPECT_EQ(metadata_v1.SerializeAsString(),
|
| - entity->metadata().SerializeAsString());
|
| -
|
| - EXPECT_TRUE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_FALSE(entity->UpdateIsReflection(1));
|
| - EXPECT_TRUE(entity->HasCommitData());
|
| -
|
| - const EntityData& data = request.entity.value();
|
| - EXPECT_EQ("", data.id);
|
| - EXPECT_EQ(tag_hash_, data.client_tag_hash);
|
| - EXPECT_EQ(kTag, data.non_unique_name);
|
| - EXPECT_EQ(kValue1, data.specifics.preference().value());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(ctime_),
|
| - syncer::TimeToProtoTime(data.creation_time));
|
| - EXPECT_EQ(entity->metadata().modification_time(),
|
| - syncer::TimeToProtoTime(data.modification_time));
|
| - EXPECT_FALSE(data.is_deleted());
|
| - EXPECT_EQ(1, request.sequence_number);
|
| - EXPECT_EQ(kUncommittedVersion, request.base_version);
|
| - EXPECT_EQ(entity->metadata().specifics_hash(), request.specifics_hash);
|
| -
|
| - // Ack the commit.
|
| - entity->ReceiveCommitResponse(GenerateAckData(request, 1));
|
| -
|
| - EXPECT_EQ(kId, entity->metadata().server_id());
|
| - EXPECT_FALSE(entity->metadata().is_deleted());
|
| - EXPECT_EQ(1, entity->metadata().sequence_number());
|
| - EXPECT_EQ(1, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(1, entity->metadata().server_version());
|
| - EXPECT_EQ(metadata_v1.creation_time(), entity->metadata().creation_time());
|
| - EXPECT_EQ(metadata_v1.modification_time(),
|
| - entity->metadata().modification_time());
|
| - EXPECT_FALSE(entity->metadata().specifics_hash().empty());
|
| - EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
|
| -
|
| - EXPECT_FALSE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_TRUE(entity->UpdateIsReflection(1));
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -}
|
| -
|
| -// Test state for a newly synced server item.
|
| -TEST_F(ProcessorEntityTrackerTest, NewServerItem) {
|
| - std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
|
| -
|
| - const base::Time mtime = base::Time::Now();
|
| - entity->RecordAcceptedUpdate(
|
| - GenerateUpdate(*entity, kId, kValue1, mtime, 10));
|
| -
|
| - EXPECT_EQ(kId, entity->metadata().server_id());
|
| - EXPECT_FALSE(entity->metadata().is_deleted());
|
| - EXPECT_EQ(0, entity->metadata().sequence_number());
|
| - EXPECT_EQ(0, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(10, entity->metadata().server_version());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(mtime),
|
| - entity->metadata().modification_time());
|
| - EXPECT_FALSE(entity->metadata().specifics_hash().empty());
|
| - EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
|
| -
|
| - EXPECT_FALSE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_TRUE(entity->UpdateIsReflection(9));
|
| - EXPECT_TRUE(entity->UpdateIsReflection(10));
|
| - EXPECT_FALSE(entity->UpdateIsReflection(11));
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -}
|
| -
|
| -// Test state for a tombstone received for a previously unknown item.
|
| -TEST_F(ProcessorEntityTrackerTest, NewServerTombstone) {
|
| - std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
|
| -
|
| - const base::Time mtime = base::Time::Now();
|
| - entity->RecordAcceptedUpdate(GenerateTombstone(*entity, kId, mtime, 1));
|
| -
|
| - EXPECT_EQ(kId, entity->metadata().server_id());
|
| - EXPECT_TRUE(entity->metadata().is_deleted());
|
| - EXPECT_EQ(0, entity->metadata().sequence_number());
|
| - EXPECT_EQ(0, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(1, entity->metadata().server_version());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(mtime),
|
| - entity->metadata().modification_time());
|
| - EXPECT_TRUE(entity->metadata().specifics_hash().empty());
|
| - EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
|
| -
|
| - EXPECT_FALSE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_TRUE(entity->CanClearMetadata());
|
| - EXPECT_TRUE(entity->UpdateIsReflection(1));
|
| - EXPECT_FALSE(entity->UpdateIsReflection(2));
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -}
|
| -
|
| -// Apply a deletion update to a synced item.
|
| -TEST_F(ProcessorEntityTrackerTest, ServerTombstone) {
|
| - // Start with a non-deleted state with version 1.
|
| - std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
|
| - // A deletion update one version later.
|
| - const base::Time mtime = base::Time::Now();
|
| - entity->RecordAcceptedUpdate(GenerateTombstone(*entity, kId, mtime, 2));
|
| -
|
| - EXPECT_TRUE(entity->metadata().is_deleted());
|
| - EXPECT_EQ(0, entity->metadata().sequence_number());
|
| - EXPECT_EQ(0, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(2, entity->metadata().server_version());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(mtime),
|
| - entity->metadata().modification_time());
|
| - EXPECT_TRUE(entity->metadata().specifics_hash().empty());
|
| - EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
|
| -
|
| - EXPECT_FALSE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_TRUE(entity->CanClearMetadata());
|
| - EXPECT_TRUE(entity->UpdateIsReflection(2));
|
| - EXPECT_FALSE(entity->UpdateIsReflection(3));
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -}
|
| -
|
| -// Test a local change of a synced item.
|
| -TEST_F(ProcessorEntityTrackerTest, LocalChange) {
|
| - std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
|
| - const int64_t mtime_v0 = entity->metadata().modification_time();
|
| - const std::string specifics_hash_v0 = entity->metadata().specifics_hash();
|
| -
|
| - // Make a local change with different specifics.
|
| - entity->MakeLocalChange(GenerateEntityData(kTag, kValue2));
|
| -
|
| - const int64_t mtime_v1 = entity->metadata().modification_time();
|
| - const std::string specifics_hash_v1 = entity->metadata().specifics_hash();
|
| -
|
| - EXPECT_FALSE(entity->metadata().is_deleted());
|
| - EXPECT_EQ(1, entity->metadata().sequence_number());
|
| - EXPECT_EQ(0, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(1, entity->metadata().server_version());
|
| - EXPECT_LT(mtime_v0, mtime_v1);
|
| - EXPECT_NE(specifics_hash_v0, specifics_hash_v1);
|
| - EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash());
|
| -
|
| - EXPECT_TRUE(entity->IsUnsynced());
|
| - EXPECT_TRUE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_TRUE(entity->HasCommitData());
|
| -
|
| - // Make a commit.
|
| - CommitRequestData request;
|
| - entity->InitializeCommitRequestData(&request);
|
| -
|
| - EXPECT_EQ(kId, request.entity->id);
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| -
|
| - // Ack the commit.
|
| - entity->ReceiveCommitResponse(GenerateAckData(request, 2));
|
| -
|
| - EXPECT_EQ(1, entity->metadata().sequence_number());
|
| - EXPECT_EQ(1, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(2, entity->metadata().server_version());
|
| - EXPECT_EQ(mtime_v1, entity->metadata().modification_time());
|
| - EXPECT_EQ(specifics_hash_v1, entity->metadata().specifics_hash());
|
| - EXPECT_EQ("", entity->metadata().base_specifics_hash());
|
| -
|
| - EXPECT_FALSE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -}
|
| -
|
| -// Test a local deletion of a synced item.
|
| -TEST_F(ProcessorEntityTrackerTest, LocalDeletion) {
|
| - std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
|
| - const int64_t mtime = entity->metadata().modification_time();
|
| - const std::string specifics_hash = entity->metadata().specifics_hash();
|
| -
|
| - // Make a local delete.
|
| - entity->Delete();
|
| -
|
| - EXPECT_TRUE(entity->metadata().is_deleted());
|
| - EXPECT_EQ(1, entity->metadata().sequence_number());
|
| - EXPECT_EQ(0, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(1, entity->metadata().server_version());
|
| - EXPECT_LT(mtime, entity->metadata().modification_time());
|
| - EXPECT_TRUE(entity->metadata().specifics_hash().empty());
|
| - EXPECT_EQ(specifics_hash, entity->metadata().base_specifics_hash());
|
| -
|
| - EXPECT_TRUE(entity->IsUnsynced());
|
| - EXPECT_TRUE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -
|
| - // Generate a commit request. The metadata should not change.
|
| - const sync_pb::EntityMetadata metadata_v1 = entity->metadata();
|
| - CommitRequestData request;
|
| - entity->InitializeCommitRequestData(&request);
|
| - EXPECT_EQ(metadata_v1.SerializeAsString(),
|
| - entity->metadata().SerializeAsString());
|
| -
|
| - EXPECT_TRUE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -
|
| - const EntityData& data = request.entity.value();
|
| - EXPECT_EQ(kId, data.id);
|
| - EXPECT_EQ(tag_hash_, data.client_tag_hash);
|
| - EXPECT_EQ("", data.non_unique_name);
|
| - EXPECT_EQ(syncer::TimeToProtoTime(ctime_),
|
| - syncer::TimeToProtoTime(data.creation_time));
|
| - EXPECT_EQ(entity->metadata().modification_time(),
|
| - syncer::TimeToProtoTime(data.modification_time));
|
| - EXPECT_TRUE(data.is_deleted());
|
| - EXPECT_EQ(1, request.sequence_number);
|
| - EXPECT_EQ(1, request.base_version);
|
| - EXPECT_EQ(entity->metadata().specifics_hash(), request.specifics_hash);
|
| -
|
| - // Ack the deletion.
|
| - entity->ReceiveCommitResponse(GenerateAckData(request, 2));
|
| -
|
| - EXPECT_TRUE(entity->metadata().is_deleted());
|
| - EXPECT_EQ(1, entity->metadata().sequence_number());
|
| - EXPECT_EQ(1, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(2, entity->metadata().server_version());
|
| - EXPECT_EQ(metadata_v1.modification_time(),
|
| - entity->metadata().modification_time());
|
| - EXPECT_TRUE(entity->metadata().specifics_hash().empty());
|
| - EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
|
| -
|
| - EXPECT_FALSE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_TRUE(entity->CanClearMetadata());
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -}
|
| -
|
| -// Test that hashes and sequence numbers are handled correctly for the "commit
|
| -// commit, ack ack" case.
|
| -TEST_F(ProcessorEntityTrackerTest, LocalChangesInterleaved) {
|
| - std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
|
| - const std::string specifics_hash_v0 = entity->metadata().specifics_hash();
|
| -
|
| - // Make the first change.
|
| - entity->MakeLocalChange(GenerateEntityData(kTag, kValue2));
|
| - const std::string specifics_hash_v1 = entity->metadata().specifics_hash();
|
| -
|
| - EXPECT_EQ(1, entity->metadata().sequence_number());
|
| - EXPECT_EQ(0, entity->metadata().acked_sequence_number());
|
| - EXPECT_NE(specifics_hash_v0, specifics_hash_v1);
|
| - EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash());
|
| -
|
| - // Request the first commit.
|
| - CommitRequestData request_v1;
|
| - entity->InitializeCommitRequestData(&request_v1);
|
| -
|
| - // Make the second change.
|
| - entity->MakeLocalChange(GenerateEntityData(kTag, kValue3));
|
| - const std::string specifics_hash_v2 = entity->metadata().specifics_hash();
|
| -
|
| - EXPECT_EQ(2, entity->metadata().sequence_number());
|
| - EXPECT_EQ(0, entity->metadata().acked_sequence_number());
|
| - EXPECT_NE(specifics_hash_v1, specifics_hash_v2);
|
| - EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash());
|
| -
|
| - // Request the second commit.
|
| - CommitRequestData request_v2;
|
| - entity->InitializeCommitRequestData(&request_v2);
|
| -
|
| - EXPECT_TRUE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_TRUE(entity->HasCommitData());
|
| -
|
| - // Ack the first commit.
|
| - entity->ReceiveCommitResponse(GenerateAckData(request_v1, 2));
|
| -
|
| - EXPECT_EQ(2, entity->metadata().sequence_number());
|
| - EXPECT_EQ(1, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(2, entity->metadata().server_version());
|
| - EXPECT_EQ(specifics_hash_v2, entity->metadata().specifics_hash());
|
| - EXPECT_EQ(specifics_hash_v1, entity->metadata().base_specifics_hash());
|
| -
|
| - // Ack the second commit.
|
| - entity->ReceiveCommitResponse(GenerateAckData(request_v2, 3));
|
| -
|
| - EXPECT_EQ(2, entity->metadata().sequence_number());
|
| - EXPECT_EQ(2, entity->metadata().acked_sequence_number());
|
| - EXPECT_EQ(3, entity->metadata().server_version());
|
| - EXPECT_EQ(specifics_hash_v2, entity->metadata().specifics_hash());
|
| - EXPECT_EQ("", entity->metadata().base_specifics_hash());
|
| -
|
| - EXPECT_FALSE(entity->IsUnsynced());
|
| - EXPECT_FALSE(entity->RequiresCommitRequest());
|
| - EXPECT_FALSE(entity->RequiresCommitData());
|
| - EXPECT_FALSE(entity->CanClearMetadata());
|
| - EXPECT_FALSE(entity->HasCommitData());
|
| -}
|
| -
|
| -} // namespace syncer_v2
|
|
|