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

Side by Side Diff: chrome/browser/sync_file_system/drive_file_sync_service_sync_unittest.cc

Issue 12391012: Sync FileSystem: Add simulated relaunch of DriveFileSyncService on its unit_tests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove unused comparator Created 7 years, 9 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync_file_system/drive_file_sync_service.h" 5 #include "chrome/browser/sync_file_system/drive_file_sync_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 13 matching lines...) Expand all
24 24
25 namespace { 25 namespace {
26 26
27 const char kSyncRootResourceId[] = "sync_root_resource_id"; 27 const char kSyncRootResourceId[] = "sync_root_resource_id";
28 const char kParentResourceId[] = "parent_resource_id"; 28 const char kParentResourceId[] = "parent_resource_id";
29 const char kAppId[] = "app-id"; 29 const char kAppId[] = "app-id";
30 const char kAppOrigin[] = "chrome-extension://app-id"; 30 const char kAppOrigin[] = "chrome-extension://app-id";
31 31
32 void DidInitialize(bool* done, SyncStatusCode status, bool created) { 32 void DidInitialize(bool* done, SyncStatusCode status, bool created) {
33 EXPECT_EQ(SYNC_STATUS_OK, status); 33 EXPECT_EQ(SYNC_STATUS_OK, status);
34 EXPECT_TRUE(created);
35 *done = true; 34 *done = true;
36 } 35 }
37 36
38 void DidProcessRemoteChange(bool* done, 37 void DidProcessRemoteChange(bool* done,
39 SyncStatusCode* status_out, 38 SyncStatusCode* status_out,
40 SyncStatusCode status, 39 SyncStatusCode status,
41 const fileapi::FileSystemURL& url) { 40 const fileapi::FileSystemURL& url) {
42 *status_out = status; 41 *status_out = status;
43 *done = true; 42 *done = true;
44 } 43 }
45 44
46 } // namespace 45 } // namespace
47 46
48 class DriveFileSyncServiceSyncTest : public testing::Test { 47 class DriveFileSyncServiceSyncTest : public testing::Test {
49 public: 48 public:
50 DriveFileSyncServiceSyncTest() 49 DriveFileSyncServiceSyncTest()
51 : ui_thread_(content::BrowserThread::UI, &message_loop_), 50 : ui_thread_(content::BrowserThread::UI, &message_loop_),
52 file_thread_(content::BrowserThread::FILE, &message_loop_), 51 file_thread_(content::BrowserThread::FILE, &message_loop_),
53 fake_sync_client_(NULL), 52 fake_sync_client_(NULL),
54 fake_remote_processor_(NULL), 53 fake_remote_processor_(NULL),
55 metadata_store_(NULL), 54 metadata_store_(NULL),
56 resource_count_(0) { 55 resource_count_(0) {
57 } 56 }
58 57
59 virtual ~DriveFileSyncServiceSyncTest() { 58 virtual ~DriveFileSyncServiceSyncTest() {
60 } 59 }
61 60
62 virtual void SetUp() OVERRIDE { 61 virtual void SetUp() OVERRIDE {
63 RegisterSyncableFileSystem(DriveFileSyncService::kServiceName); 62 RegisterSyncableFileSystem(DriveFileSyncService::kServiceName);
64
65 ASSERT_TRUE(base_dir_.CreateUniqueTempDir());
66
67 fake_sync_client_ = new FakeDriveFileSyncClient;
68 fake_remote_processor_.reset(new FakeRemoteChangeProcessor);
69
70 metadata_store_ = new DriveMetadataStore(
71 base_dir_.path(),
72 base::MessageLoopProxy::current());
73
74 bool done = false;
75 metadata_store_->Initialize(base::Bind(&DidInitialize, &done));
76 message_loop_.RunUntilIdle();
77 EXPECT_TRUE(done);
78
79 metadata_store_->SetSyncRootDirectory(kSyncRootResourceId);
80 metadata_store_->AddBatchSyncOrigin(GURL(kAppOrigin), kParentResourceId);
81 metadata_store_->MoveBatchSyncOriginToIncremental(GURL(kAppOrigin));
82
83 sync_service_ = DriveFileSyncService::CreateForTesting(
84 &profile_,
85 base_dir_.path(),
86 scoped_ptr<DriveFileSyncClientInterface>(fake_sync_client_),
87 scoped_ptr<DriveMetadataStore>(metadata_store_)).Pass();
88 } 63 }
89 64
90 virtual void TearDown() OVERRIDE { 65 virtual void TearDown() OVERRIDE {
91 RevokeSyncableFileSystem(DriveFileSyncService::kServiceName); 66 RevokeSyncableFileSystem(DriveFileSyncService::kServiceName);
92 } 67 }
93 68
94 protected: 69 protected:
95 struct SyncEvent { 70 struct SyncEvent {
96 std::string description; 71 std::string description;
97 base::Closure callback; 72 base::Closure callback;
(...skipping 12 matching lines...) Expand all
110 base::Unretained(this), title)); 85 base::Unretained(this), title));
111 } 86 }
112 87
113 SyncEvent CreateRemoteFileDeleteEvent(const std::string& title) { 88 SyncEvent CreateRemoteFileDeleteEvent(const std::string& title) {
114 return SyncEvent( 89 return SyncEvent(
115 "SyncEvent: Delete remote file [" + title + "]", 90 "SyncEvent: Delete remote file [" + title + "]",
116 base::Bind(&DriveFileSyncServiceSyncTest::DeleteResource, 91 base::Bind(&DriveFileSyncServiceSyncTest::DeleteResource,
117 base::Unretained(this), title)); 92 base::Unretained(this), title));
118 } 93 }
119 94
95 SyncEvent CreateRelaunchEvent() {
96 return SyncEvent(
97 "SyncEvent: Relaunch service",
98 base::Bind(&DriveFileSyncServiceSyncTest::RelaunchService,
99 base::Unretained(this)));
100 }
101
120 SyncEvent CreateFetchEvent() { 102 SyncEvent CreateFetchEvent() {
121 return SyncEvent( 103 return SyncEvent(
122 "SyncEvent: Fetch remote changes", 104 "SyncEvent: Fetch remote changes",
123 base::Bind(&DriveFileSyncServiceSyncTest::FetchRemoteChange, 105 base::Bind(&DriveFileSyncServiceSyncTest::FetchRemoteChange,
124 base::Unretained(this))); 106 base::Unretained(this)));
125 } 107 }
126 108
127 SyncEvent CreateProcessRemoteChangeEvent() { 109 SyncEvent CreateProcessRemoteChangeEvent() {
128 return SyncEvent( 110 return SyncEvent(
129 "SyncEvent: Process remote change", 111 "SyncEvent: Process remote change",
130 base::Bind( 112 base::Bind(
131 base::IgnoreResult( 113 base::IgnoreResult(
132 &DriveFileSyncServiceSyncTest::ProcessRemoteChange), 114 &DriveFileSyncServiceSyncTest::ProcessRemoteChange),
133 base::Unretained(this))); 115 base::Unretained(this)));
134 } 116 }
135 117
136 template <size_t array_size> 118 template <size_t array_size>
137 std::vector<SyncEvent> CreateTestCase(const SyncEvent (&events)[array_size]) { 119 std::vector<SyncEvent> CreateTestCase(const SyncEvent (&events)[array_size]) {
138 return std::vector<SyncEvent>(events, events + array_size); 120 return std::vector<SyncEvent>(events, events + array_size);
139 } 121 }
140 122
141 void ShuffleTestCase(std::vector<SyncEvent>* events) { 123 void ShuffleTestCase(std::vector<SyncEvent>* events) {
142 std::random_shuffle(events->begin(), events->end(), base::RandGenerator); 124 std::random_shuffle(events->begin(), events->end(), base::RandGenerator);
143 } 125 }
144 126
145 void RunTest(const std::vector<SyncEvent>& events) { 127 void RunTest(const std::vector<SyncEvent>& events) {
128 SetUpForTestCase();
129
146 typedef std::vector<SyncEvent>::const_iterator iterator; 130 typedef std::vector<SyncEvent>::const_iterator iterator;
147 std::ostringstream out; 131 std::ostringstream out;
132 out << '\n';
148 for (iterator itr = events.begin(); itr != events.end(); ++itr) 133 for (iterator itr = events.begin(); itr != events.end(); ++itr)
149 out << itr->description << '\n'; 134 out << itr->description << '\n';
150 SCOPED_TRACE(out.str()); 135 SCOPED_TRACE(out.str());
151 136
152 for (iterator itr = events.begin(); itr != events.end(); ++itr) 137 for (iterator itr = events.begin(); itr != events.end(); ++itr)
153 itr->callback.Run(); 138 itr->callback.Run();
154 139
155 FetchRemoteChange(); 140 FetchRemoteChange();
156 while (ProcessRemoteChange()) {} 141 while (ProcessRemoteChange()) {}
157 142
158 VerifyResult(); 143 VerifyResult();
144 TearDownForTestCase();
159 } 145 }
160 146
161 private: 147 private:
148 void SetUpForTestCase() {
149 ASSERT_TRUE(base_dir_.CreateUniqueTempDir());
150
151 fake_sync_client_ = new FakeDriveFileSyncClient;
152 fake_remote_processor_.reset(new FakeRemoteChangeProcessor);
153
154 metadata_store_ = new DriveMetadataStore(
155 base_dir_.path(),
156 base::MessageLoopProxy::current());
157
158 bool done = false;
159 metadata_store_->Initialize(base::Bind(&DidInitialize, &done));
160 message_loop_.RunUntilIdle();
161 EXPECT_TRUE(done);
162
163 metadata_store_->SetSyncRootDirectory(kSyncRootResourceId);
164 metadata_store_->AddBatchSyncOrigin(GURL(kAppOrigin), kParentResourceId);
165 metadata_store_->MoveBatchSyncOriginToIncremental(GURL(kAppOrigin));
166
167 sync_service_ = DriveFileSyncService::CreateForTesting(
168 &profile_,
169 base_dir_.path(),
170 scoped_ptr<DriveFileSyncClientInterface>(fake_sync_client_),
171 scoped_ptr<DriveMetadataStore>(metadata_store_)).Pass();
172 }
173
174 void TearDownForTestCase() {
175 metadata_store_ = NULL;
176 fake_sync_client_ = NULL;
177 sync_service_.reset();
178 fake_remote_processor_.reset();
179 ASSERT_TRUE(base_dir_.Delete());
180 }
181
162 void AddOrUpdateResource(const std::string& title) { 182 void AddOrUpdateResource(const std::string& title) {
163 typedef ResourceIdByTitle::iterator iterator; 183 typedef ResourceIdByTitle::iterator iterator;
164 std::pair<iterator, bool> inserted = 184 std::pair<iterator, bool> inserted =
165 resources_.insert(std::make_pair(title, std::string())); 185 resources_.insert(std::make_pair(title, std::string()));
166 if (inserted.second) 186 if (inserted.second)
167 inserted.first->second = StringPrintf("%" PRId64, ++resource_count_); 187 inserted.first->second = StringPrintf("%" PRId64, ++resource_count_);
168 std::string resource_id = inserted.first->second; 188 std::string resource_id = inserted.first->second;
169 189
170 fake_sync_client_->PushRemoteChange( 190 fake_sync_client_->PushRemoteChange(
171 kParentResourceId, kAppId, title, resource_id, 191 kParentResourceId, kAppId, title, resource_id,
172 StringPrintf("%" PRIx64, base::RandUint64()), 192 StringPrintf("%" PRIx64, base::RandUint64()),
173 false /* deleted */); 193 false /* deleted */);
174 message_loop_.RunUntilIdle(); 194 message_loop_.RunUntilIdle();
175 } 195 }
176 196
177 void DeleteResource(const std::string& title) { 197 void DeleteResource(const std::string& title) {
178 ResourceIdByTitle::iterator found = resources_.find(title); 198 ResourceIdByTitle::iterator found = resources_.find(title);
179 if (found == resources_.end()) 199 if (found == resources_.end())
180 return; 200 return;
181 std::string resource_id = found->second; 201 std::string resource_id = found->second;
182 resources_.erase(found); 202 resources_.erase(found);
183 fake_sync_client_->PushRemoteChange( 203 fake_sync_client_->PushRemoteChange(
184 kParentResourceId, kAppId, 204 kParentResourceId, kAppId,
185 title, resource_id, std::string(), true /* deleted */); 205 title, resource_id, std::string(), true /* deleted */);
186 message_loop_.RunUntilIdle(); 206 message_loop_.RunUntilIdle();
187 } 207 }
188 208
209 void RelaunchService() {
210 metadata_store_ = NULL;
211 scoped_ptr<DriveFileSyncClientInterface> sync_client =
212 DriveFileSyncService::DestroyAndPassSyncClientForTesting(
213 sync_service_.Pass());
214 message_loop_.RunUntilIdle();
215
216 metadata_store_ = new DriveMetadataStore(
217 base_dir_.path(),
218 base::MessageLoopProxy::current());
219
220 bool done = false;
221 metadata_store_->Initialize(base::Bind(&DidInitialize, &done));
222 message_loop_.RunUntilIdle();
223 EXPECT_TRUE(done);
224
225 sync_service_ = DriveFileSyncService::CreateForTesting(
226 &profile_,
227 base_dir_.path(),
228 sync_client.Pass(),
229 scoped_ptr<DriveMetadataStore>(metadata_store_)).Pass();
230 }
231
189 void FetchRemoteChange() { 232 void FetchRemoteChange() {
190 sync_service_->may_have_unfetched_changes_ = true; 233 sync_service_->may_have_unfetched_changes_ = true;
191 sync_service_->MaybeStartFetchChanges(); 234 sync_service_->MaybeStartFetchChanges();
192 message_loop_.RunUntilIdle(); 235 message_loop_.RunUntilIdle();
193 } 236 }
194 237
195 bool ProcessRemoteChange() { 238 bool ProcessRemoteChange() {
196 bool done = false; 239 bool done = false;
197 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 240 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
198 sync_service_->ProcessRemoteChange( 241 sync_service_->ProcessRemoteChange(
199 fake_remote_processor_.get(), 242 fake_remote_processor_.get(),
200 base::Bind(&DidProcessRemoteChange, &done, &status)); 243 base::Bind(&DidProcessRemoteChange, &done, &status));
201 message_loop_.RunUntilIdle(); 244 message_loop_.RunUntilIdle();
202 EXPECT_TRUE(done); 245 EXPECT_TRUE(done);
203 return status == SYNC_STATUS_OK; 246 return status != SYNC_STATUS_NO_CHANGE_TO_SYNC;
204 } 247 }
205 248
206 249
207 void VerifyResult() { 250 void VerifyResult() {
208 typedef FakeDriveFileSyncClient::RemoteResourceByResourceId 251 typedef FakeDriveFileSyncClient::RemoteResourceByResourceId
209 RemoteResourceMap; 252 RemoteResourceMap;
210 typedef FakeDriveFileSyncClient::RemoteResource RemoteResource; 253 typedef FakeDriveFileSyncClient::RemoteResource RemoteResource;
211 typedef FakeRemoteChangeProcessor::URLToFileChangesMap 254 typedef FakeRemoteChangeProcessor::URLToFileChangesMap
212 AppliedRemoteChangeMap; 255 AppliedRemoteChangeMap;
213 256
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 } 300 }
258 } 301 }
259 302
260 MessageLoop message_loop_; 303 MessageLoop message_loop_;
261 content::TestBrowserThread ui_thread_; 304 content::TestBrowserThread ui_thread_;
262 content::TestBrowserThread file_thread_; 305 content::TestBrowserThread file_thread_;
263 306
264 TestingProfile profile_; 307 TestingProfile profile_;
265 base::ScopedTempDir base_dir_; 308 base::ScopedTempDir base_dir_;
266 309
267 FakeDriveFileSyncClient* fake_sync_client_; 310 FakeDriveFileSyncClient* fake_sync_client_; // Owned by |sync_service_|.
268 scoped_ptr<FakeRemoteChangeProcessor> fake_remote_processor_; 311 scoped_ptr<FakeRemoteChangeProcessor> fake_remote_processor_;
269 DriveMetadataStore* metadata_store_; 312 DriveMetadataStore* metadata_store_; // Owned by |sync_service_|.
270 313
271 scoped_ptr<DriveFileSyncService> sync_service_; 314 scoped_ptr<DriveFileSyncService> sync_service_;
272 315
273 typedef std::map<std::string, std::string> ResourceIdByTitle; 316 typedef std::map<std::string, std::string> ResourceIdByTitle;
274 ResourceIdByTitle resources_; 317 ResourceIdByTitle resources_;
275 int64 resource_count_; 318 int64 resource_count_;
276 319
277 DISALLOW_COPY_AND_ASSIGN(DriveFileSyncServiceSyncTest); 320 DISALLOW_COPY_AND_ASSIGN(DriveFileSyncServiceSyncTest);
278 }; 321 };
279 322
280 TEST_F(DriveFileSyncServiceSyncTest, AddFileTest) { 323 TEST_F(DriveFileSyncServiceSyncTest, AddFileTest) {
281 std::string kFile1 = "file title 1"; 324 std::string kFile1 = "file title 1";
282 SyncEvent sync_event[] = { 325 SyncEvent sync_event[] = {
283 CreateRemoteFileAddOrUpdateEvent(kFile1), 326 CreateRemoteFileAddOrUpdateEvent(kFile1),
284 }; 327 };
285 328
286 RunTest(CreateTestCase(sync_event)); 329 RunTest(CreateTestCase(sync_event));
287 } 330 }
288 331
289 TEST_F(DriveFileSyncServiceSyncTest, UpdateFileTest) { 332 TEST_F(DriveFileSyncServiceSyncTest, UpdateFileTest) {
290 std::string kFile1 = "file title 1"; 333 std::string kFile1 = "file title 1";
291 SyncEvent sync_event[] = { 334 SyncEvent sync_event[] = {
292 CreateRemoteFileAddOrUpdateEvent(kFile1), 335 CreateRemoteFileAddOrUpdateEvent(kFile1),
293 CreateRemoteFileAddOrUpdateEvent(kFile1), 336 CreateRemoteFileAddOrUpdateEvent(kFile1),
294 }; 337 };
295 338
296 RunTest(CreateTestCase(sync_event)); 339 RunTest(CreateTestCase(sync_event));
297 } 340 }
298 341
299
300 TEST_F(DriveFileSyncServiceSyncTest, DeleteFileTest) { 342 TEST_F(DriveFileSyncServiceSyncTest, DeleteFileTest) {
301 std::string kFile1 = "file title 1"; 343 std::string kFile1 = "file title 1";
302 SyncEvent sync_event[] = { 344 SyncEvent sync_event[] = {
303 CreateRemoteFileAddOrUpdateEvent(kFile1), 345 CreateRemoteFileAddOrUpdateEvent(kFile1),
346 CreateFetchEvent(),
347 CreateProcessRemoteChangeEvent(),
304 CreateRemoteFileDeleteEvent(kFile1), 348 CreateRemoteFileDeleteEvent(kFile1),
305 }; 349 };
306 350
307 RunTest(CreateTestCase(sync_event)); 351 RunTest(CreateTestCase(sync_event));
308 } 352 }
309 353
354 TEST_F(DriveFileSyncServiceSyncTest, RelaunchTest) {
355 SyncEvent sync_event[] = {
356 CreateRelaunchEvent(),
357 };
358
359 RunTest(CreateTestCase(sync_event));
360 }
361
362 TEST_F(DriveFileSyncServiceSyncTest, SquashedFileAddTest) {
363 std::string kFile1 = "file title 1";
364 SyncEvent sync_event[] = {
365 CreateRemoteFileAddOrUpdateEvent(kFile1),
366 CreateFetchEvent(),
367 CreateRemoteFileDeleteEvent(kFile1),
368 };
369 RunTest(CreateTestCase(sync_event));
370 }
371
310 } // namespace sync_file_system 372 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698