| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <stack> | 6 #include <stack> |
| 7 | 7 |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 #include "third_party/leveldatabase/src/include/leveldb/env.h" | 32 #include "third_party/leveldatabase/src/include/leveldb/env.h" |
| 33 #include "webkit/browser/fileapi/file_system_context.h" | 33 #include "webkit/browser/fileapi/file_system_context.h" |
| 34 | 34 |
| 35 #define FPL(a) FILE_PATH_LITERAL(a) | 35 #define FPL(a) FILE_PATH_LITERAL(a) |
| 36 | 36 |
| 37 namespace sync_file_system { | 37 namespace sync_file_system { |
| 38 namespace drive_backend { | 38 namespace drive_backend { |
| 39 | 39 |
| 40 typedef fileapi::FileSystemOperation::FileEntryList FileEntryList; | 40 typedef fileapi::FileSystemOperation::FileEntryList FileEntryList; |
| 41 | 41 |
| 42 namespace { |
| 43 |
| 44 void SetSyncStatus(const base::Closure& closure, |
| 45 SyncStatusCode* status_out, |
| 46 SyncStatusCode status) { |
| 47 *status_out = status; |
| 48 closure.Run(); |
| 49 } |
| 50 |
| 51 void SetSyncStatusAndUrl(const base::Closure& closure, |
| 52 SyncStatusCode* status_out, |
| 53 fileapi::FileSystemURL* url_out, |
| 54 SyncStatusCode status, |
| 55 const fileapi::FileSystemURL& url) { |
| 56 *status_out = status; |
| 57 *url_out = url; |
| 58 closure.Run(); |
| 59 } |
| 60 |
| 61 } // namespace |
| 62 |
| 42 class DriveBackendSyncTest : public testing::Test, | 63 class DriveBackendSyncTest : public testing::Test, |
| 43 public LocalFileSyncService::Observer, | 64 public LocalFileSyncService::Observer, |
| 44 public RemoteFileSyncService::Observer { | 65 public RemoteFileSyncService::Observer { |
| 45 public: | 66 public: |
| 46 DriveBackendSyncTest() | 67 DriveBackendSyncTest() |
| 47 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), | 68 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), |
| 48 pending_remote_changes_(0), | 69 pending_remote_changes_(0), |
| 49 pending_local_changes_(0) {} | 70 pending_local_changes_(0) {} |
| 50 virtual ~DriveBackendSyncTest() {} | 71 virtual ~DriveBackendSyncTest() {} |
| 51 | 72 |
| 52 virtual void SetUp() OVERRIDE { | 73 virtual void SetUp() OVERRIDE { |
| 53 ASSERT_TRUE(base_dir_.CreateUniqueTempDir()); | 74 ASSERT_TRUE(base_dir_.CreateUniqueTempDir()); |
| 54 in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default())); | 75 in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default())); |
| 55 | 76 |
| 56 io_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( | 77 io_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( |
| 57 content::BrowserThread::IO); | 78 content::BrowserThread::IO); |
| 79 scoped_refptr<base::SequencedWorkerPool> worker_pool( |
| 80 content::BrowserThread::GetBlockingPool()); |
| 81 worker_task_runner_ = |
| 82 worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( |
| 83 worker_pool->GetSequenceToken(), |
| 84 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); |
| 58 file_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( | 85 file_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( |
| 59 content::BrowserThread::FILE); | 86 content::BrowserThread::FILE); |
| 60 | 87 |
| 61 RegisterSyncableFileSystem(); | 88 RegisterSyncableFileSystem(); |
| 62 local_sync_service_ = LocalFileSyncService::CreateForTesting( | 89 local_sync_service_ = LocalFileSyncService::CreateForTesting( |
| 63 &profile_, in_memory_env_.get()); | 90 &profile_, in_memory_env_.get()); |
| 64 local_sync_service_->AddChangeObserver(this); | 91 local_sync_service_->AddChangeObserver(this); |
| 65 | 92 |
| 66 scoped_ptr<drive::FakeDriveService> | 93 scoped_ptr<drive::FakeDriveService> |
| 67 drive_service(new drive::FakeDriveService); | 94 drive_service(new drive::FakeDriveService); |
| 68 drive_service->Initialize("test@example.com"); | 95 drive_service->Initialize("test@example.com"); |
| 69 ASSERT_TRUE(drive::test_util::SetUpTestEntries(drive_service.get())); | 96 ASSERT_TRUE(drive::test_util::SetUpTestEntries(drive_service.get())); |
| 70 | 97 |
| 71 scoped_ptr<drive::DriveUploaderInterface> uploader( | 98 scoped_ptr<drive::DriveUploaderInterface> uploader( |
| 72 new drive::DriveUploader(drive_service.get(), | 99 new drive::DriveUploader(drive_service.get(), |
| 73 file_task_runner_.get())); | 100 file_task_runner_.get())); |
| 74 | 101 |
| 75 fake_drive_service_helper_.reset(new FakeDriveServiceHelper( | 102 fake_drive_service_helper_.reset(new FakeDriveServiceHelper( |
| 76 drive_service.get(), uploader.get(), | 103 drive_service.get(), uploader.get(), |
| 77 kSyncRootFolderTitle)); | 104 kSyncRootFolderTitle)); |
| 78 | 105 |
| 79 remote_sync_service_.reset(new SyncEngine( | 106 remote_sync_service_.reset(new SyncEngine( |
| 80 drive_service.PassAs<drive::DriveServiceInterface>(), | 107 drive_service.PassAs<drive::DriveServiceInterface>(), |
| 81 uploader.Pass(), | 108 uploader.Pass(), |
| 82 file_task_runner_.get(), | 109 file_task_runner_.get(), |
| 83 NULL, NULL, NULL)); | 110 NULL, NULL, NULL)); |
| 84 remote_sync_service_->AddServiceObserver(this); | 111 remote_sync_service_->AddServiceObserver(this); |
| 85 remote_sync_service_->Initialize(base_dir_.path(), | 112 remote_sync_service_->Initialize(base_dir_.path(), |
| 86 NULL, | 113 NULL, |
| 87 base::MessageLoopProxy::current(), | 114 worker_task_runner_.get(), |
| 88 in_memory_env_.get()); | 115 in_memory_env_.get()); |
| 89 remote_sync_service_->SetSyncEnabled(true); | 116 remote_sync_service_->SetSyncEnabled(true); |
| 90 | 117 |
| 91 local_sync_service_->SetLocalChangeProcessor(remote_sync_service_.get()); | 118 local_sync_service_->SetLocalChangeProcessor(remote_sync_service_.get()); |
| 92 remote_sync_service_->SetRemoteChangeProcessor(local_sync_service_.get()); | 119 remote_sync_service_->SetRemoteChangeProcessor(local_sync_service_.get()); |
| 93 } | 120 } |
| 94 | 121 |
| 95 virtual void TearDown() OVERRIDE { | 122 virtual void TearDown() OVERRIDE { |
| 96 typedef std::map<std::string, CannedSyncableFileSystem*>::iterator iterator; | 123 typedef std::map<std::string, CannedSyncableFileSystem*>::iterator iterator; |
| 97 for (iterator itr = file_systems_.begin(); | 124 for (iterator itr = file_systems_.begin(); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 | 182 |
| 156 SyncStatusCode RegisterApp(const std::string& app_id) { | 183 SyncStatusCode RegisterApp(const std::string& app_id) { |
| 157 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); | 184 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); |
| 158 if (!ContainsKey(file_systems_, app_id)) { | 185 if (!ContainsKey(file_systems_, app_id)) { |
| 159 CannedSyncableFileSystem* file_system = new CannedSyncableFileSystem( | 186 CannedSyncableFileSystem* file_system = new CannedSyncableFileSystem( |
| 160 origin, in_memory_env_.get(), | 187 origin, in_memory_env_.get(), |
| 161 io_task_runner_.get(), file_task_runner_.get()); | 188 io_task_runner_.get(), file_task_runner_.get()); |
| 162 file_system->SetUp(CannedSyncableFileSystem::QUOTA_DISABLED); | 189 file_system->SetUp(CannedSyncableFileSystem::QUOTA_DISABLED); |
| 163 | 190 |
| 164 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 191 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 192 base::RunLoop run_loop; |
| 165 local_sync_service_->MaybeInitializeFileSystemContext( | 193 local_sync_service_->MaybeInitializeFileSystemContext( |
| 166 origin, file_system->file_system_context(), | 194 origin, file_system->file_system_context(), |
| 167 CreateResultReceiver(&status)); | 195 base::Bind(&SetSyncStatus, run_loop.QuitClosure(), &status)); |
| 168 base::RunLoop().RunUntilIdle(); | 196 run_loop.Run(); |
| 169 EXPECT_EQ(SYNC_STATUS_OK, status); | 197 EXPECT_EQ(SYNC_STATUS_OK, status); |
| 170 | 198 |
| 171 file_system->backend()->sync_context()-> | 199 file_system->backend()->sync_context()-> |
| 172 set_mock_notify_changes_duration_in_sec(0); | 200 set_mock_notify_changes_duration_in_sec(0); |
| 173 | 201 |
| 174 EXPECT_EQ(base::File::FILE_OK, file_system->OpenFileSystem()); | 202 EXPECT_EQ(base::File::FILE_OK, file_system->OpenFileSystem()); |
| 175 file_systems_[app_id] = file_system; | 203 file_systems_[app_id] = file_system; |
| 176 } | 204 } |
| 177 | 205 |
| 178 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 206 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 179 remote_sync_service_->RegisterOrigin(origin, CreateResultReceiver(&status)); | 207 base::RunLoop run_loop; |
| 180 base::RunLoop().RunUntilIdle(); | 208 remote_sync_service_->RegisterOrigin( |
| 209 origin, |
| 210 base::Bind(&SetSyncStatus, run_loop.QuitClosure(), &status)); |
| 211 run_loop.Run(); |
| 181 return status; | 212 return status; |
| 182 } | 213 } |
| 183 | 214 |
| 184 void AddLocalFolder(const std::string& app_id, | 215 void AddLocalFolder(const std::string& app_id, |
| 185 const base::FilePath::StringType& path) { | 216 const base::FilePath::StringType& path) { |
| 186 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); | 217 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); |
| 187 EXPECT_EQ(base::File::FILE_OK, | 218 EXPECT_EQ(base::File::FILE_OK, |
| 188 file_systems_[app_id]->CreateDirectory( | 219 file_systems_[app_id]->CreateDirectory( |
| 189 CreateURL(app_id, path))); | 220 CreateURL(app_id, path))); |
| 190 } | 221 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 216 EXPECT_EQ(base::File::FILE_OK, | 247 EXPECT_EQ(base::File::FILE_OK, |
| 217 file_systems_[app_id]->Remove( | 248 file_systems_[app_id]->Remove( |
| 218 CreateURL(app_id, path), | 249 CreateURL(app_id, path), |
| 219 true /* recursive */)); | 250 true /* recursive */)); |
| 220 base::RunLoop().RunUntilIdle(); | 251 base::RunLoop().RunUntilIdle(); |
| 221 } | 252 } |
| 222 | 253 |
| 223 SyncStatusCode ProcessLocalChange() { | 254 SyncStatusCode ProcessLocalChange() { |
| 224 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 255 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 225 fileapi::FileSystemURL url; | 256 fileapi::FileSystemURL url; |
| 226 local_sync_service_->ProcessLocalChange( | 257 base::RunLoop run_loop; |
| 227 CreateResultReceiver(&status, &url)); | 258 local_sync_service_->ProcessLocalChange(base::Bind( |
| 228 base::RunLoop().RunUntilIdle(); | 259 &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url)); |
| 260 run_loop.Run(); |
| 229 return status; | 261 return status; |
| 230 } | 262 } |
| 231 | 263 |
| 232 SyncStatusCode ProcessRemoteChange() { | 264 SyncStatusCode ProcessRemoteChange() { |
| 233 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 265 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 234 fileapi::FileSystemURL url; | 266 fileapi::FileSystemURL url; |
| 235 remote_sync_service_->ProcessRemoteChange( | 267 base::RunLoop run_loop; |
| 236 CreateResultReceiver(&status, &url)); | 268 remote_sync_service_->ProcessRemoteChange(base::Bind( |
| 237 base::RunLoop().RunUntilIdle(); | 269 &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url)); |
| 270 run_loop.Run(); |
| 238 return status; | 271 return status; |
| 239 } | 272 } |
| 240 | 273 |
| 241 int64 GetLargestChangeID() { | 274 int64 GetLargestChangeID() { |
| 242 scoped_ptr<google_apis::AboutResource> about_resource; | 275 scoped_ptr<google_apis::AboutResource> about_resource; |
| 243 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 276 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
| 244 fake_drive_service_helper()->GetAboutResource(&about_resource)); | 277 fake_drive_service_helper()->GetAboutResource(&about_resource)); |
| 245 if (!about_resource) | 278 if (!about_resource) |
| 246 return 0; | 279 return 0; |
| 247 return about_resource->largest_change_id(); | 280 return about_resource->largest_change_id(); |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 scoped_ptr<LocalFileSyncService> local_sync_service_; | 518 scoped_ptr<LocalFileSyncService> local_sync_service_; |
| 486 | 519 |
| 487 int64 pending_remote_changes_; | 520 int64 pending_remote_changes_; |
| 488 int64 pending_local_changes_; | 521 int64 pending_local_changes_; |
| 489 | 522 |
| 490 scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_; | 523 scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_; |
| 491 std::map<std::string, CannedSyncableFileSystem*> file_systems_; | 524 std::map<std::string, CannedSyncableFileSystem*> file_systems_; |
| 492 | 525 |
| 493 | 526 |
| 494 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; | 527 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; |
| 528 scoped_refptr<base::SequencedTaskRunner> worker_task_runner_; |
| 495 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; | 529 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; |
| 496 | 530 |
| 497 DISALLOW_COPY_AND_ASSIGN(DriveBackendSyncTest); | 531 DISALLOW_COPY_AND_ASSIGN(DriveBackendSyncTest); |
| 498 }; | 532 }; |
| 499 | 533 |
| 500 TEST_F(DriveBackendSyncTest, LocalToRemoteBasicTest) { | 534 TEST_F(DriveBackendSyncTest, LocalToRemoteBasicTest) { |
| 501 std::string app_id = "example"; | 535 std::string app_id = "example"; |
| 502 | 536 |
| 503 RegisterApp(app_id); | 537 RegisterApp(app_id); |
| 504 AddOrUpdateLocalFile(app_id, FPL("file"), "abcde"); | 538 AddOrUpdateLocalFile(app_id, FPL("file"), "abcde"); |
| (...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1576 | 1610 |
| 1577 EXPECT_EQ(1u, CountApp()); | 1611 EXPECT_EQ(1u, CountApp()); |
| 1578 EXPECT_EQ(1u, CountLocalFile(app_id)); | 1612 EXPECT_EQ(1u, CountLocalFile(app_id)); |
| 1579 | 1613 |
| 1580 EXPECT_EQ(2u, CountMetadata()); | 1614 EXPECT_EQ(2u, CountMetadata()); |
| 1581 EXPECT_EQ(2u, CountTracker()); | 1615 EXPECT_EQ(2u, CountTracker()); |
| 1582 } | 1616 } |
| 1583 | 1617 |
| 1584 } // namespace drive_backend | 1618 } // namespace drive_backend |
| 1585 } // namespace sync_file_system | 1619 } // namespace sync_file_system |
| OLD | NEW |