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

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: rebase 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;
98 73
99 SyncEvent(const std::string& description, 74 SyncEvent(const std::string& description,
100 base::Closure callback) 75 base::Closure callback)
101 : description(description), 76 : description(description),
102 callback(callback) { 77 callback(callback) {
103 } 78 }
104 }; 79 };
105 80
81 struct SyncEventComparator {
82 bool operator()(const SyncEvent& left, const SyncEvent& right) {
83 return left.description < right.description;
84 }
85 };
kinuko 2013/02/28 13:58:30 Not used?
tzik 2013/02/28 14:00:38 Done.
86
106 SyncEvent CreateRemoteFileAddOrUpdateEvent(const std::string& title) { 87 SyncEvent CreateRemoteFileAddOrUpdateEvent(const std::string& title) {
107 return SyncEvent( 88 return SyncEvent(
108 "SyncEvent: Add or Update remote file [" + title + "]", 89 "SyncEvent: Add or Update remote file [" + title + "]",
109 base::Bind(&DriveFileSyncServiceSyncTest::AddOrUpdateResource, 90 base::Bind(&DriveFileSyncServiceSyncTest::AddOrUpdateResource,
110 base::Unretained(this), title)); 91 base::Unretained(this), title));
111 } 92 }
112 93
113 SyncEvent CreateRemoteFileDeleteEvent(const std::string& title) { 94 SyncEvent CreateRemoteFileDeleteEvent(const std::string& title) {
114 return SyncEvent( 95 return SyncEvent(
115 "SyncEvent: Delete remote file [" + title + "]", 96 "SyncEvent: Delete remote file [" + title + "]",
116 base::Bind(&DriveFileSyncServiceSyncTest::DeleteResource, 97 base::Bind(&DriveFileSyncServiceSyncTest::DeleteResource,
117 base::Unretained(this), title)); 98 base::Unretained(this), title));
118 } 99 }
119 100
101 SyncEvent CreateRelaunchEvent() {
102 return SyncEvent(
103 "SyncEvent: Relaunch service",
104 base::Bind(&DriveFileSyncServiceSyncTest::RelaunchService,
105 base::Unretained(this)));
106 }
107
120 SyncEvent CreateFetchEvent() { 108 SyncEvent CreateFetchEvent() {
121 return SyncEvent( 109 return SyncEvent(
122 "SyncEvent: Fetch remote changes", 110 "SyncEvent: Fetch remote changes",
123 base::Bind(&DriveFileSyncServiceSyncTest::FetchRemoteChange, 111 base::Bind(&DriveFileSyncServiceSyncTest::FetchRemoteChange,
124 base::Unretained(this))); 112 base::Unretained(this)));
125 } 113 }
126 114
127 SyncEvent CreateProcessRemoteChangeEvent() { 115 SyncEvent CreateProcessRemoteChangeEvent() {
128 return SyncEvent( 116 return SyncEvent(
129 "SyncEvent: Process remote change", 117 "SyncEvent: Process remote change",
130 base::Bind( 118 base::Bind(
131 base::IgnoreResult( 119 base::IgnoreResult(
132 &DriveFileSyncServiceSyncTest::ProcessRemoteChange), 120 &DriveFileSyncServiceSyncTest::ProcessRemoteChange),
133 base::Unretained(this))); 121 base::Unretained(this)));
134 } 122 }
135 123
136 template <size_t array_size> 124 template <size_t array_size>
137 std::vector<SyncEvent> CreateTestCase(const SyncEvent (&events)[array_size]) { 125 std::vector<SyncEvent> CreateTestCase(const SyncEvent (&events)[array_size]) {
138 return std::vector<SyncEvent>(events, events + array_size); 126 return std::vector<SyncEvent>(events, events + array_size);
139 } 127 }
140 128
141 void ShuffleTestCase(std::vector<SyncEvent>* events) { 129 void ShuffleTestCase(std::vector<SyncEvent>* events) {
142 std::random_shuffle(events->begin(), events->end(), base::RandGenerator); 130 std::random_shuffle(events->begin(), events->end(), base::RandGenerator);
143 } 131 }
144 132
145 void RunTest(const std::vector<SyncEvent>& events) { 133 void RunTest(const std::vector<SyncEvent>& events) {
134 SetUpForTestCase();
135
146 typedef std::vector<SyncEvent>::const_iterator iterator; 136 typedef std::vector<SyncEvent>::const_iterator iterator;
147 std::ostringstream out; 137 std::ostringstream out;
138 out << '\n';
148 for (iterator itr = events.begin(); itr != events.end(); ++itr) 139 for (iterator itr = events.begin(); itr != events.end(); ++itr)
149 out << itr->description << '\n'; 140 out << itr->description << '\n';
150 SCOPED_TRACE(out.str()); 141 SCOPED_TRACE(out.str());
151 142
152 for (iterator itr = events.begin(); itr != events.end(); ++itr) 143 for (iterator itr = events.begin(); itr != events.end(); ++itr)
153 itr->callback.Run(); 144 itr->callback.Run();
154 145
155 FetchRemoteChange(); 146 FetchRemoteChange();
156 while (ProcessRemoteChange()) {} 147 while (ProcessRemoteChange()) {}
157 148
158 VerifyResult(); 149 VerifyResult();
150 TearDownForTestCase();
159 } 151 }
160 152
161 private: 153 private:
154 void SetUpForTestCase() {
155 ASSERT_TRUE(base_dir_.CreateUniqueTempDir());
156
157 fake_sync_client_ = new FakeDriveFileSyncClient;
158 fake_remote_processor_.reset(new FakeRemoteChangeProcessor);
159
160 metadata_store_ = new DriveMetadataStore(
161 base_dir_.path(),
162 base::MessageLoopProxy::current());
163
164 bool done = false;
165 metadata_store_->Initialize(base::Bind(&DidInitialize, &done));
166 message_loop_.RunUntilIdle();
167 EXPECT_TRUE(done);
168
169 metadata_store_->SetSyncRootDirectory(kSyncRootResourceId);
170 metadata_store_->AddBatchSyncOrigin(GURL(kAppOrigin), kParentResourceId);
171 metadata_store_->MoveBatchSyncOriginToIncremental(GURL(kAppOrigin));
172
173 sync_service_ = DriveFileSyncService::CreateForTesting(
174 &profile_,
175 base_dir_.path(),
176 scoped_ptr<DriveFileSyncClientInterface>(fake_sync_client_),
177 scoped_ptr<DriveMetadataStore>(metadata_store_)).Pass();
178 }
179
180 void TearDownForTestCase() {
181 metadata_store_ = NULL;
182 fake_sync_client_ = NULL;
183 sync_service_.reset();
184 fake_remote_processor_.reset();
185 ASSERT_TRUE(base_dir_.Delete());
186 }
187
162 void AddOrUpdateResource(const std::string& title) { 188 void AddOrUpdateResource(const std::string& title) {
163 typedef ResourceIdByTitle::iterator iterator; 189 typedef ResourceIdByTitle::iterator iterator;
164 std::pair<iterator, bool> inserted = 190 std::pair<iterator, bool> inserted =
165 resources_.insert(std::make_pair(title, std::string())); 191 resources_.insert(std::make_pair(title, std::string()));
166 if (inserted.second) 192 if (inserted.second)
167 inserted.first->second = StringPrintf("%" PRId64, ++resource_count_); 193 inserted.first->second = StringPrintf("%" PRId64, ++resource_count_);
168 std::string resource_id = inserted.first->second; 194 std::string resource_id = inserted.first->second;
169 195
170 fake_sync_client_->PushRemoteChange( 196 fake_sync_client_->PushRemoteChange(
171 kParentResourceId, kAppId, title, resource_id, 197 kParentResourceId, kAppId, title, resource_id,
172 StringPrintf("%" PRIx64, base::RandUint64()), 198 StringPrintf("%" PRIx64, base::RandUint64()),
173 false /* deleted */); 199 false /* deleted */);
174 message_loop_.RunUntilIdle(); 200 message_loop_.RunUntilIdle();
175 } 201 }
176 202
177 void DeleteResource(const std::string& title) { 203 void DeleteResource(const std::string& title) {
178 ResourceIdByTitle::iterator found = resources_.find(title); 204 ResourceIdByTitle::iterator found = resources_.find(title);
179 if (found == resources_.end()) 205 if (found == resources_.end())
180 return; 206 return;
181 std::string resource_id = found->second; 207 std::string resource_id = found->second;
182 resources_.erase(found); 208 resources_.erase(found);
183 fake_sync_client_->PushRemoteChange( 209 fake_sync_client_->PushRemoteChange(
184 kParentResourceId, kAppId, 210 kParentResourceId, kAppId,
185 title, resource_id, std::string(), true /* deleted */); 211 title, resource_id, std::string(), true /* deleted */);
186 message_loop_.RunUntilIdle(); 212 message_loop_.RunUntilIdle();
187 } 213 }
188 214
215 void RelaunchService() {
216 metadata_store_ = NULL;
217 scoped_ptr<DriveFileSyncClientInterface> sync_client =
218 DriveFileSyncService::DestroyAndPassSyncClientForTesting(
219 sync_service_.Pass());
220 message_loop_.RunUntilIdle();
221
222 metadata_store_ = new DriveMetadataStore(
223 base_dir_.path(),
224 base::MessageLoopProxy::current());
225
226 bool done = false;
227 metadata_store_->Initialize(base::Bind(&DidInitialize, &done));
228 message_loop_.RunUntilIdle();
229 EXPECT_TRUE(done);
230
231 sync_service_ = DriveFileSyncService::CreateForTesting(
232 &profile_,
233 base_dir_.path(),
234 sync_client.Pass(),
235 scoped_ptr<DriveMetadataStore>(metadata_store_)).Pass();
236 }
237
189 void FetchRemoteChange() { 238 void FetchRemoteChange() {
190 sync_service_->may_have_unfetched_changes_ = true; 239 sync_service_->may_have_unfetched_changes_ = true;
191 sync_service_->MaybeStartFetchChanges(); 240 sync_service_->MaybeStartFetchChanges();
192 message_loop_.RunUntilIdle(); 241 message_loop_.RunUntilIdle();
193 } 242 }
194 243
195 bool ProcessRemoteChange() { 244 bool ProcessRemoteChange() {
196 bool done = false; 245 bool done = false;
197 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 246 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
198 sync_service_->ProcessRemoteChange( 247 sync_service_->ProcessRemoteChange(
199 fake_remote_processor_.get(), 248 fake_remote_processor_.get(),
200 base::Bind(&DidProcessRemoteChange, &done, &status)); 249 base::Bind(&DidProcessRemoteChange, &done, &status));
201 message_loop_.RunUntilIdle(); 250 message_loop_.RunUntilIdle();
202 EXPECT_TRUE(done); 251 EXPECT_TRUE(done);
203 return status == SYNC_STATUS_OK; 252 return status != SYNC_STATUS_NO_CHANGE_TO_SYNC;
204 } 253 }
205 254
206 255
207 void VerifyResult() { 256 void VerifyResult() {
208 typedef FakeDriveFileSyncClient::RemoteResourceByResourceId 257 typedef FakeDriveFileSyncClient::RemoteResourceByResourceId
209 RemoteResourceMap; 258 RemoteResourceMap;
210 typedef FakeDriveFileSyncClient::RemoteResource RemoteResource; 259 typedef FakeDriveFileSyncClient::RemoteResource RemoteResource;
211 typedef FakeRemoteChangeProcessor::URLToFileChangesMap 260 typedef FakeRemoteChangeProcessor::URLToFileChangesMap
212 AppliedRemoteChangeMap; 261 AppliedRemoteChangeMap;
213 262
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 } 306 }
258 } 307 }
259 308
260 MessageLoop message_loop_; 309 MessageLoop message_loop_;
261 content::TestBrowserThread ui_thread_; 310 content::TestBrowserThread ui_thread_;
262 content::TestBrowserThread file_thread_; 311 content::TestBrowserThread file_thread_;
263 312
264 TestingProfile profile_; 313 TestingProfile profile_;
265 base::ScopedTempDir base_dir_; 314 base::ScopedTempDir base_dir_;
266 315
267 FakeDriveFileSyncClient* fake_sync_client_; 316 FakeDriveFileSyncClient* fake_sync_client_; // Owned by |sync_service_|.
268 scoped_ptr<FakeRemoteChangeProcessor> fake_remote_processor_; 317 scoped_ptr<FakeRemoteChangeProcessor> fake_remote_processor_;
269 DriveMetadataStore* metadata_store_; 318 DriveMetadataStore* metadata_store_; // Owned by |sync_service_|.
270 319
271 scoped_ptr<DriveFileSyncService> sync_service_; 320 scoped_ptr<DriveFileSyncService> sync_service_;
272 321
273 typedef std::map<std::string, std::string> ResourceIdByTitle; 322 typedef std::map<std::string, std::string> ResourceIdByTitle;
274 ResourceIdByTitle resources_; 323 ResourceIdByTitle resources_;
275 int64 resource_count_; 324 int64 resource_count_;
276 325
277 DISALLOW_COPY_AND_ASSIGN(DriveFileSyncServiceSyncTest); 326 DISALLOW_COPY_AND_ASSIGN(DriveFileSyncServiceSyncTest);
278 }; 327 };
279 328
280 TEST_F(DriveFileSyncServiceSyncTest, AddFileTest) { 329 TEST_F(DriveFileSyncServiceSyncTest, AddFileTest) {
281 std::string kFile1 = "file title 1"; 330 std::string kFile1 = "file title 1";
282 SyncEvent sync_event[] = { 331 SyncEvent sync_event[] = {
283 CreateRemoteFileAddOrUpdateEvent(kFile1), 332 CreateRemoteFileAddOrUpdateEvent(kFile1),
284 }; 333 };
285 334
286 RunTest(CreateTestCase(sync_event)); 335 RunTest(CreateTestCase(sync_event));
287 } 336 }
288 337
289 TEST_F(DriveFileSyncServiceSyncTest, UpdateFileTest) { 338 TEST_F(DriveFileSyncServiceSyncTest, UpdateFileTest) {
290 std::string kFile1 = "file title 1"; 339 std::string kFile1 = "file title 1";
291 SyncEvent sync_event[] = { 340 SyncEvent sync_event[] = {
292 CreateRemoteFileAddOrUpdateEvent(kFile1), 341 CreateRemoteFileAddOrUpdateEvent(kFile1),
293 CreateRemoteFileAddOrUpdateEvent(kFile1), 342 CreateRemoteFileAddOrUpdateEvent(kFile1),
294 }; 343 };
295 344
296 RunTest(CreateTestCase(sync_event)); 345 RunTest(CreateTestCase(sync_event));
297 } 346 }
298 347
299
300 TEST_F(DriveFileSyncServiceSyncTest, DeleteFileTest) { 348 TEST_F(DriveFileSyncServiceSyncTest, DeleteFileTest) {
301 std::string kFile1 = "file title 1"; 349 std::string kFile1 = "file title 1";
302 SyncEvent sync_event[] = { 350 SyncEvent sync_event[] = {
303 CreateRemoteFileAddOrUpdateEvent(kFile1), 351 CreateRemoteFileAddOrUpdateEvent(kFile1),
352 CreateFetchEvent(),
353 CreateProcessRemoteChangeEvent(),
304 CreateRemoteFileDeleteEvent(kFile1), 354 CreateRemoteFileDeleteEvent(kFile1),
305 }; 355 };
306 356
307 RunTest(CreateTestCase(sync_event)); 357 RunTest(CreateTestCase(sync_event));
308 } 358 }
309 359
360 TEST_F(DriveFileSyncServiceSyncTest, RelaunchTest) {
361 SyncEvent sync_event[] = {
362 CreateRelaunchEvent(),
363 };
364
365 RunTest(CreateTestCase(sync_event));
366 }
367
368 TEST_F(DriveFileSyncServiceSyncTest, SquashedFileAddTest) {
369 std::string kFile1 = "file title 1";
370 SyncEvent sync_event[] = {
371 CreateRemoteFileAddOrUpdateEvent(kFile1),
372 CreateFetchEvent(),
373 CreateRemoteFileDeleteEvent(kFile1),
374 };
375 RunTest(CreateTestCase(sync_event));
376 }
377
310 } // namespace sync_file_system 378 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698