OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/chromeos/drive/drive_scheduler.h" | |
6 | |
7 #include <set> | |
8 | |
9 #include "base/bind.h" | |
10 #include "base/file_util.h" | |
11 #include "base/prefs/pref_service.h" | |
12 #include "base/stl_util.h" | |
13 #include "base/threading/sequenced_worker_pool.h" | |
14 #include "chrome/browser/chromeos/drive/test_util.h" | |
15 #include "chrome/browser/google_apis/drive_api_parser.h" | |
16 #include "chrome/browser/google_apis/fake_drive_service.h" | |
17 #include "chrome/browser/google_apis/gdata_wapi_parser.h" | |
18 #include "chrome/common/pref_names.h" | |
19 #include "chrome/test/base/testing_profile.h" | |
20 #include "content/public/test/test_browser_thread.h" | |
21 #include "testing/gtest/include/gtest/gtest.h" | |
22 | |
23 namespace drive { | |
24 | |
25 namespace { | |
26 | |
27 class FakeNetworkChangeNotifier : public net::NetworkChangeNotifier { | |
28 public: | |
29 FakeNetworkChangeNotifier() : type_(CONNECTION_NONE) {} | |
30 | |
31 void set_connection_type(ConnectionType type) { type_ = type; } | |
32 | |
33 virtual ConnectionType GetCurrentConnectionType() const OVERRIDE { | |
34 return type_; | |
35 } | |
36 | |
37 private: | |
38 net::NetworkChangeNotifier::ConnectionType type_; | |
39 }; | |
40 | |
41 void CopyResourceIdFromGetResourceEntryCallback( | |
42 std::vector<std::string>* id_list_out, | |
43 const std::string& requested_id, | |
44 google_apis::GDataErrorCode error_in, | |
45 scoped_ptr<google_apis::ResourceEntry> resource_entry_in) { | |
46 id_list_out->push_back(requested_id); | |
47 } | |
48 | |
49 class JobListLogger : public JobListObserver { | |
50 public: | |
51 enum EventType { | |
52 ADDED, | |
53 UPDATED, | |
54 DONE, | |
55 }; | |
56 | |
57 struct EventLog { | |
58 EventType type; | |
59 JobInfo info; | |
60 | |
61 EventLog(EventType type, const JobInfo& info) : type(type), info(info) { | |
62 } | |
63 }; | |
64 | |
65 // Checks whether the specified type of event has occurred. | |
66 bool Has(EventType type, JobType job_type) { | |
67 for (size_t i = 0; i < events.size(); ++i) { | |
68 if (events[i].type == type && events[i].info.job_type == job_type) | |
69 return true; | |
70 } | |
71 return false; | |
72 } | |
73 | |
74 // Gets the progress event information of the specified type. | |
75 void GetProgressInfo(JobType job_type, std::vector<int64>* progress) { | |
76 for (size_t i = 0; i < events.size(); ++i) { | |
77 if (events[i].type == UPDATED && events[i].info.job_type == job_type) | |
78 progress->push_back(events[i].info.num_completed_bytes); | |
79 } | |
80 } | |
81 | |
82 // JobListObserver overrides. | |
83 virtual void OnJobAdded(const JobInfo& info) OVERRIDE { | |
84 events.push_back(EventLog(ADDED, info)); | |
85 } | |
86 | |
87 virtual void OnJobUpdated(const JobInfo& info) OVERRIDE { | |
88 events.push_back(EventLog(UPDATED, info)); | |
89 } | |
90 | |
91 virtual void OnJobDone(const JobInfo& info, FileError error) OVERRIDE { | |
92 events.push_back(EventLog(DONE, info)); | |
93 } | |
94 | |
95 private: | |
96 std::vector<EventLog> events; | |
97 }; | |
98 | |
99 } // namespace | |
100 | |
101 class DriveSchedulerTest : public testing::Test { | |
102 public: | |
103 DriveSchedulerTest() | |
104 : ui_thread_(content::BrowserThread::UI, &message_loop_), | |
105 profile_(new TestingProfile) { | |
106 } | |
107 | |
108 virtual void SetUp() OVERRIDE { | |
109 fake_network_change_notifier_.reset(new FakeNetworkChangeNotifier); | |
110 | |
111 fake_drive_service_.reset(new google_apis::FakeDriveService()); | |
112 fake_drive_service_->LoadResourceListForWapi( | |
113 "chromeos/gdata/root_feed.json"); | |
114 fake_drive_service_->LoadAccountMetadataForWapi( | |
115 "chromeos/gdata/account_metadata.json"); | |
116 fake_drive_service_->LoadAppListForDriveApi( | |
117 "chromeos/drive/applist.json"); | |
118 | |
119 scheduler_.reset(new DriveScheduler(profile_.get(), | |
120 fake_drive_service_.get())); | |
121 scheduler_->SetDisableThrottling(true); | |
122 } | |
123 | |
124 virtual void TearDown() OVERRIDE { | |
125 // The scheduler should be deleted before NetworkLibrary, as it | |
126 // registers itself as observer of NetworkLibrary. | |
127 scheduler_.reset(); | |
128 google_apis::test_util::RunBlockingPoolTask(); | |
129 fake_drive_service_.reset(); | |
130 fake_network_change_notifier_.reset(); | |
131 } | |
132 | |
133 protected: | |
134 // Sets up FakeNetworkChangeNotifier as if it's connected to a network with | |
135 // the specified connection type. | |
136 void ChangeConnectionType(net::NetworkChangeNotifier::ConnectionType type) { | |
137 fake_network_change_notifier_->set_connection_type(type); | |
138 // Notify the sync client that the network is changed. This is done via | |
139 // NetworkChangeNotifier in production, but here, we simulate the behavior | |
140 // by directly calling OnConnectionTypeChanged(). | |
141 scheduler_->OnConnectionTypeChanged(type); | |
142 } | |
143 | |
144 // Sets up FakeNetworkChangeNotifier as if it's connected to wifi network. | |
145 void ConnectToWifi() { | |
146 ChangeConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI); | |
147 } | |
148 | |
149 // Sets up FakeNetworkChangeNotifier as if it's connected to cellular network. | |
150 void ConnectToCellular() { | |
151 ChangeConnectionType(net::NetworkChangeNotifier::CONNECTION_2G); | |
152 } | |
153 | |
154 // Sets up FakeNetworkChangeNotifier as if it's connected to wimax network. | |
155 void ConnectToWimax() { | |
156 ChangeConnectionType(net::NetworkChangeNotifier::CONNECTION_4G); | |
157 } | |
158 | |
159 // Sets up FakeNetworkChangeNotifier as if it's disconnected. | |
160 void ConnectToNone() { | |
161 ChangeConnectionType(net::NetworkChangeNotifier::CONNECTION_NONE); | |
162 } | |
163 | |
164 MessageLoopForUI message_loop_; | |
165 content::TestBrowserThread ui_thread_; | |
166 scoped_ptr<TestingProfile> profile_; | |
167 scoped_ptr<DriveScheduler> scheduler_; | |
168 scoped_ptr<FakeNetworkChangeNotifier> fake_network_change_notifier_; | |
169 scoped_ptr<google_apis::FakeDriveService> fake_drive_service_; | |
170 }; | |
171 | |
172 TEST_F(DriveSchedulerTest, GetAboutResource) { | |
173 ConnectToWifi(); | |
174 | |
175 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
176 scoped_ptr<google_apis::AboutResource> about_resource; | |
177 scheduler_->GetAboutResource( | |
178 google_apis::test_util::CreateCopyResultCallback( | |
179 &error, &about_resource)); | |
180 google_apis::test_util::RunBlockingPoolTask(); | |
181 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
182 ASSERT_TRUE(about_resource); | |
183 } | |
184 | |
185 TEST_F(DriveSchedulerTest, GetAppList) { | |
186 ConnectToWifi(); | |
187 | |
188 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
189 scoped_ptr<google_apis::AppList> app_list; | |
190 | |
191 scheduler_->GetAppList( | |
192 google_apis::test_util::CreateCopyResultCallback(&error, &app_list)); | |
193 google_apis::test_util::RunBlockingPoolTask(); | |
194 | |
195 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
196 ASSERT_TRUE(app_list); | |
197 } | |
198 | |
199 TEST_F(DriveSchedulerTest, GetAccountMetadata) { | |
200 ConnectToWifi(); | |
201 | |
202 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
203 scoped_ptr<google_apis::AccountMetadata> account_metadata; | |
204 | |
205 scheduler_->GetAccountMetadata( | |
206 google_apis::test_util::CreateCopyResultCallback( | |
207 &error, &account_metadata)); | |
208 google_apis::test_util::RunBlockingPoolTask(); | |
209 | |
210 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
211 ASSERT_TRUE(account_metadata); | |
212 } | |
213 | |
214 TEST_F(DriveSchedulerTest, GetAllResourceList) { | |
215 ConnectToWifi(); | |
216 | |
217 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
218 scoped_ptr<google_apis::ResourceList> resource_list; | |
219 | |
220 scheduler_->GetAllResourceList( | |
221 google_apis::test_util::CreateCopyResultCallback( | |
222 &error, &resource_list)); | |
223 google_apis::test_util::RunBlockingPoolTask(); | |
224 | |
225 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
226 ASSERT_TRUE(resource_list); | |
227 } | |
228 | |
229 TEST_F(DriveSchedulerTest, GetResourceListInDirectory) { | |
230 ConnectToWifi(); | |
231 | |
232 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
233 scoped_ptr<google_apis::ResourceList> resource_list; | |
234 | |
235 scheduler_->GetResourceListInDirectory( | |
236 fake_drive_service_->GetRootResourceId(), | |
237 google_apis::test_util::CreateCopyResultCallback( | |
238 &error, &resource_list)); | |
239 google_apis::test_util::RunBlockingPoolTask(); | |
240 | |
241 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
242 ASSERT_TRUE(resource_list); | |
243 } | |
244 | |
245 TEST_F(DriveSchedulerTest, Search) { | |
246 ConnectToWifi(); | |
247 | |
248 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
249 scoped_ptr<google_apis::ResourceList> resource_list; | |
250 | |
251 scheduler_->Search( | |
252 "File", // search query | |
253 google_apis::test_util::CreateCopyResultCallback( | |
254 &error, &resource_list)); | |
255 google_apis::test_util::RunBlockingPoolTask(); | |
256 | |
257 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
258 ASSERT_TRUE(resource_list); | |
259 } | |
260 | |
261 TEST_F(DriveSchedulerTest, GetChangeList) { | |
262 ConnectToWifi(); | |
263 | |
264 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
265 | |
266 // Create a new directory. | |
267 // The loaded (initial) changestamp is 654321. Thus, by this operation, | |
268 // it should become 654322. | |
269 { | |
270 scoped_ptr<google_apis::ResourceEntry> resource_entry; | |
271 fake_drive_service_->AddNewDirectory( | |
272 fake_drive_service_->GetRootResourceId(), | |
273 "new directory", | |
274 google_apis::test_util::CreateCopyResultCallback( | |
275 &error, &resource_entry)); | |
276 google_apis::test_util::RunBlockingPoolTask(); | |
277 ASSERT_EQ(google_apis::HTTP_CREATED, error); | |
278 } | |
279 | |
280 error = google_apis::GDATA_OTHER_ERROR; | |
281 scoped_ptr<google_apis::ResourceList> resource_list; | |
282 scheduler_->GetChangeList( | |
283 654321 + 1, // start_changestamp | |
284 google_apis::test_util::CreateCopyResultCallback( | |
285 &error, &resource_list)); | |
286 google_apis::test_util::RunBlockingPoolTask(); | |
287 | |
288 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
289 ASSERT_TRUE(resource_list); | |
290 } | |
291 | |
292 TEST_F(DriveSchedulerTest, ContinueGetResourceList) { | |
293 ConnectToWifi(); | |
294 fake_drive_service_->set_default_max_results(2); | |
295 | |
296 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
297 scoped_ptr<google_apis::ResourceList> resource_list; | |
298 | |
299 scheduler_->GetAllResourceList( | |
300 google_apis::test_util::CreateCopyResultCallback( | |
301 &error, &resource_list)); | |
302 google_apis::test_util::RunBlockingPoolTask(); | |
303 | |
304 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
305 ASSERT_TRUE(resource_list); | |
306 | |
307 const google_apis::Link* next_link = | |
308 resource_list->GetLinkByType(google_apis::Link::LINK_NEXT); | |
309 ASSERT_TRUE(next_link); | |
310 // Keep the next url before releasing the |resource_list|. | |
311 GURL next_url(next_link->href()); | |
312 | |
313 error = google_apis::GDATA_OTHER_ERROR; | |
314 resource_list.reset(); | |
315 | |
316 scheduler_->ContinueGetResourceList( | |
317 next_url, | |
318 google_apis::test_util::CreateCopyResultCallback( | |
319 &error, &resource_list)); | |
320 google_apis::test_util::RunBlockingPoolTask(); | |
321 | |
322 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
323 ASSERT_TRUE(resource_list); | |
324 } | |
325 | |
326 TEST_F(DriveSchedulerTest, GetResourceEntry) { | |
327 ConnectToWifi(); | |
328 | |
329 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
330 scoped_ptr<google_apis::ResourceEntry> entry; | |
331 | |
332 scheduler_->GetResourceEntry( | |
333 "file:2_file_resource_id", // resource ID | |
334 DriveClientContext(USER_INITIATED), | |
335 google_apis::test_util::CreateCopyResultCallback(&error, &entry)); | |
336 google_apis::test_util::RunBlockingPoolTask(); | |
337 | |
338 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
339 ASSERT_TRUE(entry); | |
340 } | |
341 | |
342 TEST_F(DriveSchedulerTest, DeleteResource) { | |
343 ConnectToWifi(); | |
344 | |
345 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
346 | |
347 scheduler_->DeleteResource( | |
348 "file:2_file_resource_id", | |
349 google_apis::test_util::CreateCopyResultCallback(&error)); | |
350 google_apis::test_util::RunBlockingPoolTask(); | |
351 | |
352 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
353 } | |
354 | |
355 TEST_F(DriveSchedulerTest, CopyHostedDocument) { | |
356 ConnectToWifi(); | |
357 | |
358 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
359 scoped_ptr<google_apis::ResourceEntry> entry; | |
360 | |
361 scheduler_->CopyHostedDocument( | |
362 "document:5_document_resource_id", // resource ID | |
363 "New Document", // new name | |
364 google_apis::test_util::CreateCopyResultCallback(&error, &entry)); | |
365 google_apis::test_util::RunBlockingPoolTask(); | |
366 | |
367 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
368 ASSERT_TRUE(entry); | |
369 } | |
370 | |
371 TEST_F(DriveSchedulerTest, RenameResource) { | |
372 ConnectToWifi(); | |
373 | |
374 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
375 | |
376 scheduler_->RenameResource( | |
377 "file:2_file_resource_id", | |
378 "New Name", | |
379 google_apis::test_util::CreateCopyResultCallback(&error)); | |
380 google_apis::test_util::RunBlockingPoolTask(); | |
381 | |
382 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
383 } | |
384 | |
385 TEST_F(DriveSchedulerTest, AddResourceToDirectory) { | |
386 ConnectToWifi(); | |
387 | |
388 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
389 | |
390 scheduler_->AddResourceToDirectory( | |
391 "folder:1_folder_resource_id", | |
392 "file:2_file_resource_id", | |
393 google_apis::test_util::CreateCopyResultCallback(&error)); | |
394 google_apis::test_util::RunBlockingPoolTask(); | |
395 | |
396 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
397 } | |
398 | |
399 TEST_F(DriveSchedulerTest, RemoveResourceFromDirectory) { | |
400 ConnectToWifi(); | |
401 | |
402 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
403 | |
404 scheduler_->RemoveResourceFromDirectory( | |
405 "folder:1_folder_resource_id", | |
406 "file:subdirectory_file_1_id", // resource ID | |
407 google_apis::test_util::CreateCopyResultCallback(&error)); | |
408 google_apis::test_util::RunBlockingPoolTask(); | |
409 | |
410 ASSERT_EQ(google_apis::HTTP_SUCCESS, error); | |
411 } | |
412 | |
413 TEST_F(DriveSchedulerTest, AddNewDirectory) { | |
414 ConnectToWifi(); | |
415 | |
416 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
417 scoped_ptr<google_apis::ResourceEntry> entry; | |
418 | |
419 scheduler_->AddNewDirectory( | |
420 fake_drive_service_->GetRootResourceId(), // Root directory. | |
421 "New Directory", | |
422 google_apis::test_util::CreateCopyResultCallback(&error, &entry)); | |
423 google_apis::test_util::RunBlockingPoolTask(); | |
424 | |
425 ASSERT_EQ(google_apis::HTTP_CREATED, error); | |
426 ASSERT_TRUE(entry); | |
427 } | |
428 | |
429 TEST_F(DriveSchedulerTest, GetResourceEntryPriority) { | |
430 // Disconnect from the network to prevent jobs from starting. | |
431 ConnectToNone(); | |
432 | |
433 std::string resource_1("file:1_file_resource_id"); | |
434 std::string resource_2("file:2_file_resource_id"); | |
435 std::string resource_3("file:3_file_resource_id"); | |
436 std::string resource_4("file:4_file_resource_id"); | |
437 std::vector<std::string> resource_ids; | |
438 | |
439 scheduler_->GetResourceEntry( | |
440 resource_1, // resource ID | |
441 DriveClientContext(USER_INITIATED), | |
442 base::Bind(&CopyResourceIdFromGetResourceEntryCallback, | |
443 &resource_ids, | |
444 resource_1)); | |
445 scheduler_->GetResourceEntry( | |
446 resource_2, // resource ID | |
447 DriveClientContext(PREFETCH), | |
448 base::Bind(&CopyResourceIdFromGetResourceEntryCallback, | |
449 &resource_ids, | |
450 resource_2)); | |
451 scheduler_->GetResourceEntry( | |
452 resource_3, // resource ID | |
453 DriveClientContext(BACKGROUND), | |
454 base::Bind(&CopyResourceIdFromGetResourceEntryCallback, | |
455 &resource_ids, | |
456 resource_3)); | |
457 scheduler_->GetResourceEntry( | |
458 resource_4, // resource ID | |
459 DriveClientContext(USER_INITIATED), | |
460 base::Bind(&CopyResourceIdFromGetResourceEntryCallback, | |
461 &resource_ids, | |
462 resource_4)); | |
463 | |
464 // Reconnect to the network to start all jobs. | |
465 ConnectToWifi(); | |
466 google_apis::test_util::RunBlockingPoolTask(); | |
467 | |
468 ASSERT_EQ(resource_ids.size(), 4ul); | |
469 ASSERT_EQ(resource_ids[0], resource_1); | |
470 ASSERT_EQ(resource_ids[1], resource_4); | |
471 ASSERT_EQ(resource_ids[2], resource_3); | |
472 ASSERT_EQ(resource_ids[3], resource_2); | |
473 } | |
474 | |
475 TEST_F(DriveSchedulerTest, GetResourceEntryNoConnection) { | |
476 ConnectToNone(); | |
477 | |
478 std::string resource("file:1_file_resource_id"); | |
479 std::vector<std::string> resource_ids; | |
480 | |
481 scheduler_->GetResourceEntry( | |
482 resource, // resource ID | |
483 DriveClientContext(BACKGROUND), | |
484 base::Bind(&CopyResourceIdFromGetResourceEntryCallback, | |
485 &resource_ids, | |
486 resource)); | |
487 google_apis::test_util::RunBlockingPoolTask(); | |
488 | |
489 ASSERT_EQ(resource_ids.size(), 0ul); | |
490 | |
491 // Reconnect to the net. | |
492 ConnectToWifi(); | |
493 | |
494 google_apis::test_util::RunBlockingPoolTask(); | |
495 | |
496 ASSERT_EQ(resource_ids.size(), 1ul); | |
497 ASSERT_EQ(resource_ids[0], resource); | |
498 } | |
499 | |
500 TEST_F(DriveSchedulerTest, DownloadFileCellularDisabled) { | |
501 ConnectToCellular(); | |
502 | |
503 // Disable fetching over cellular network. | |
504 profile_->GetPrefs()->SetBoolean(prefs::kDisableDriveOverCellular, true); | |
505 | |
506 // Try to get a file in the background | |
507 base::ScopedTempDir temp_dir; | |
508 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
509 | |
510 const GURL kContentUrl("https://file_content_url/"); | |
511 const base::FilePath kOutputFilePath = | |
512 temp_dir.path().AppendASCII("whatever.txt"); | |
513 google_apis::GDataErrorCode download_error = google_apis::GDATA_OTHER_ERROR; | |
514 base::FilePath output_file_path; | |
515 scheduler_->DownloadFile( | |
516 base::FilePath::FromUTF8Unsafe("drive/whatever.txt"), // virtual path | |
517 kOutputFilePath, | |
518 kContentUrl, | |
519 DriveClientContext(BACKGROUND), | |
520 google_apis::test_util::CreateCopyResultCallback( | |
521 &download_error, &output_file_path), | |
522 google_apis::GetContentCallback()); | |
523 // Metadata should still work | |
524 google_apis::GDataErrorCode metadata_error = google_apis::GDATA_OTHER_ERROR; | |
525 scoped_ptr<google_apis::AccountMetadata> account_metadata; | |
526 | |
527 // Try to get the metadata | |
528 scheduler_->GetAccountMetadata( | |
529 google_apis::test_util::CreateCopyResultCallback( | |
530 &metadata_error, &account_metadata)); | |
531 google_apis::test_util::RunBlockingPoolTask(); | |
532 | |
533 // Check the metadata | |
534 ASSERT_EQ(google_apis::HTTP_SUCCESS, metadata_error); | |
535 ASSERT_TRUE(account_metadata); | |
536 | |
537 // Check the download | |
538 EXPECT_EQ(google_apis::GDATA_OTHER_ERROR, download_error); | |
539 | |
540 // Switch to a Wifi connection | |
541 ConnectToWifi(); | |
542 | |
543 google_apis::test_util::RunBlockingPoolTask(); | |
544 | |
545 // Check the download again | |
546 EXPECT_EQ(google_apis::HTTP_SUCCESS, download_error); | |
547 std::string content; | |
548 EXPECT_EQ(output_file_path, kOutputFilePath); | |
549 ASSERT_TRUE(file_util::ReadFileToString(output_file_path, &content)); | |
550 // The content is "x"s of the file size specified in root_feed.json. | |
551 EXPECT_EQ("xxxxxxxxxx", content); | |
552 } | |
553 | |
554 TEST_F(DriveSchedulerTest, DownloadFileWimaxDisabled) { | |
555 ConnectToWimax(); | |
556 | |
557 // Disable fetching over cellular network. | |
558 profile_->GetPrefs()->SetBoolean(prefs::kDisableDriveOverCellular, true); | |
559 | |
560 // Try to get a file in the background | |
561 base::ScopedTempDir temp_dir; | |
562 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
563 | |
564 const GURL kContentUrl("https://file_content_url/"); | |
565 const base::FilePath kOutputFilePath = | |
566 temp_dir.path().AppendASCII("whatever.txt"); | |
567 google_apis::GDataErrorCode download_error = google_apis::GDATA_OTHER_ERROR; | |
568 base::FilePath output_file_path; | |
569 scheduler_->DownloadFile( | |
570 base::FilePath::FromUTF8Unsafe("drive/whatever.txt"), // virtual path | |
571 kOutputFilePath, | |
572 kContentUrl, | |
573 DriveClientContext(BACKGROUND), | |
574 google_apis::test_util::CreateCopyResultCallback( | |
575 &download_error, &output_file_path), | |
576 google_apis::GetContentCallback()); | |
577 // Metadata should still work | |
578 google_apis::GDataErrorCode metadata_error = google_apis::GDATA_OTHER_ERROR; | |
579 scoped_ptr<google_apis::AccountMetadata> account_metadata; | |
580 | |
581 // Try to get the metadata | |
582 scheduler_->GetAccountMetadata( | |
583 google_apis::test_util::CreateCopyResultCallback( | |
584 &metadata_error, &account_metadata)); | |
585 google_apis::test_util::RunBlockingPoolTask(); | |
586 | |
587 // Check the metadata | |
588 ASSERT_EQ(google_apis::HTTP_SUCCESS, metadata_error); | |
589 ASSERT_TRUE(account_metadata); | |
590 | |
591 // Check the download | |
592 EXPECT_EQ(google_apis::GDATA_OTHER_ERROR, download_error); | |
593 | |
594 // Switch to a Wifi connection | |
595 ConnectToWifi(); | |
596 | |
597 google_apis::test_util::RunBlockingPoolTask(); | |
598 | |
599 // Check the download again | |
600 EXPECT_EQ(google_apis::HTTP_SUCCESS, download_error); | |
601 std::string content; | |
602 EXPECT_EQ(output_file_path, kOutputFilePath); | |
603 ASSERT_TRUE(file_util::ReadFileToString(output_file_path, &content)); | |
604 // The content is "x"s of the file size specified in root_feed.json. | |
605 EXPECT_EQ("xxxxxxxxxx", content); | |
606 } | |
607 | |
608 TEST_F(DriveSchedulerTest, DownloadFileCellularEnabled) { | |
609 ConnectToCellular(); | |
610 | |
611 // Enable fetching over cellular network. | |
612 profile_->GetPrefs()->SetBoolean(prefs::kDisableDriveOverCellular, false); | |
613 | |
614 // Try to get a file in the background | |
615 base::ScopedTempDir temp_dir; | |
616 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
617 | |
618 const GURL kContentUrl("https://file_content_url/"); | |
619 const base::FilePath kOutputFilePath = | |
620 temp_dir.path().AppendASCII("whatever.txt"); | |
621 google_apis::GDataErrorCode download_error = google_apis::GDATA_OTHER_ERROR; | |
622 base::FilePath output_file_path; | |
623 scheduler_->DownloadFile( | |
624 base::FilePath::FromUTF8Unsafe("drive/whatever.txt"), // virtual path | |
625 kOutputFilePath, | |
626 kContentUrl, | |
627 DriveClientContext(BACKGROUND), | |
628 google_apis::test_util::CreateCopyResultCallback( | |
629 &download_error, &output_file_path), | |
630 google_apis::GetContentCallback()); | |
631 // Metadata should still work | |
632 google_apis::GDataErrorCode metadata_error = google_apis::GDATA_OTHER_ERROR; | |
633 scoped_ptr<google_apis::AccountMetadata> account_metadata; | |
634 | |
635 // Try to get the metadata | |
636 scheduler_->GetAccountMetadata( | |
637 google_apis::test_util::CreateCopyResultCallback( | |
638 &metadata_error, &account_metadata)); | |
639 google_apis::test_util::RunBlockingPoolTask(); | |
640 | |
641 // Check the metadata | |
642 ASSERT_EQ(google_apis::HTTP_SUCCESS, metadata_error); | |
643 ASSERT_TRUE(account_metadata); | |
644 | |
645 // Check the download | |
646 EXPECT_EQ(google_apis::HTTP_SUCCESS, download_error); | |
647 std::string content; | |
648 EXPECT_EQ(output_file_path, kOutputFilePath); | |
649 ASSERT_TRUE(file_util::ReadFileToString(output_file_path, &content)); | |
650 // The content is "x"s of the file size specified in root_feed.json. | |
651 EXPECT_EQ("xxxxxxxxxx", content); | |
652 } | |
653 | |
654 TEST_F(DriveSchedulerTest, DownloadFileWimaxEnabled) { | |
655 ConnectToWimax(); | |
656 | |
657 // Enable fetching over cellular network. | |
658 profile_->GetPrefs()->SetBoolean(prefs::kDisableDriveOverCellular, false); | |
659 | |
660 // Try to get a file in the background | |
661 base::ScopedTempDir temp_dir; | |
662 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
663 | |
664 const GURL kContentUrl("https://file_content_url/"); | |
665 const base::FilePath kOutputFilePath = | |
666 temp_dir.path().AppendASCII("whatever.txt"); | |
667 google_apis::GDataErrorCode download_error = google_apis::GDATA_OTHER_ERROR; | |
668 base::FilePath output_file_path; | |
669 scheduler_->DownloadFile( | |
670 base::FilePath::FromUTF8Unsafe("drive/whatever.txt"), // virtual path | |
671 kOutputFilePath, | |
672 kContentUrl, | |
673 DriveClientContext(BACKGROUND), | |
674 google_apis::test_util::CreateCopyResultCallback( | |
675 &download_error, &output_file_path), | |
676 google_apis::GetContentCallback()); | |
677 // Metadata should still work | |
678 google_apis::GDataErrorCode metadata_error = google_apis::GDATA_OTHER_ERROR; | |
679 scoped_ptr<google_apis::AccountMetadata> account_metadata; | |
680 | |
681 // Try to get the metadata | |
682 scheduler_->GetAccountMetadata( | |
683 google_apis::test_util::CreateCopyResultCallback( | |
684 &metadata_error, &account_metadata)); | |
685 google_apis::test_util::RunBlockingPoolTask(); | |
686 | |
687 // Check the metadata | |
688 ASSERT_EQ(google_apis::HTTP_SUCCESS, metadata_error); | |
689 ASSERT_TRUE(account_metadata); | |
690 | |
691 // Check the download | |
692 EXPECT_EQ(google_apis::HTTP_SUCCESS, download_error); | |
693 std::string content; | |
694 EXPECT_EQ(output_file_path, kOutputFilePath); | |
695 ASSERT_TRUE(file_util::ReadFileToString(output_file_path, &content)); | |
696 // The content is "x"s of the file size specified in root_feed.json. | |
697 EXPECT_EQ("xxxxxxxxxx", content); | |
698 } | |
699 | |
700 TEST_F(DriveSchedulerTest, JobInfo) { | |
701 JobListLogger logger; | |
702 scheduler_->AddObserver(&logger); | |
703 | |
704 // Disable background upload/download. | |
705 ConnectToWimax(); | |
706 profile_->GetPrefs()->SetBoolean(prefs::kDisableDriveOverCellular, true); | |
707 | |
708 base::ScopedTempDir temp_dir; | |
709 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
710 | |
711 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
712 scoped_ptr<google_apis::ResourceEntry> entry; | |
713 scoped_ptr<google_apis::AccountMetadata> account_metadata; | |
714 base::FilePath path; | |
715 | |
716 std::set<JobType> expected_types; | |
717 | |
718 // Add many jobs. | |
719 expected_types.insert(TYPE_ADD_NEW_DIRECTORY); | |
720 scheduler_->AddNewDirectory( | |
721 fake_drive_service_->GetRootResourceId(), | |
722 "New Directory", | |
723 google_apis::test_util::CreateCopyResultCallback(&error, &entry)); | |
724 expected_types.insert(TYPE_GET_ACCOUNT_METADATA); | |
725 scheduler_->GetAccountMetadata( | |
726 google_apis::test_util::CreateCopyResultCallback( | |
727 &error, &account_metadata)); | |
728 expected_types.insert(TYPE_RENAME_RESOURCE); | |
729 scheduler_->RenameResource( | |
730 "file:2_file_resource_id", | |
731 "New Name", | |
732 google_apis::test_util::CreateCopyResultCallback(&error)); | |
733 expected_types.insert(TYPE_DOWNLOAD_FILE); | |
734 scheduler_->DownloadFile( | |
735 base::FilePath::FromUTF8Unsafe("drive/whatever.txt"), // virtual path | |
736 temp_dir.path().AppendASCII("whatever.txt"), | |
737 GURL("https://file_content_url/"), | |
738 DriveClientContext(BACKGROUND), | |
739 google_apis::test_util::CreateCopyResultCallback(&error, &path), | |
740 google_apis::GetContentCallback()); | |
741 | |
742 // The number of jobs queued so far. | |
743 EXPECT_EQ(4U, scheduler_->GetJobInfoList().size()); | |
744 EXPECT_TRUE(logger.Has(JobListLogger::ADDED, TYPE_ADD_NEW_DIRECTORY)); | |
745 EXPECT_TRUE(logger.Has(JobListLogger::ADDED, TYPE_GET_ACCOUNT_METADATA)); | |
746 EXPECT_TRUE(logger.Has(JobListLogger::ADDED, TYPE_RENAME_RESOURCE)); | |
747 EXPECT_TRUE(logger.Has(JobListLogger::ADDED, TYPE_DOWNLOAD_FILE)); | |
748 EXPECT_FALSE(logger.Has(JobListLogger::DONE, TYPE_ADD_NEW_DIRECTORY)); | |
749 EXPECT_FALSE(logger.Has(JobListLogger::DONE, TYPE_GET_ACCOUNT_METADATA)); | |
750 EXPECT_FALSE(logger.Has(JobListLogger::DONE, TYPE_RENAME_RESOURCE)); | |
751 EXPECT_FALSE(logger.Has(JobListLogger::DONE, TYPE_DOWNLOAD_FILE)); | |
752 | |
753 // Add more jobs. | |
754 expected_types.insert(TYPE_ADD_RESOURCE_TO_DIRECTORY); | |
755 scheduler_->AddResourceToDirectory( | |
756 "folder:1_folder_resource_id", | |
757 "file:2_file_resource_id", | |
758 google_apis::test_util::CreateCopyResultCallback(&error)); | |
759 expected_types.insert(TYPE_COPY_HOSTED_DOCUMENT); | |
760 scheduler_->CopyHostedDocument( | |
761 "document:5_document_resource_id", | |
762 "New Document", | |
763 google_apis::test_util::CreateCopyResultCallback(&error, &entry)); | |
764 | |
765 // 6 jobs in total were queued. | |
766 std::vector<JobInfo> jobs = scheduler_->GetJobInfoList(); | |
767 EXPECT_EQ(6U, jobs.size()); | |
768 std::set<JobType> actual_types; | |
769 std::set<JobID> job_ids; | |
770 for (size_t i = 0; i < jobs.size(); ++i) { | |
771 actual_types.insert(jobs[i].job_type); | |
772 job_ids.insert(jobs[i].job_id); | |
773 } | |
774 EXPECT_EQ(expected_types, actual_types); | |
775 EXPECT_EQ(6U, job_ids.size()) << "All job IDs must be unique"; | |
776 EXPECT_TRUE(logger.Has(JobListLogger::ADDED, TYPE_ADD_RESOURCE_TO_DIRECTORY)); | |
777 EXPECT_TRUE(logger.Has(JobListLogger::ADDED, TYPE_COPY_HOSTED_DOCUMENT)); | |
778 EXPECT_FALSE(logger.Has(JobListLogger::DONE, TYPE_ADD_RESOURCE_TO_DIRECTORY)); | |
779 EXPECT_FALSE(logger.Has(JobListLogger::DONE, TYPE_COPY_HOSTED_DOCUMENT)); | |
780 | |
781 // Run the jobs. | |
782 google_apis::test_util::RunBlockingPoolTask(); | |
783 | |
784 // All jobs except the BACKGROUND job should have started running (UPDATED) | |
785 // and then finished (DONE). | |
786 jobs = scheduler_->GetJobInfoList(); | |
787 ASSERT_EQ(1U, jobs.size()); | |
788 EXPECT_EQ(TYPE_DOWNLOAD_FILE, jobs[0].job_type); | |
789 | |
790 EXPECT_TRUE(logger.Has(JobListLogger::UPDATED, TYPE_ADD_NEW_DIRECTORY)); | |
791 EXPECT_TRUE(logger.Has(JobListLogger::UPDATED, TYPE_GET_ACCOUNT_METADATA)); | |
792 EXPECT_TRUE(logger.Has(JobListLogger::UPDATED, TYPE_RENAME_RESOURCE)); | |
793 EXPECT_TRUE(logger.Has(JobListLogger::UPDATED, | |
794 TYPE_ADD_RESOURCE_TO_DIRECTORY)); | |
795 EXPECT_TRUE(logger.Has(JobListLogger::UPDATED, TYPE_COPY_HOSTED_DOCUMENT)); | |
796 EXPECT_FALSE(logger.Has(JobListLogger::UPDATED, TYPE_DOWNLOAD_FILE)); | |
797 | |
798 EXPECT_TRUE(logger.Has(JobListLogger::DONE, TYPE_ADD_NEW_DIRECTORY)); | |
799 EXPECT_TRUE(logger.Has(JobListLogger::DONE, TYPE_GET_ACCOUNT_METADATA)); | |
800 EXPECT_TRUE(logger.Has(JobListLogger::DONE, TYPE_RENAME_RESOURCE)); | |
801 EXPECT_TRUE(logger.Has(JobListLogger::DONE, TYPE_ADD_RESOURCE_TO_DIRECTORY)); | |
802 EXPECT_TRUE(logger.Has(JobListLogger::DONE, TYPE_COPY_HOSTED_DOCUMENT)); | |
803 EXPECT_FALSE(logger.Has(JobListLogger::DONE, TYPE_DOWNLOAD_FILE)); | |
804 | |
805 // Run the background downloading job as well. | |
806 ConnectToWifi(); | |
807 google_apis::test_util::RunBlockingPoolTask(); | |
808 | |
809 // All jobs should have finished. | |
810 EXPECT_EQ(0U, scheduler_->GetJobInfoList().size()); | |
811 EXPECT_TRUE(logger.Has(JobListLogger::UPDATED, TYPE_DOWNLOAD_FILE)); | |
812 EXPECT_TRUE(logger.Has(JobListLogger::DONE, TYPE_DOWNLOAD_FILE)); | |
813 } | |
814 | |
815 | |
816 TEST_F(DriveSchedulerTest, JobInfoProgress) { | |
817 JobListLogger logger; | |
818 scheduler_->AddObserver(&logger); | |
819 | |
820 ConnectToWifi(); | |
821 | |
822 base::ScopedTempDir temp_dir; | |
823 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
824 | |
825 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
826 base::FilePath path; | |
827 | |
828 // Download job. | |
829 scheduler_->DownloadFile( | |
830 base::FilePath::FromUTF8Unsafe("drive/whatever.txt"), // virtual path | |
831 temp_dir.path().AppendASCII("whatever.txt"), | |
832 GURL("https://file_content_url/"), | |
833 DriveClientContext(BACKGROUND), | |
834 google_apis::test_util::CreateCopyResultCallback(&error, &path), | |
835 google_apis::GetContentCallback()); | |
836 google_apis::test_util::RunBlockingPoolTask(); | |
837 | |
838 std::vector<int64> download_progress; | |
839 logger.GetProgressInfo(TYPE_DOWNLOAD_FILE, &download_progress); | |
840 ASSERT_TRUE(!download_progress.empty()); | |
841 EXPECT_TRUE(base::STLIsSorted(download_progress)); | |
842 EXPECT_GE(download_progress.front(), 0); | |
843 EXPECT_LE(download_progress.back(), 10); | |
844 | |
845 // Upload job. | |
846 path = temp_dir.path().AppendASCII("new_file.txt"); | |
847 file_util::WriteFile(path, "Hello", 5); | |
848 google_apis::DriveUploadError upload_error = | |
849 google_apis::DRIVE_UPLOAD_ERROR_ABORT; | |
850 scoped_ptr<google_apis::ResourceEntry> entry; | |
851 | |
852 scheduler_->UploadNewFile( | |
853 fake_drive_service_->GetRootResourceId(), | |
854 base::FilePath::FromUTF8Unsafe("drive/new_file.txt"), | |
855 path, | |
856 "dummy title", | |
857 "plain/plain", | |
858 DriveClientContext(BACKGROUND), | |
859 google_apis::test_util::CreateCopyResultCallback( | |
860 &upload_error, &path, &path, &entry)); | |
861 google_apis::test_util::RunBlockingPoolTask(); | |
862 | |
863 std::vector<int64> upload_progress; | |
864 logger.GetProgressInfo(TYPE_UPLOAD_NEW_FILE, &upload_progress); | |
865 ASSERT_TRUE(!upload_progress.empty()); | |
866 EXPECT_TRUE(base::STLIsSorted(upload_progress)); | |
867 EXPECT_GE(upload_progress.front(), 0); | |
868 EXPECT_LE(upload_progress.back(), 5); | |
869 } | |
870 | |
871 } // namespace drive | |
OLD | NEW |