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

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: testfix for win7 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 base::ScopedTempDir scoped_base_dir_;
129 ASSERT_TRUE(scoped_base_dir_.CreateUniqueTempDir());
130 base_dir_ = scoped_base_dir_.path();
131
132 SetUpForTestCase();
133
146 typedef std::vector<SyncEvent>::const_iterator iterator; 134 typedef std::vector<SyncEvent>::const_iterator iterator;
147 std::ostringstream out; 135 std::ostringstream out;
136 out << '\n';
148 for (iterator itr = events.begin(); itr != events.end(); ++itr) 137 for (iterator itr = events.begin(); itr != events.end(); ++itr)
149 out << itr->description << '\n'; 138 out << itr->description << '\n';
150 SCOPED_TRACE(out.str()); 139 SCOPED_TRACE(out.str());
151 140
152 for (iterator itr = events.begin(); itr != events.end(); ++itr) 141 for (iterator itr = events.begin(); itr != events.end(); ++itr)
153 itr->callback.Run(); 142 itr->callback.Run();
154 143
155 FetchRemoteChange(); 144 FetchRemoteChange();
156 while (ProcessRemoteChange()) {} 145 while (ProcessRemoteChange()) {}
157 146
158 VerifyResult(); 147 VerifyResult();
148 TearDownForTestCase();
149
150 base_dir_ = base::FilePath();
159 } 151 }
160 152
161 private: 153 private:
154 void SetUpForTestCase() {
155 fake_sync_client_ = new FakeDriveFileSyncClient;
156 fake_remote_processor_.reset(new FakeRemoteChangeProcessor);
157
158 metadata_store_ = new DriveMetadataStore(
159 base_dir_,
160 base::MessageLoopProxy::current());
161
162 bool done = false;
163 metadata_store_->Initialize(base::Bind(&DidInitialize, &done));
164 message_loop_.RunUntilIdle();
165 EXPECT_TRUE(done);
166
167 metadata_store_->SetSyncRootDirectory(kSyncRootResourceId);
168 metadata_store_->AddBatchSyncOrigin(GURL(kAppOrigin), kParentResourceId);
169 metadata_store_->MoveBatchSyncOriginToIncremental(GURL(kAppOrigin));
170
171 sync_service_ = DriveFileSyncService::CreateForTesting(
172 &profile_,
173 base_dir_,
174 scoped_ptr<DriveFileSyncClientInterface>(fake_sync_client_),
175 scoped_ptr<DriveMetadataStore>(metadata_store_)).Pass();
176 }
177
178 void TearDownForTestCase() {
179 metadata_store_ = NULL;
180 fake_sync_client_ = NULL;
181 sync_service_.reset();
182 fake_remote_processor_.reset();
183 }
184
162 void AddOrUpdateResource(const std::string& title) { 185 void AddOrUpdateResource(const std::string& title) {
163 typedef ResourceIdByTitle::iterator iterator; 186 typedef ResourceIdByTitle::iterator iterator;
164 std::pair<iterator, bool> inserted = 187 std::pair<iterator, bool> inserted =
165 resources_.insert(std::make_pair(title, std::string())); 188 resources_.insert(std::make_pair(title, std::string()));
166 if (inserted.second) 189 if (inserted.second)
167 inserted.first->second = StringPrintf("%" PRId64, ++resource_count_); 190 inserted.first->second = StringPrintf("%" PRId64, ++resource_count_);
168 std::string resource_id = inserted.first->second; 191 std::string resource_id = inserted.first->second;
169 192
170 fake_sync_client_->PushRemoteChange( 193 fake_sync_client_->PushRemoteChange(
171 kParentResourceId, kAppId, title, resource_id, 194 kParentResourceId, kAppId, title, resource_id,
172 StringPrintf("%" PRIx64, base::RandUint64()), 195 StringPrintf("%" PRIx64, base::RandUint64()),
173 false /* deleted */); 196 false /* deleted */);
174 message_loop_.RunUntilIdle(); 197 message_loop_.RunUntilIdle();
175 } 198 }
176 199
177 void DeleteResource(const std::string& title) { 200 void DeleteResource(const std::string& title) {
178 ResourceIdByTitle::iterator found = resources_.find(title); 201 ResourceIdByTitle::iterator found = resources_.find(title);
179 if (found == resources_.end()) 202 if (found == resources_.end())
180 return; 203 return;
181 std::string resource_id = found->second; 204 std::string resource_id = found->second;
182 resources_.erase(found); 205 resources_.erase(found);
183 fake_sync_client_->PushRemoteChange( 206 fake_sync_client_->PushRemoteChange(
184 kParentResourceId, kAppId, 207 kParentResourceId, kAppId,
185 title, resource_id, std::string(), true /* deleted */); 208 title, resource_id, std::string(), true /* deleted */);
186 message_loop_.RunUntilIdle(); 209 message_loop_.RunUntilIdle();
187 } 210 }
188 211
212 void RelaunchService() {
213 metadata_store_ = NULL;
214 scoped_ptr<DriveFileSyncClientInterface> sync_client =
215 DriveFileSyncService::DestroyAndPassSyncClientForTesting(
216 sync_service_.Pass());
217 message_loop_.RunUntilIdle();
218
219 metadata_store_ = new DriveMetadataStore(
220 base_dir_,
221 base::MessageLoopProxy::current());
222
223 bool done = false;
224 metadata_store_->Initialize(base::Bind(&DidInitialize, &done));
225 message_loop_.RunUntilIdle();
226 EXPECT_TRUE(done);
227
228 sync_service_ = DriveFileSyncService::CreateForTesting(
229 &profile_,
230 base_dir_,
231 sync_client.Pass(),
232 scoped_ptr<DriveMetadataStore>(metadata_store_)).Pass();
233 }
234
189 void FetchRemoteChange() { 235 void FetchRemoteChange() {
190 sync_service_->may_have_unfetched_changes_ = true; 236 sync_service_->may_have_unfetched_changes_ = true;
191 sync_service_->MaybeStartFetchChanges(); 237 sync_service_->MaybeStartFetchChanges();
192 message_loop_.RunUntilIdle(); 238 message_loop_.RunUntilIdle();
193 } 239 }
194 240
195 bool ProcessRemoteChange() { 241 bool ProcessRemoteChange() {
196 bool done = false; 242 bool done = false;
197 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 243 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
198 sync_service_->ProcessRemoteChange( 244 sync_service_->ProcessRemoteChange(
199 fake_remote_processor_.get(), 245 fake_remote_processor_.get(),
200 base::Bind(&DidProcessRemoteChange, &done, &status)); 246 base::Bind(&DidProcessRemoteChange, &done, &status));
201 message_loop_.RunUntilIdle(); 247 message_loop_.RunUntilIdle();
202 EXPECT_TRUE(done); 248 EXPECT_TRUE(done);
203 return status == SYNC_STATUS_OK; 249 return status != SYNC_STATUS_NO_CHANGE_TO_SYNC;
204 } 250 }
205 251
206 252
207 void VerifyResult() { 253 void VerifyResult() {
208 typedef FakeDriveFileSyncClient::RemoteResourceByResourceId 254 typedef FakeDriveFileSyncClient::RemoteResourceByResourceId
209 RemoteResourceMap; 255 RemoteResourceMap;
210 typedef FakeDriveFileSyncClient::RemoteResource RemoteResource; 256 typedef FakeDriveFileSyncClient::RemoteResource RemoteResource;
211 typedef FakeRemoteChangeProcessor::URLToFileChangesMap 257 typedef FakeRemoteChangeProcessor::URLToFileChangesMap
212 AppliedRemoteChangeMap; 258 AppliedRemoteChangeMap;
213 259
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 else 301 else
256 EXPECT_FALSE(ContainsKey(local_resources, itr->first)); 302 EXPECT_FALSE(ContainsKey(local_resources, itr->first));
257 } 303 }
258 } 304 }
259 305
260 MessageLoop message_loop_; 306 MessageLoop message_loop_;
261 content::TestBrowserThread ui_thread_; 307 content::TestBrowserThread ui_thread_;
262 content::TestBrowserThread file_thread_; 308 content::TestBrowserThread file_thread_;
263 309
264 TestingProfile profile_; 310 TestingProfile profile_;
265 base::ScopedTempDir base_dir_; 311 base::FilePath base_dir_;
266 312
267 FakeDriveFileSyncClient* fake_sync_client_; 313 FakeDriveFileSyncClient* fake_sync_client_; // Owned by |sync_service_|.
268 scoped_ptr<FakeRemoteChangeProcessor> fake_remote_processor_; 314 scoped_ptr<FakeRemoteChangeProcessor> fake_remote_processor_;
269 DriveMetadataStore* metadata_store_; 315 DriveMetadataStore* metadata_store_; // Owned by |sync_service_|.
270 316
271 scoped_ptr<DriveFileSyncService> sync_service_; 317 scoped_ptr<DriveFileSyncService> sync_service_;
272 318
273 typedef std::map<std::string, std::string> ResourceIdByTitle; 319 typedef std::map<std::string, std::string> ResourceIdByTitle;
274 ResourceIdByTitle resources_; 320 ResourceIdByTitle resources_;
275 int64 resource_count_; 321 int64 resource_count_;
276 322
277 DISALLOW_COPY_AND_ASSIGN(DriveFileSyncServiceSyncTest); 323 DISALLOW_COPY_AND_ASSIGN(DriveFileSyncServiceSyncTest);
278 }; 324 };
279 325
280 TEST_F(DriveFileSyncServiceSyncTest, AddFileTest) { 326 TEST_F(DriveFileSyncServiceSyncTest, AddFileTest) {
281 std::string kFile1 = "file title 1"; 327 std::string kFile1 = "file title 1";
282 SyncEvent sync_event[] = { 328 SyncEvent sync_event[] = {
283 CreateRemoteFileAddOrUpdateEvent(kFile1), 329 CreateRemoteFileAddOrUpdateEvent(kFile1),
284 }; 330 };
285 331
286 RunTest(CreateTestCase(sync_event)); 332 RunTest(CreateTestCase(sync_event));
287 } 333 }
288 334
289 TEST_F(DriveFileSyncServiceSyncTest, UpdateFileTest) { 335 TEST_F(DriveFileSyncServiceSyncTest, UpdateFileTest) {
290 std::string kFile1 = "file title 1"; 336 std::string kFile1 = "file title 1";
291 SyncEvent sync_event[] = { 337 SyncEvent sync_event[] = {
292 CreateRemoteFileAddOrUpdateEvent(kFile1), 338 CreateRemoteFileAddOrUpdateEvent(kFile1),
293 CreateRemoteFileAddOrUpdateEvent(kFile1), 339 CreateRemoteFileAddOrUpdateEvent(kFile1),
294 }; 340 };
295 341
296 RunTest(CreateTestCase(sync_event)); 342 RunTest(CreateTestCase(sync_event));
297 } 343 }
298 344
299
300 TEST_F(DriveFileSyncServiceSyncTest, DeleteFileTest) { 345 TEST_F(DriveFileSyncServiceSyncTest, DeleteFileTest) {
301 std::string kFile1 = "file title 1"; 346 std::string kFile1 = "file title 1";
302 SyncEvent sync_event[] = { 347 SyncEvent sync_event[] = {
303 CreateRemoteFileAddOrUpdateEvent(kFile1), 348 CreateRemoteFileAddOrUpdateEvent(kFile1),
349 CreateFetchEvent(),
350 CreateProcessRemoteChangeEvent(),
304 CreateRemoteFileDeleteEvent(kFile1), 351 CreateRemoteFileDeleteEvent(kFile1),
305 }; 352 };
306 353
307 RunTest(CreateTestCase(sync_event)); 354 RunTest(CreateTestCase(sync_event));
308 } 355 }
309 356
357 TEST_F(DriveFileSyncServiceSyncTest, RelaunchTest) {
358 SyncEvent sync_event[] = {
359 CreateRelaunchEvent(),
360 };
361
362 RunTest(CreateTestCase(sync_event));
363 }
364
365 TEST_F(DriveFileSyncServiceSyncTest, SquashedFileAddTest) {
366 std::string kFile1 = "file title 1";
367 SyncEvent sync_event[] = {
368 CreateRemoteFileAddOrUpdateEvent(kFile1),
369 CreateFetchEvent(),
370 CreateRemoteFileDeleteEvent(kFile1),
371 };
372 RunTest(CreateTestCase(sync_event));
373 }
374
310 } // namespace sync_file_system 375 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698