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

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc

Issue 296893002: [SyncFS] Make DriveBackendSyncTest run in multi-threaded env. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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_in) {
nhiroki 2014/05/26 09:56:00 In syncfs, we haven't used "_in" suffix for input
peria 2014/05/27 02:40:12 Done. Going along with current code is better, I t
47 *status_out = status_in;
48 closure.Run();
49 }
50
51 void SetSyncStatusAndUrl(const base::Closure& closure,
52 SyncStatusCode* status_out,
53 fileapi::FileSystemURL* url_out,
54 SyncStatusCode status_in,
55 const fileapi::FileSystemURL& url_in) {
56 *status_out = status_in;
57 *url_out = url_in;
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
77 scoped_refptr<base::SequencedWorkerPool> worker_pool(
78 content::BrowserThread::GetBlockingPool());
79
nhiroki 2014/05/26 09:56:00 Can you move this to line 83 or just call content:
peria 2014/05/27 02:40:12 Done.
56 io_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( 80 io_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
57 content::BrowserThread::IO); 81 content::BrowserThread::IO);
58 file_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( 82 file_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
59 content::BrowserThread::FILE); 83 content::BrowserThread::FILE);
84 worker_task_runner_ =
85 worker_pool->GetSequencedTaskRunnerWithShutdownBehavior(
86 worker_pool->GetSequenceToken(),
87 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
60 88
61 RegisterSyncableFileSystem(); 89 RegisterSyncableFileSystem();
62 local_sync_service_ = LocalFileSyncService::CreateForTesting( 90 local_sync_service_ = LocalFileSyncService::CreateForTesting(
63 &profile_, in_memory_env_.get()); 91 &profile_, in_memory_env_.get());
64 local_sync_service_->AddChangeObserver(this); 92 local_sync_service_->AddChangeObserver(this);
65 93
66 scoped_ptr<drive::FakeDriveService> 94 scoped_ptr<drive::FakeDriveService>
67 drive_service(new drive::FakeDriveService); 95 drive_service(new drive::FakeDriveService);
68 drive_service->Initialize("test@example.com"); 96 drive_service->Initialize("test@example.com");
69 ASSERT_TRUE(drive::test_util::SetUpTestEntries(drive_service.get())); 97 ASSERT_TRUE(drive::test_util::SetUpTestEntries(drive_service.get()));
70 98
71 scoped_ptr<drive::DriveUploaderInterface> uploader( 99 scoped_ptr<drive::DriveUploaderInterface> uploader(
72 new drive::DriveUploader(drive_service.get(), 100 new drive::DriveUploader(drive_service.get(),
73 file_task_runner_.get())); 101 file_task_runner_.get()));
74 102
75 fake_drive_service_helper_.reset(new FakeDriveServiceHelper( 103 fake_drive_service_helper_.reset(new FakeDriveServiceHelper(
76 drive_service.get(), uploader.get(), 104 drive_service.get(), uploader.get(),
77 kSyncRootFolderTitle)); 105 kSyncRootFolderTitle));
78 106
79 remote_sync_service_.reset(new SyncEngine( 107 remote_sync_service_.reset(new SyncEngine(
80 drive_service.PassAs<drive::DriveServiceInterface>(), 108 drive_service.PassAs<drive::DriveServiceInterface>(),
81 uploader.Pass(), 109 uploader.Pass(),
82 file_task_runner_.get(), 110 file_task_runner_.get(),
83 NULL, NULL, NULL)); 111 NULL, NULL, NULL));
84 remote_sync_service_->AddServiceObserver(this); 112 remote_sync_service_->AddServiceObserver(this);
85 remote_sync_service_->Initialize(base_dir_.path(), 113 remote_sync_service_->Initialize(base_dir_.path(),
86 base::MessageLoopProxy::current(), 114 worker_task_runner_.get(),
87 in_memory_env_.get()); 115 in_memory_env_.get());
88 remote_sync_service_->SetSyncEnabled(true); 116 remote_sync_service_->SetSyncEnabled(true);
89 117
90 local_sync_service_->SetLocalChangeProcessor(remote_sync_service_.get()); 118 local_sync_service_->SetLocalChangeProcessor(remote_sync_service_.get());
91 remote_sync_service_->SetRemoteChangeProcessor(local_sync_service_.get()); 119 remote_sync_service_->SetRemoteChangeProcessor(local_sync_service_.get());
92 } 120 }
93 121
94 virtual void TearDown() OVERRIDE { 122 virtual void TearDown() OVERRIDE {
95 typedef std::map<std::string, CannedSyncableFileSystem*>::iterator iterator; 123 typedef std::map<std::string, CannedSyncableFileSystem*>::iterator iterator;
96 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
154 182
155 SyncStatusCode RegisterApp(const std::string& app_id) { 183 SyncStatusCode RegisterApp(const std::string& app_id) {
156 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); 184 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id);
157 if (!ContainsKey(file_systems_, app_id)) { 185 if (!ContainsKey(file_systems_, app_id)) {
158 CannedSyncableFileSystem* file_system = new CannedSyncableFileSystem( 186 CannedSyncableFileSystem* file_system = new CannedSyncableFileSystem(
159 origin, in_memory_env_.get(), 187 origin, in_memory_env_.get(),
160 io_task_runner_.get(), file_task_runner_.get()); 188 io_task_runner_.get(), file_task_runner_.get());
161 file_system->SetUp(CannedSyncableFileSystem::QUOTA_DISABLED); 189 file_system->SetUp(CannedSyncableFileSystem::QUOTA_DISABLED);
162 190
163 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 191 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
164 local_sync_service_->MaybeInitializeFileSystemContext( 192 {
165 origin, file_system->file_system_context(), 193 base::RunLoop run_loop;
166 CreateResultReceiver(&status)); 194 local_sync_service_->MaybeInitializeFileSystemContext(
167 base::RunLoop().RunUntilIdle(); 195 origin, file_system->file_system_context(),
196 base::Bind(&SetSyncStatus, run_loop.QuitClosure(), &status));
197 run_loop.Run();
198 }
nhiroki 2014/05/26 09:56:00 You are already surrounded with if-block.
peria 2014/05/27 02:40:12 Done.
168 EXPECT_EQ(SYNC_STATUS_OK, status); 199 EXPECT_EQ(SYNC_STATUS_OK, status);
169 200
170 file_system->backend()->sync_context()-> 201 file_system->backend()->sync_context()->
171 set_mock_notify_changes_duration_in_sec(0); 202 set_mock_notify_changes_duration_in_sec(0);
172 203
173 EXPECT_EQ(base::File::FILE_OK, file_system->OpenFileSystem()); 204 EXPECT_EQ(base::File::FILE_OK, file_system->OpenFileSystem());
174 file_systems_[app_id] = file_system; 205 file_systems_[app_id] = file_system;
175 } 206 }
176 207
177 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 208 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
178 remote_sync_service_->RegisterOrigin(origin, CreateResultReceiver(&status)); 209 {
179 base::RunLoop().RunUntilIdle(); 210 base::RunLoop run_loop;
211 remote_sync_service_->RegisterOrigin(
212 origin,
213 base::Bind(&SetSyncStatus, run_loop.QuitClosure(), &status));
214 run_loop.Run();
215 }
180 return status; 216 return status;
181 } 217 }
182 218
183 void AddLocalFolder(const std::string& app_id, 219 void AddLocalFolder(const std::string& app_id,
184 const base::FilePath::StringType& path) { 220 const base::FilePath::StringType& path) {
185 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); 221 ASSERT_TRUE(ContainsKey(file_systems_, app_id));
186 EXPECT_EQ(base::File::FILE_OK, 222 EXPECT_EQ(base::File::FILE_OK,
187 file_systems_[app_id]->CreateDirectory( 223 file_systems_[app_id]->CreateDirectory(
188 CreateURL(app_id, path))); 224 CreateURL(app_id, path)));
189 } 225 }
(...skipping 25 matching lines...) Expand all
215 EXPECT_EQ(base::File::FILE_OK, 251 EXPECT_EQ(base::File::FILE_OK,
216 file_systems_[app_id]->Remove( 252 file_systems_[app_id]->Remove(
217 CreateURL(app_id, path), 253 CreateURL(app_id, path),
218 true /* recursive */)); 254 true /* recursive */));
219 base::RunLoop().RunUntilIdle(); 255 base::RunLoop().RunUntilIdle();
220 } 256 }
221 257
222 SyncStatusCode ProcessLocalChange() { 258 SyncStatusCode ProcessLocalChange() {
223 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 259 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
224 fileapi::FileSystemURL url; 260 fileapi::FileSystemURL url;
225 local_sync_service_->ProcessLocalChange( 261 base::RunLoop run_loop;
226 CreateResultReceiver(&status, &url)); 262 local_sync_service_->ProcessLocalChange(base::Bind(
227 base::RunLoop().RunUntilIdle(); 263 &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url));
264 run_loop.Run();
228 return status; 265 return status;
229 } 266 }
230 267
231 SyncStatusCode ProcessRemoteChange() { 268 SyncStatusCode ProcessRemoteChange() {
232 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 269 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
233 fileapi::FileSystemURL url; 270 fileapi::FileSystemURL url;
234 remote_sync_service_->ProcessRemoteChange( 271 base::RunLoop run_loop;
235 CreateResultReceiver(&status, &url)); 272 remote_sync_service_->ProcessRemoteChange(base::Bind(
236 base::RunLoop().RunUntilIdle(); 273 &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url));
274 run_loop.Run();
237 return status; 275 return status;
238 } 276 }
239 277
240 int64 GetLargestChangeID() { 278 int64 GetLargestChangeID() {
241 scoped_ptr<google_apis::AboutResource> about_resource; 279 scoped_ptr<google_apis::AboutResource> about_resource;
242 EXPECT_EQ(google_apis::HTTP_SUCCESS, 280 EXPECT_EQ(google_apis::HTTP_SUCCESS,
243 fake_drive_service_helper()->GetAboutResource(&about_resource)); 281 fake_drive_service_helper()->GetAboutResource(&about_resource));
244 if (!about_resource) 282 if (!about_resource)
245 return 0; 283 return 0;
246 return about_resource->largest_change_id(); 284 return about_resource->largest_change_id();
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 scoped_ptr<LocalFileSyncService> local_sync_service_; 522 scoped_ptr<LocalFileSyncService> local_sync_service_;
485 523
486 int64 pending_remote_changes_; 524 int64 pending_remote_changes_;
487 int64 pending_local_changes_; 525 int64 pending_local_changes_;
488 526
489 scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_; 527 scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_;
490 std::map<std::string, CannedSyncableFileSystem*> file_systems_; 528 std::map<std::string, CannedSyncableFileSystem*> file_systems_;
491 529
492 530
493 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; 531 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
532 scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
nhiroki 2014/05/26 09:56:00 Can you move this after |file_task_runner_| to sor
peria 2014/05/27 02:40:12 Done. I changed the order of setting them up. I an
494 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; 533 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
495 534
496 DISALLOW_COPY_AND_ASSIGN(DriveBackendSyncTest); 535 DISALLOW_COPY_AND_ASSIGN(DriveBackendSyncTest);
497 }; 536 };
498 537
499 TEST_F(DriveBackendSyncTest, LocalToRemoteBasicTest) { 538 TEST_F(DriveBackendSyncTest, LocalToRemoteBasicTest) {
500 std::string app_id = "example"; 539 std::string app_id = "example";
501 540
502 RegisterApp(app_id); 541 RegisterApp(app_id);
503 AddOrUpdateLocalFile(app_id, FPL("file"), "abcde"); 542 AddOrUpdateLocalFile(app_id, FPL("file"), "abcde");
(...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after
1575 1614
1576 EXPECT_EQ(1u, CountApp()); 1615 EXPECT_EQ(1u, CountApp());
1577 EXPECT_EQ(1u, CountLocalFile(app_id)); 1616 EXPECT_EQ(1u, CountLocalFile(app_id));
1578 1617
1579 EXPECT_EQ(2u, CountMetadata()); 1618 EXPECT_EQ(2u, CountMetadata());
1580 EXPECT_EQ(2u, CountTracker()); 1619 EXPECT_EQ(2u, CountTracker());
1581 } 1620 }
1582 1621
1583 } // namespace drive_backend 1622 } // namespace drive_backend
1584 } // namespace sync_file_system 1623 } // namespace sync_file_system
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698