146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/engine/entity_tracker.h"
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/time/time.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "sync/syncable/syncable_util.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "sync/util/time.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace syncer {
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Some simple tests for the EntityTracker.
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The EntityTracker is an implementation detail of the ModelTypeSyncWorker.
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// As such, it doesn't make much sense to test it exhaustively, since it
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// already gets a lot of test coverage from the ModelTypeSyncWorker unit tests.
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// These tests are intended as a basic sanity check.  Anything more complicated
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// would be redundant.
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass EntityTrackerTest : public ::testing::Test {
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EntityTrackerTest()
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : kServerId("ServerID"),
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        kClientTag("some.sample.tag"),
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        kClientTagHash(syncable::GenerateSyncableHash(PREFERENCES, kClientTag)),
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        kCtime(base::Time::UnixEpoch() + base::TimeDelta::FromDays(10)),
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        kMtime(base::Time::UnixEpoch() + base::TimeDelta::FromDays(20)) {
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    specifics.mutable_preference()->set_name(kClientTag);
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    specifics.mutable_preference()->set_value("pref.value");
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~EntityTrackerTest() {}
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const std::string kServerId;
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const std::string kClientTag;
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const std::string kClientTagHash;
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::Time kCtime;
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::Time kMtime;
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  sync_pb::EntitySpecifics specifics;
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Construct a new entity from a server update.  Then receive another update.
48116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EntityTrackerTest, FromServerUpdate) {
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<EntityTracker> entity(
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EntityTracker::FromServerUpdate(kServerId, kClientTagHash, 10));
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(entity->IsCommitPending());
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  entity->ReceiveUpdate(20);
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(entity->IsCommitPending());
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Construct a new entity from a commit request.  Then serialize it.
58116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EntityTrackerTest, FromCommitRequest) {
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<EntityTracker> entity(
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EntityTracker::FromCommitRequest(kServerId,
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kClientTagHash,
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       22,
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       33,
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kCtime,
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kMtime,
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kClientTag,
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       false,
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       specifics));
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(entity->IsCommitPending());
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  sync_pb::SyncEntity pb_entity;
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int64 sequence_number = 0;
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  entity->PrepareCommitProto(&pb_entity, &sequence_number);
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(22, sequence_number);
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kServerId, pb_entity.id_string());
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kClientTagHash, pb_entity.client_defined_unique_tag());
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(33, pb_entity.version());
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kCtime, ProtoTimeToTime(pb_entity.ctime()));
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kMtime, ProtoTimeToTime(pb_entity.mtime()));
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(pb_entity.deleted());
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(specifics.preference().name(),
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            pb_entity.specifics().preference().name());
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(specifics.preference().value(),
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            pb_entity.specifics().preference().value());
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Start with a server initiated entity.  Commit over top of it.
88116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EntityTrackerTest, RequestCommit) {
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<EntityTracker> entity(
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EntityTracker::FromServerUpdate(kServerId, kClientTagHash, 10));
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  entity->RequestCommit(kServerId,
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        kClientTagHash,
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        1,
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        10,
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        kCtime,
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        kMtime,
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        kClientTag,
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        false,
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        specifics);
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(entity->IsCommitPending());
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Start with a server initiated entity.  Fail to request a commit because of
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// an out of date base version.
107116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EntityTrackerTest, RequestCommitFailure) {
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<EntityTracker> entity(
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EntityTracker::FromServerUpdate(kServerId, kClientTagHash, 10));
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(entity->IsCommitPending());
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  entity->RequestCommit(kServerId,
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        kClientTagHash,
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        23,
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        5,  // Version 5 < 10
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        kCtime,
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        kMtime,
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        kClientTag,
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        false,
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        specifics);
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(entity->IsCommitPending());
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Start with a pending commit.  Clobber it with an incoming update.
125116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EntityTrackerTest, UpdateClobbersCommit) {
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<EntityTracker> entity(
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EntityTracker::FromCommitRequest(kServerId,
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kClientTagHash,
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       22,
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       33,
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kCtime,
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kMtime,
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kClientTag,
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       false,
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       specifics));
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(entity->IsCommitPending());
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  entity->ReceiveUpdate(400);  // Version 400 > 33.
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(entity->IsCommitPending());
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Start with a pending commit.  Send it a reflected update that
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// will not override the in-progress commit.
145116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EntityTrackerTest, ReflectedUpdateDoesntClobberCommit) {
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<EntityTracker> entity(
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EntityTracker::FromCommitRequest(kServerId,
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kClientTagHash,
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       22,
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       33,
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kCtime,
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kMtime,
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       kClientTag,
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       false,
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       specifics));
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(entity->IsCommitPending());
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  entity->ReceiveUpdate(33);  // Version 33 == 33.
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(entity->IsCommitPending());
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace syncer
164