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

Side by Side Diff: chrome/browser/chromeos/drive/drive_scheduler_unittest.cc

Issue 14493009: drive: Rename DriveScheduler to JobScheduler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix indent Created 7 years, 8 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
(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
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/drive/drive_scheduler.cc ('k') | chrome/browser/chromeos/drive/drive_system_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698