OLD | NEW |
---|---|
(Empty) | |
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/engine/model_thread_sync_entity.h" | |
6 | |
7 #include "base/memory/scoped_ptr.h" | |
8 #include "base/time/time.h" | |
9 #include "sync/internal_api/public/base/model_type.h" | |
10 #include "sync/protocol/sync.pb.h" | |
11 #include "sync/syncable/syncable_util.h" | |
12 | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 namespace syncer { | |
16 | |
17 // Some simple sanity tests for the ModelThreadSyncEntity. | |
18 // | |
19 // A lot of the more complicated sync logic is implemented in the | |
20 // NonBlockingTypeProcessor that owns the ModelThreadSyncEntity. We | |
21 // can't unit test it here. | |
22 // | |
23 // Instead, we focus on simple tests to make sure that variables are getting | |
rlarocque
2014/05/13 23:20:29
It's debatable whether or not these tests should e
| |
24 // properly intialized and flags properly set. Anything more complicated would | |
25 // be a redundant and incomplete version of the NonBlockingTypeProcessor tests. | |
26 class ModelThreadSyncEntityTest : public ::testing::Test { | |
27 public: | |
28 ModelThreadSyncEntityTest() | |
29 : kServerId("ServerID"), | |
30 kClientTag("sample.pref.name"), | |
31 kClientTagHash(syncable::GenerateSyncableHash(PREFERENCES, kClientTag)), | |
32 kCtime(base::Time::UnixEpoch() + base::TimeDelta::FromDays(10)), | |
33 kMtime(base::Time::UnixEpoch() + base::TimeDelta::FromDays(20)) { | |
34 sync_pb::PreferenceSpecifics* pref_specifics = | |
35 specifics.mutable_preference(); | |
36 pref_specifics->set_name(kClientTag); | |
37 pref_specifics->set_value("pref.value"); | |
38 } | |
39 | |
40 const std::string kServerId; | |
41 const std::string kClientTag; | |
42 const std::string kClientTagHash; | |
43 const base::Time kCtime; | |
44 const base::Time kMtime; | |
45 sync_pb::EntitySpecifics specifics; | |
46 }; | |
47 | |
48 TEST_F(ModelThreadSyncEntityTest, NewLocalItem) { | |
49 scoped_ptr<ModelThreadSyncEntity> entity( | |
50 ModelThreadSyncEntity::NewLocalItem("asdf", specifics, kCtime)); | |
51 | |
52 EXPECT_TRUE(entity->IsWriteRequired()); | |
53 EXPECT_TRUE(entity->IsUnsynced()); | |
54 EXPECT_FALSE(entity->UpdateIsReflection(1)); | |
55 EXPECT_TRUE(entity->UpdateIsInConflict(1)); | |
56 } | |
57 | |
58 TEST_F(ModelThreadSyncEntityTest, FromServerUpdate) { | |
59 scoped_ptr<ModelThreadSyncEntity> entity( | |
60 ModelThreadSyncEntity::FromServerUpdate( | |
61 kServerId, | |
62 kClientTagHash, | |
63 kClientTag, // As non-unique name. | |
64 10, | |
65 specifics, | |
66 false, | |
67 kCtime, | |
68 kMtime)); | |
69 | |
70 EXPECT_TRUE(entity->IsWriteRequired()); | |
71 EXPECT_FALSE(entity->IsUnsynced()); | |
72 EXPECT_TRUE(entity->UpdateIsReflection(9)); | |
73 EXPECT_TRUE(entity->UpdateIsReflection(10)); | |
74 EXPECT_FALSE(entity->UpdateIsReflection(11)); | |
75 EXPECT_FALSE(entity->UpdateIsInConflict(11)); | |
76 } | |
77 | |
78 // Tombstones should behave just like regular updates. Mostly. The strangest | |
79 // thing about them is that they don't have specifics, so it can be hard to | |
80 // detect their type. Fortunately, this class doesn't care about types in | |
81 // received updates. | |
82 TEST_F(ModelThreadSyncEntityTest, TombstoneUpdate) { | |
83 scoped_ptr<ModelThreadSyncEntity> entity( | |
84 ModelThreadSyncEntity::FromServerUpdate( | |
85 kServerId, | |
86 kClientTagHash, | |
87 kClientTag, // As non-unique name. | |
88 10, | |
89 sync_pb::EntitySpecifics(), | |
90 true, | |
91 kCtime, | |
92 kMtime)); | |
93 | |
94 EXPECT_TRUE(entity->IsWriteRequired()); | |
95 EXPECT_FALSE(entity->IsUnsynced()); | |
96 EXPECT_TRUE(entity->UpdateIsReflection(9)); | |
97 EXPECT_TRUE(entity->UpdateIsReflection(10)); | |
98 EXPECT_FALSE(entity->UpdateIsReflection(11)); | |
99 EXPECT_FALSE(entity->UpdateIsInConflict(11)); | |
100 } | |
101 | |
102 // Apply a deletion update. | |
103 TEST_F(ModelThreadSyncEntityTest, ApplyUpdate) { | |
104 scoped_ptr<ModelThreadSyncEntity> entity( | |
105 ModelThreadSyncEntity::FromServerUpdate( | |
106 kServerId, | |
107 kClientTagHash, | |
108 kClientTag, // As non-unique name. | |
109 10, | |
110 specifics, | |
111 false, | |
112 kCtime, | |
113 kMtime)); | |
114 | |
115 // A deletion update one version later. | |
116 entity->ApplyUpdateFromServer(11, | |
117 true, | |
118 sync_pb::EntitySpecifics(), | |
119 kMtime + base::TimeDelta::FromSeconds(10)); | |
120 | |
121 EXPECT_TRUE(entity->IsWriteRequired()); | |
122 EXPECT_FALSE(entity->IsUnsynced()); | |
123 EXPECT_TRUE(entity->UpdateIsReflection(11)); | |
124 EXPECT_FALSE(entity->UpdateIsReflection(12)); | |
125 } | |
126 | |
127 TEST_F(ModelThreadSyncEntityTest, LocalChange) { | |
128 scoped_ptr<ModelThreadSyncEntity> entity( | |
129 ModelThreadSyncEntity::FromServerUpdate( | |
130 kServerId, | |
131 kClientTagHash, | |
132 kClientTag, // As non-unique name. | |
133 10, | |
134 specifics, | |
135 false, | |
136 kCtime, | |
137 kMtime)); | |
138 | |
139 sync_pb::EntitySpecifics specifics2; | |
140 specifics2.CopyFrom(specifics); | |
141 specifics2.mutable_preference()->set_value("new.pref.value"); | |
142 | |
143 entity->MakeLocalChange(kClientTag, specifics2); | |
144 EXPECT_TRUE(entity->IsWriteRequired()); | |
145 EXPECT_TRUE(entity->IsUnsynced()); | |
146 | |
147 EXPECT_TRUE(entity->UpdateIsReflection(10)); | |
148 EXPECT_FALSE(entity->UpdateIsInConflict(10)); | |
149 | |
150 EXPECT_FALSE(entity->UpdateIsReflection(11)); | |
151 EXPECT_TRUE(entity->UpdateIsInConflict(11)); | |
152 } | |
153 | |
154 TEST_F(ModelThreadSyncEntityTest, LocalDeletion) { | |
155 scoped_ptr<ModelThreadSyncEntity> entity( | |
156 ModelThreadSyncEntity::FromServerUpdate( | |
157 kServerId, | |
158 kClientTagHash, | |
159 kClientTag, // As non-unique name. | |
160 10, | |
161 specifics, | |
162 false, | |
163 kCtime, | |
164 kMtime)); | |
165 | |
166 entity->Delete(kClientTag); | |
167 | |
168 EXPECT_TRUE(entity->IsWriteRequired()); | |
169 EXPECT_TRUE(entity->IsUnsynced()); | |
170 | |
171 EXPECT_TRUE(entity->UpdateIsReflection(10)); | |
172 EXPECT_FALSE(entity->UpdateIsInConflict(10)); | |
173 | |
174 EXPECT_FALSE(entity->UpdateIsReflection(11)); | |
175 EXPECT_TRUE(entity->UpdateIsInConflict(11)); | |
176 } | |
177 | |
178 } // namespace syncer | |
OLD | NEW |