Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(408)

Side by Side Diff: components/sync/engine_impl/uss_migrator_unittest.cc

Issue 2442583003: [Sync] Start implementation of migration for USS. (Closed)
Patch Set: Rebase. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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 "components/sync/engine_impl/uss_migrator.h"
6
7 #include <memory>
8 #include <string>
9 #include <utility>
10
11 #include "base/memory/ptr_util.h"
12 #include "base/message_loop/message_loop.h"
13 #include "base/time/time.h"
14 #include "components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter .h"
15 #include "components/sync/engine_impl/model_type_worker.h"
16 #include "components/sync/engine_impl/test_entry_factory.h"
17 #include "components/sync/protocol/model_type_state.pb.h"
18 #include "components/sync/syncable/directory.h"
19 #include "components/sync/syncable/read_node.h"
20 #include "components/sync/syncable/read_transaction.h"
21 #include "components/sync/syncable/syncable_util.h"
22 #include "components/sync/syncable/test_user_share.h"
23 #include "components/sync/test/engine/mock_model_type_processor.h"
24 #include "components/sync/test/engine/mock_nudge_handler.h"
25 #include "testing/gtest/include/gtest/gtest.h"
26
27 namespace syncer {
28
29 namespace {
30
31 const ModelType kModelType = PREFERENCES;
32
33 std::string GenerateTagHash(const std::string& tag) {
34 return syncable::GenerateSyncableHash(kModelType, tag);
35 }
36
37 const char kToken1[] = "token1";
38 const char kTag1[] = "tag1";
39 const char kTag2[] = "tag2";
40 const char kTag3[] = "tag3";
41 const char kValue1[] = "value1";
42 const char kValue2[] = "value2";
43 const char kValue3[] = "value3";
44 const std::string kHash1(GenerateTagHash(kTag1));
45
46 sync_pb::EntitySpecifics GenerateSpecifics(const std::string& tag,
47 const std::string& value) {
48 sync_pb::EntitySpecifics specifics;
49 specifics.mutable_preference()->set_name(tag);
50 specifics.mutable_preference()->set_value(value);
51 return specifics;
52 }
53
54 } // namespace
55
56 class UssMigratorTest : public ::testing::Test {
57 public:
58 UssMigratorTest() : debug_emitter_(kModelType, &debug_observers_) {
59 test_user_share_.SetUp();
60 entry_factory_ = base::MakeUnique<TestEntryFactory>(directory());
61
62 auto processor = base::MakeUnique<MockModelTypeProcessor>();
63 processor_ = processor.get();
64 worker_ = base::MakeUnique<ModelTypeWorker>(
65 kModelType, sync_pb::ModelTypeState(), false, nullptr, &nudge_handler_,
66 std::move(processor), &debug_emitter_);
67 }
68
69 ~UssMigratorTest() override { test_user_share_.TearDown(); }
70
71 void SetProgressMarkerToken(const std::string& token) {
72 sync_pb::DataTypeProgressMarker progress_marker;
73 progress_marker.set_token(token);
74 directory()->SetDownloadProgress(kModelType, progress_marker);
75 }
76
77 void CreateTypeRoot() { entry_factory_->CreateTypeRootNode(kModelType); }
78
79 int64_t InsertEntity(const std::string& key, const std::string& value) {
80 const sync_pb::EntitySpecifics specifics = GenerateSpecifics(key, value);
81 return entry_factory_->CreateSyncedItem(key, kModelType, false, specifics);
82 }
83
84 base::Time GetCtimeForEntity(int64_t metahandle) {
85 ReadTransaction trans(FROM_HERE, user_share());
86 ReadNode read_node(&trans);
87 auto result = read_node.InitByIdLookup(metahandle);
88 DCHECK_EQ(BaseNode::INIT_OK, result);
89 return read_node.GetEntry()->GetServerCtime();
90 }
91
92 UserShare* user_share() { return test_user_share_.user_share(); }
93 MockNudgeHandler* nudge_handler() { return &nudge_handler_; }
94 ModelTypeWorker* worker() { return worker_.get(); }
95 MockModelTypeProcessor* processor() { return processor_; }
96
97 private:
98 syncable::Directory* directory() { return user_share()->directory.get(); }
99
100 base::MessageLoop message_loop_;
pavely 2016/10/27 23:20:19 I don't think you need message loop.
maxbogue 2016/10/28 16:17:41 Sadly, I do: http://pastebin.com/raw/3twtnzck
pavely 2016/10/28 17:26:58 Got it.
101 TestUserShare test_user_share_;
102 std::unique_ptr<TestEntryFactory> entry_factory_;
103 MockNudgeHandler nudge_handler_;
104 base::ObserverList<TypeDebugInfoObserver> debug_observers_;
105 NonBlockingTypeDebugInfoEmitter debug_emitter_;
106 MockModelTypeProcessor* processor_ = nullptr;
107 std::unique_ptr<ModelTypeWorker> worker_;
108 };
109
110 TEST_F(UssMigratorTest, Migrate) {
111 CreateTypeRoot();
112 SetProgressMarkerToken(kToken1);
113 int64_t metahandle = InsertEntity(kTag1, kValue1);
114 base::Time ctime = GetCtimeForEntity(metahandle);
115
116 ASSERT_TRUE(MigrateDirectoryData(kModelType, user_share(), worker()));
117
118 // No nudge should happen in the happy case.
119 EXPECT_EQ(0, nudge_handler()->GetNumInitialDownloadNudges());
120 // One update with one entity in it.
121 EXPECT_EQ(1U, processor()->GetNumUpdateResponses());
122 EXPECT_EQ(1U, processor()->GetNthUpdateResponse(0).size());
123
124 const sync_pb::ModelTypeState& state = processor()->GetNthUpdateState(0);
125 EXPECT_EQ(kToken1, state.progress_marker().token());
126
127 UpdateResponseData update = processor()->GetNthUpdateResponse(0).at(0);
128 const EntityData& entity = update.entity.value();
129
130 EXPECT_FALSE(entity.id.empty());
131 EXPECT_EQ(kHash1, entity.client_tag_hash);
132 EXPECT_EQ(1, update.response_version);
133 EXPECT_EQ(ctime, entity.creation_time);
134 EXPECT_EQ(ctime, entity.modification_time);
135 EXPECT_EQ(kTag1, entity.non_unique_name);
136 EXPECT_FALSE(entity.is_deleted());
137 EXPECT_EQ(kTag1, entity.specifics.preference().name());
138 EXPECT_EQ(kValue1, entity.specifics.preference().value());
139 }
140
141 TEST_F(UssMigratorTest, MigrateMultiple) {
142 CreateTypeRoot();
143 SetProgressMarkerToken(kToken1);
144 InsertEntity(kTag1, kValue1);
145 InsertEntity(kTag2, kValue2);
146 InsertEntity(kTag3, kValue3);
147
148 ASSERT_TRUE(MigrateDirectoryData(kModelType, user_share(), worker()));
149
150 EXPECT_EQ(1U, processor()->GetNumUpdateResponses());
151 EXPECT_EQ(3U, processor()->GetNthUpdateResponse(0).size());
152
153 UpdateResponseDataList updates = processor()->GetNthUpdateResponse(0);
154 EXPECT_EQ(kTag1, updates.at(0).entity.value().specifics.preference().name());
155 EXPECT_EQ(kTag2, updates.at(1).entity.value().specifics.preference().name());
156 EXPECT_EQ(kTag3, updates.at(2).entity.value().specifics.preference().name());
157 }
158
159 TEST_F(UssMigratorTest, MigrateMultipleBatches) {
160 CreateTypeRoot();
161 SetProgressMarkerToken(kToken1);
162 InsertEntity(kTag1, kValue1);
163 InsertEntity(kTag2, kValue2);
164 InsertEntity(kTag3, kValue3);
165
166 ASSERT_TRUE(
167 MigrateDirectoryDataWithBatchSize(kModelType, user_share(), worker(), 2));
168
169 EXPECT_EQ(1U, processor()->GetNumUpdateResponses());
170 EXPECT_EQ(3U, processor()->GetNthUpdateResponse(0).size());
171
172 UpdateResponseDataList updates = processor()->GetNthUpdateResponse(0);
173 EXPECT_EQ(kTag1, updates.at(0).entity.value().specifics.preference().name());
174 EXPECT_EQ(kTag2, updates.at(1).entity.value().specifics.preference().name());
175 EXPECT_EQ(kTag3, updates.at(2).entity.value().specifics.preference().name());
176 }
177
178 TEST_F(UssMigratorTest, MigrateZero) {
179 CreateTypeRoot();
180 SetProgressMarkerToken(kToken1);
181
182 ASSERT_TRUE(MigrateDirectoryData(kModelType, user_share(), worker()));
183
184 EXPECT_EQ(0, nudge_handler()->GetNumInitialDownloadNudges());
185 EXPECT_EQ(1U, processor()->GetNumUpdateResponses());
186 EXPECT_EQ(0U, processor()->GetNthUpdateResponse(0).size());
187 }
188
189 TEST_F(UssMigratorTest, MissingTypeRoot) {
190 EXPECT_EQ(0, nudge_handler()->GetNumInitialDownloadNudges());
191 ASSERT_FALSE(MigrateDirectoryData(kModelType, user_share(), worker()));
192 EXPECT_EQ(1, nudge_handler()->GetNumInitialDownloadNudges());
193 EXPECT_EQ(0U, processor()->GetNumUpdateResponses());
194 }
195
196 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698