Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/drive/job_scheduler.h" | 5 #include "chrome/browser/chromeos/drive/job_scheduler.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 79 } | 79 } |
| 80 | 80 |
| 81 virtual void OnJobDone(const JobInfo& info, FileError error) OVERRIDE { | 81 virtual void OnJobDone(const JobInfo& info, FileError error) OVERRIDE { |
| 82 events.push_back(EventLog(DONE, info)); | 82 events.push_back(EventLog(DONE, info)); |
| 83 } | 83 } |
| 84 | 84 |
| 85 private: | 85 private: |
| 86 std::vector<EventLog> events; | 86 std::vector<EventLog> events; |
| 87 }; | 87 }; |
| 88 | 88 |
| 89 // Fake drive service extended for testing cancellation. | |
| 90 // When set_upload_new_file_cancelable is set, this Drive service starts | |
|
hashimoto
2013/10/16 05:50:10
nit: "upload_new_file_cancelable is set" or "set_u
kinaba
2013/10/16 06:10:53
Done.
| |
| 91 // returning a closure to cancel from InitiateUploadNewFile(). The task will | |
| 92 // finish only when the cancel closure is called. | |
| 93 class CancelTestableFakeDriveService : public FakeDriveService { | |
| 94 public: | |
| 95 CancelTestableFakeDriveService() | |
| 96 : upload_new_file_cancelable_(false) { | |
| 97 } | |
| 98 | |
| 99 void set_upload_new_file_cancelable(bool cancelable) { | |
| 100 upload_new_file_cancelable_ = cancelable; | |
| 101 } | |
| 102 | |
| 103 virtual google_apis::CancelCallback InitiateUploadNewFile( | |
| 104 const std::string& content_type, | |
| 105 int64 content_length, | |
| 106 const std::string& parent_resource_id, | |
| 107 const std::string& title, | |
| 108 const google_apis::InitiateUploadCallback& callback) OVERRIDE { | |
| 109 if (upload_new_file_cancelable_) | |
| 110 return base::Bind(callback, google_apis::GDATA_CANCELLED, GURL()); | |
| 111 | |
| 112 return FakeDriveService::InitiateUploadNewFile(content_type, | |
| 113 content_length, | |
| 114 parent_resource_id, | |
| 115 title, | |
| 116 callback); | |
| 117 } | |
| 118 | |
| 119 private: | |
| 120 bool upload_new_file_cancelable_; | |
| 121 }; | |
| 122 | |
| 89 } // namespace | 123 } // namespace |
| 90 | 124 |
| 91 class JobSchedulerTest : public testing::Test { | 125 class JobSchedulerTest : public testing::Test { |
| 92 public: | 126 public: |
| 93 JobSchedulerTest() | 127 JobSchedulerTest() |
| 94 : pref_service_(new TestingPrefServiceSimple) { | 128 : pref_service_(new TestingPrefServiceSimple) { |
| 95 test_util::RegisterDrivePrefs(pref_service_->registry()); | 129 test_util::RegisterDrivePrefs(pref_service_->registry()); |
| 96 } | 130 } |
| 97 | 131 |
| 98 virtual void SetUp() OVERRIDE { | 132 virtual void SetUp() OVERRIDE { |
| 99 fake_network_change_notifier_.reset( | 133 fake_network_change_notifier_.reset( |
| 100 new test_util::FakeNetworkChangeNotifier); | 134 new test_util::FakeNetworkChangeNotifier); |
| 101 | 135 |
| 102 fake_drive_service_.reset(new FakeDriveService()); | 136 fake_drive_service_.reset(new CancelTestableFakeDriveService); |
| 103 fake_drive_service_->LoadResourceListForWapi( | 137 fake_drive_service_->LoadResourceListForWapi( |
| 104 "gdata/root_feed.json"); | 138 "gdata/root_feed.json"); |
| 105 fake_drive_service_->LoadAccountMetadataForWapi( | 139 fake_drive_service_->LoadAccountMetadataForWapi( |
| 106 "gdata/account_metadata.json"); | 140 "gdata/account_metadata.json"); |
| 107 fake_drive_service_->LoadAppListForDriveApi( | 141 fake_drive_service_->LoadAppListForDriveApi( |
| 108 "drive/applist.json"); | 142 "drive/applist.json"); |
| 109 | 143 |
| 110 scheduler_.reset(new JobScheduler(pref_service_.get(), | 144 scheduler_.reset(new JobScheduler(pref_service_.get(), |
| 111 fake_drive_service_.get(), | 145 fake_drive_service_.get(), |
| 112 base::MessageLoopProxy::current().get())); | 146 base::MessageLoopProxy::current().get())); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 141 } | 175 } |
| 142 | 176 |
| 143 static int GetMetadataQueueMaxJobCount() { | 177 static int GetMetadataQueueMaxJobCount() { |
| 144 return JobScheduler::kMaxJobCount[JobScheduler::METADATA_QUEUE]; | 178 return JobScheduler::kMaxJobCount[JobScheduler::METADATA_QUEUE]; |
| 145 } | 179 } |
| 146 | 180 |
| 147 content::TestBrowserThreadBundle thread_bundle_; | 181 content::TestBrowserThreadBundle thread_bundle_; |
| 148 scoped_ptr<TestingPrefServiceSimple> pref_service_; | 182 scoped_ptr<TestingPrefServiceSimple> pref_service_; |
| 149 scoped_ptr<test_util::FakeNetworkChangeNotifier> | 183 scoped_ptr<test_util::FakeNetworkChangeNotifier> |
| 150 fake_network_change_notifier_; | 184 fake_network_change_notifier_; |
| 151 scoped_ptr<FakeDriveService> fake_drive_service_; | 185 scoped_ptr<CancelTestableFakeDriveService> fake_drive_service_; |
| 152 scoped_ptr<JobScheduler> scheduler_; | 186 scoped_ptr<JobScheduler> scheduler_; |
| 153 }; | 187 }; |
| 154 | 188 |
| 155 TEST_F(JobSchedulerTest, GetAboutResource) { | 189 TEST_F(JobSchedulerTest, GetAboutResource) { |
| 156 ConnectToWifi(); | 190 ConnectToWifi(); |
| 157 | 191 |
| 158 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | 192 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; |
| 159 scoped_ptr<google_apis::AboutResource> about_resource; | 193 scoped_ptr<google_apis::AboutResource> about_resource; |
| 160 scheduler_->GetAboutResource( | 194 scheduler_->GetAboutResource( |
| 161 google_apis::test_util::CreateCopyResultCallback( | 195 google_apis::test_util::CreateCopyResultCallback( |
| (...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 981 google_apis::test_util::CreateCopyResultCallback(&error2, &entry)); | 1015 google_apis::test_util::CreateCopyResultCallback(&error2, &entry)); |
| 982 | 1016 |
| 983 // Cancel the first one. | 1017 // Cancel the first one. |
| 984 scheduler_->CancelJob(first_job_id); | 1018 scheduler_->CancelJob(first_job_id); |
| 985 | 1019 |
| 986 // Only the first job should be cancelled. | 1020 // Only the first job should be cancelled. |
| 987 ConnectToWifi(); | 1021 ConnectToWifi(); |
| 988 base::RunLoop().RunUntilIdle(); | 1022 base::RunLoop().RunUntilIdle(); |
| 989 EXPECT_EQ(google_apis::GDATA_CANCELLED, error1); | 1023 EXPECT_EQ(google_apis::GDATA_CANCELLED, error1); |
| 990 EXPECT_EQ(google_apis::HTTP_SUCCESS, error2); | 1024 EXPECT_EQ(google_apis::HTTP_SUCCESS, error2); |
| 1025 EXPECT_TRUE(scheduler_->GetJobInfoList().empty()); | |
| 991 } | 1026 } |
| 992 | 1027 |
| 993 TEST_F(JobSchedulerTest, CancelRunningJob) { | 1028 TEST_F(JobSchedulerTest, CancelRunningJob) { |
| 994 // TODO(kinaba): test for canceling jobs running in the Drive service. | 1029 ConnectToWifi(); |
| 995 // We need to slightly extend FakeDriveService to support CancelCallback. | 1030 |
| 1031 base::ScopedTempDir temp_dir; | |
| 1032 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
| 1033 base::FilePath upload_path = temp_dir.path().AppendASCII("new_file.txt"); | |
| 1034 ASSERT_TRUE(google_apis::test_util::WriteStringToFile(upload_path, "Hello")); | |
| 1035 | |
| 1036 // Run as a cancelable task. | |
| 1037 fake_drive_service_->set_upload_new_file_cancelable(true); | |
| 1038 google_apis::GDataErrorCode error1 = google_apis::GDATA_OTHER_ERROR; | |
| 1039 scoped_ptr<google_apis::ResourceEntry> entry; | |
| 1040 scheduler_->UploadNewFile( | |
| 1041 fake_drive_service_->GetRootResourceId(), | |
| 1042 base::FilePath::FromUTF8Unsafe("dummy/path"), | |
| 1043 upload_path, | |
| 1044 "dummy title 1", | |
| 1045 "text/plain", | |
| 1046 ClientContext(USER_INITIATED), | |
| 1047 google_apis::test_util::CreateCopyResultCallback(&error1, &entry)); | |
| 1048 | |
| 1049 const std::vector<JobInfo>& jobs = scheduler_->GetJobInfoList(); | |
| 1050 ASSERT_EQ(1u, jobs.size()); | |
| 1051 ASSERT_EQ(STATE_RUNNING, jobs[0].state); // It's running. | |
| 1052 JobID first_job_id = jobs[0].job_id; | |
| 1053 | |
| 1054 // Start the second job normally. | |
| 1055 fake_drive_service_->set_upload_new_file_cancelable(false); | |
| 1056 google_apis::GDataErrorCode error2 = google_apis::GDATA_OTHER_ERROR; | |
| 1057 scheduler_->UploadNewFile( | |
| 1058 fake_drive_service_->GetRootResourceId(), | |
| 1059 base::FilePath::FromUTF8Unsafe("dummy/path"), | |
| 1060 upload_path, | |
| 1061 "dummy title 2", | |
| 1062 "text/plain", | |
| 1063 ClientContext(USER_INITIATED), | |
| 1064 google_apis::test_util::CreateCopyResultCallback(&error2, &entry)); | |
| 1065 | |
| 1066 // Cancel the first one. | |
| 1067 scheduler_->CancelJob(first_job_id); | |
| 1068 | |
| 1069 // Only the first job should be cancelled. | |
| 1070 base::RunLoop().RunUntilIdle(); | |
| 1071 EXPECT_EQ(google_apis::GDATA_CANCELLED, error1); | |
| 1072 EXPECT_EQ(google_apis::HTTP_SUCCESS, error2); | |
| 1073 EXPECT_TRUE(scheduler_->GetJobInfoList().empty()); | |
| 996 } | 1074 } |
| 997 | 1075 |
| 998 } // namespace drive | 1076 } // namespace drive |
| OLD | NEW |