| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/drive_url_request_job.h" | 5 #include "chrome/browser/chromeos/drive/drive_url_request_job.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/run_loop.h" |
| 10 #include "base/sequenced_task_runner.h" | 11 #include "base/sequenced_task_runner.h" |
| 11 #include "base/threading/sequenced_worker_pool.h" | 12 #include "base/threading/sequenced_worker_pool.h" |
| 12 #include "base/threading/thread.h" | 13 #include "base/threading/thread.h" |
| 13 #include "chrome/browser/chromeos/drive/drive_file_stream_reader.h" | 14 #include "chrome/browser/chromeos/drive/drive_file_stream_reader.h" |
| 14 #include "chrome/browser/chromeos/drive/fake_file_system.h" | 15 #include "chrome/browser/chromeos/drive/fake_file_system.h" |
| 15 #include "chrome/browser/chromeos/drive/file_system_util.h" | 16 #include "chrome/browser/chromeos/drive/file_system_util.h" |
| 16 #include "chrome/browser/chromeos/drive/test_util.h" | 17 #include "chrome/browser/chromeos/drive/test_util.h" |
| 17 #include "chrome/browser/drive/fake_drive_service.h" | 18 #include "chrome/browser/drive/fake_drive_service.h" |
| 18 #include "chrome/browser/google_apis/task_util.h" | 19 #include "chrome/browser/google_apis/task_util.h" |
| 19 #include "chrome/browser/google_apis/test_util.h" | 20 #include "chrome/browser/google_apis/test_util.h" |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 new base::Thread("ReadDriveFileSync")); | 150 new base::Thread("ReadDriveFileSync")); |
| 150 if (!worker_thread->Start()) | 151 if (!worker_thread->Start()) |
| 151 return false; | 152 return false; |
| 152 | 153 |
| 153 scoped_ptr<DriveFileStreamReader> reader(new DriveFileStreamReader( | 154 scoped_ptr<DriveFileStreamReader> reader(new DriveFileStreamReader( |
| 154 base::Bind(&DriveURLRequestJobTest::GetFileSystem, | 155 base::Bind(&DriveURLRequestJobTest::GetFileSystem, |
| 155 base::Unretained(this)), | 156 base::Unretained(this)), |
| 156 worker_thread->message_loop_proxy())); | 157 worker_thread->message_loop_proxy())); |
| 157 int error = net::ERR_FAILED; | 158 int error = net::ERR_FAILED; |
| 158 scoped_ptr<ResourceEntry> entry; | 159 scoped_ptr<ResourceEntry> entry; |
| 159 reader->Initialize( | 160 { |
| 160 file_path, | 161 base::RunLoop run_loop; |
| 161 net::HttpByteRange(), | 162 reader->Initialize( |
| 162 google_apis::CreateComposedCallback( | 163 file_path, |
| 163 base::Bind(&google_apis::test_util::RunAndQuit), | 164 net::HttpByteRange(), |
| 164 google_apis::test_util::CreateCopyResultCallback( | 165 google_apis::test_util::CreateQuitCallback( |
| 165 &error, &entry))); | 166 &run_loop, |
| 166 base::MessageLoop::current()->Run(); | 167 google_apis::test_util::CreateCopyResultCallback( |
| 168 &error, &entry))); |
| 169 run_loop.Run(); |
| 170 } |
| 167 if (error != net::OK || !entry) | 171 if (error != net::OK || !entry) |
| 168 return false; | 172 return false; |
| 169 | 173 |
| 170 // Read data from the reader. | 174 // Read data from the reader. |
| 171 std::string content; | 175 std::string content; |
| 172 if (test_util::ReadAllData(reader.get(), &content) != net::OK) | 176 if (test_util::ReadAllData(reader.get(), &content) != net::OK) |
| 173 return false; | 177 return false; |
| 174 | 178 |
| 175 if (static_cast<size_t>(entry->file_info().size()) != content.size()) | 179 if (static_cast<size_t>(entry->file_info().size()) != content.size()) |
| 176 return false; | 180 return false; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 190 scoped_ptr<TestDelegate> test_delegate_; | 194 scoped_ptr<TestDelegate> test_delegate_; |
| 191 }; | 195 }; |
| 192 | 196 |
| 193 TEST_F(DriveURLRequestJobTest, NonGetMethod) { | 197 TEST_F(DriveURLRequestJobTest, NonGetMethod) { |
| 194 net::URLRequest request( | 198 net::URLRequest request( |
| 195 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), | 199 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), |
| 196 url_request_context_.get(), test_network_delegate_.get()); | 200 url_request_context_.get(), test_network_delegate_.get()); |
| 197 request.set_method("POST"); // Set non "GET" method. | 201 request.set_method("POST"); // Set non "GET" method. |
| 198 request.Start(); | 202 request.Start(); |
| 199 | 203 |
| 200 base::MessageLoop::current()->Run(); | 204 base::RunLoop().Run(); |
| 201 | 205 |
| 202 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 206 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
| 203 EXPECT_EQ(net::ERR_METHOD_NOT_SUPPORTED, request.status().error()); | 207 EXPECT_EQ(net::ERR_METHOD_NOT_SUPPORTED, request.status().error()); |
| 204 } | 208 } |
| 205 | 209 |
| 206 TEST_F(DriveURLRequestJobTest, RegularFile) { | 210 TEST_F(DriveURLRequestJobTest, RegularFile) { |
| 207 const GURL kTestUrl("drive:drive/root/File 1.txt"); | 211 const GURL kTestUrl("drive:drive/root/File 1.txt"); |
| 208 const base::FilePath kTestFilePath("drive/root/File 1.txt"); | 212 const base::FilePath kTestFilePath("drive/root/File 1.txt"); |
| 209 | 213 |
| 210 // For the first time, the file should be fetched from the server. | 214 // For the first time, the file should be fetched from the server. |
| 211 { | 215 { |
| 212 net::URLRequest request( | 216 net::URLRequest request( |
| 213 kTestUrl, test_delegate_.get(), | 217 kTestUrl, test_delegate_.get(), |
| 214 url_request_context_.get(), test_network_delegate_.get()); | 218 url_request_context_.get(), test_network_delegate_.get()); |
| 215 request.Start(); | 219 request.Start(); |
| 216 | 220 |
| 217 base::MessageLoop::current()->Run(); | 221 base::RunLoop().Run(); |
| 218 | 222 |
| 219 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 223 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
| 220 // It looks weird, but the mime type for the "File 1.txt" is "audio/mpeg" | 224 // It looks weird, but the mime type for the "File 1.txt" is "audio/mpeg" |
| 221 // on the server. | 225 // on the server. |
| 222 std::string mime_type; | 226 std::string mime_type; |
| 223 request.GetMimeType(&mime_type); | 227 request.GetMimeType(&mime_type); |
| 224 EXPECT_EQ("audio/mpeg", mime_type); | 228 EXPECT_EQ("audio/mpeg", mime_type); |
| 225 | 229 |
| 226 // Reading file must be done after |request| runs, otherwise | 230 // Reading file must be done after |request| runs, otherwise |
| 227 // it'll create a local cache file, and we cannot test correctly. | 231 // it'll create a local cache file, and we cannot test correctly. |
| 228 std::string expected_data; | 232 std::string expected_data; |
| 229 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); | 233 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); |
| 230 EXPECT_EQ(expected_data, test_delegate_->data_received()); | 234 EXPECT_EQ(expected_data, test_delegate_->data_received()); |
| 231 } | 235 } |
| 232 | 236 |
| 233 // For the second time, the locally cached file should be used. | 237 // For the second time, the locally cached file should be used. |
| 234 // The caching emulation is done by FakeFileSystem. | 238 // The caching emulation is done by FakeFileSystem. |
| 235 { | 239 { |
| 236 test_delegate_.reset(new TestDelegate); | 240 test_delegate_.reset(new TestDelegate); |
| 237 net::URLRequest request( | 241 net::URLRequest request( |
| 238 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), | 242 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), |
| 239 url_request_context_.get(), test_network_delegate_.get()); | 243 url_request_context_.get(), test_network_delegate_.get()); |
| 240 request.Start(); | 244 request.Start(); |
| 241 | 245 |
| 242 base::MessageLoop::current()->Run(); | 246 base::RunLoop().Run(); |
| 243 | 247 |
| 244 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 248 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
| 245 std::string mime_type; | 249 std::string mime_type; |
| 246 request.GetMimeType(&mime_type); | 250 request.GetMimeType(&mime_type); |
| 247 EXPECT_EQ("audio/mpeg", mime_type); | 251 EXPECT_EQ("audio/mpeg", mime_type); |
| 248 | 252 |
| 249 std::string expected_data; | 253 std::string expected_data; |
| 250 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); | 254 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); |
| 251 EXPECT_EQ(expected_data, test_delegate_->data_received()); | 255 EXPECT_EQ(expected_data, test_delegate_->data_received()); |
| 252 } | 256 } |
| 253 } | 257 } |
| 254 | 258 |
| 255 TEST_F(DriveURLRequestJobTest, HostedDocument) { | 259 TEST_F(DriveURLRequestJobTest, HostedDocument) { |
| 256 // Open a gdoc file. | 260 // Open a gdoc file. |
| 257 test_delegate_->set_quit_on_redirect(true); | 261 test_delegate_->set_quit_on_redirect(true); |
| 258 net::URLRequest request( | 262 net::URLRequest request( |
| 259 GURL("drive:drive/root/Document 1 excludeDir-test.gdoc"), | 263 GURL("drive:drive/root/Document 1 excludeDir-test.gdoc"), |
| 260 test_delegate_.get(), | 264 test_delegate_.get(), |
| 261 url_request_context_.get(), test_network_delegate_.get()); | 265 url_request_context_.get(), test_network_delegate_.get()); |
| 262 request.Start(); | 266 request.Start(); |
| 263 | 267 |
| 264 base::MessageLoop::current()->Run(); | 268 base::RunLoop().Run(); |
| 265 | 269 |
| 266 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 270 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
| 267 // Make sure that a hosted document triggers redirection. | 271 // Make sure that a hosted document triggers redirection. |
| 268 EXPECT_TRUE(request.is_redirecting()); | 272 EXPECT_TRUE(request.is_redirecting()); |
| 269 EXPECT_EQ(GURL("https://3_document_alternate_link"), | 273 EXPECT_EQ(GURL("https://3_document_alternate_link"), |
| 270 test_delegate_->redirect_url()); | 274 test_delegate_->redirect_url()); |
| 271 } | 275 } |
| 272 | 276 |
| 273 TEST_F(DriveURLRequestJobTest, RootDirectory) { | 277 TEST_F(DriveURLRequestJobTest, RootDirectory) { |
| 274 net::URLRequest request( | 278 net::URLRequest request( |
| 275 GURL("drive:drive/root"), test_delegate_.get(), | 279 GURL("drive:drive/root"), test_delegate_.get(), |
| 276 url_request_context_.get(), test_network_delegate_.get()); | 280 url_request_context_.get(), test_network_delegate_.get()); |
| 277 request.Start(); | 281 request.Start(); |
| 278 | 282 |
| 279 base::MessageLoop::current()->Run(); | 283 base::RunLoop().Run(); |
| 280 | 284 |
| 281 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 285 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
| 282 EXPECT_EQ(net::ERR_FAILED, request.status().error()); | 286 EXPECT_EQ(net::ERR_FAILED, request.status().error()); |
| 283 } | 287 } |
| 284 | 288 |
| 285 TEST_F(DriveURLRequestJobTest, Directory) { | 289 TEST_F(DriveURLRequestJobTest, Directory) { |
| 286 net::URLRequest request( | 290 net::URLRequest request( |
| 287 GURL("drive:drive/root/Directory 1"), test_delegate_.get(), | 291 GURL("drive:drive/root/Directory 1"), test_delegate_.get(), |
| 288 url_request_context_.get(), test_network_delegate_.get()); | 292 url_request_context_.get(), test_network_delegate_.get()); |
| 289 request.Start(); | 293 request.Start(); |
| 290 | 294 |
| 291 base::MessageLoop::current()->Run(); | 295 base::RunLoop().Run(); |
| 292 | 296 |
| 293 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 297 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
| 294 EXPECT_EQ(net::ERR_FAILED, request.status().error()); | 298 EXPECT_EQ(net::ERR_FAILED, request.status().error()); |
| 295 } | 299 } |
| 296 | 300 |
| 297 TEST_F(DriveURLRequestJobTest, NonExistingFile) { | 301 TEST_F(DriveURLRequestJobTest, NonExistingFile) { |
| 298 net::URLRequest request( | 302 net::URLRequest request( |
| 299 GURL("drive:drive/root/non-existing-file.txt"), test_delegate_.get(), | 303 GURL("drive:drive/root/non-existing-file.txt"), test_delegate_.get(), |
| 300 url_request_context_.get(), test_network_delegate_.get()); | 304 url_request_context_.get(), test_network_delegate_.get()); |
| 301 request.Start(); | 305 request.Start(); |
| 302 | 306 |
| 303 base::MessageLoop::current()->Run(); | 307 base::RunLoop().Run(); |
| 304 | 308 |
| 305 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 309 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
| 306 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request.status().error()); | 310 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request.status().error()); |
| 307 } | 311 } |
| 308 | 312 |
| 309 TEST_F(DriveURLRequestJobTest, WrongFormat) { | 313 TEST_F(DriveURLRequestJobTest, WrongFormat) { |
| 310 net::URLRequest request( | 314 net::URLRequest request( |
| 311 GURL("drive:"), test_delegate_.get(), | 315 GURL("drive:"), test_delegate_.get(), |
| 312 url_request_context_.get(), test_network_delegate_.get()); | 316 url_request_context_.get(), test_network_delegate_.get()); |
| 313 request.Start(); | 317 request.Start(); |
| 314 | 318 |
| 315 base::MessageLoop::current()->Run(); | 319 base::RunLoop().Run(); |
| 316 | 320 |
| 317 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 321 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
| 318 EXPECT_EQ(net::ERR_INVALID_URL, request.status().error()); | 322 EXPECT_EQ(net::ERR_INVALID_URL, request.status().error()); |
| 319 } | 323 } |
| 320 | 324 |
| 321 TEST_F(DriveURLRequestJobTest, Cancel) { | 325 TEST_F(DriveURLRequestJobTest, Cancel) { |
| 322 net::URLRequest request( | 326 net::URLRequest request( |
| 323 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), | 327 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), |
| 324 url_request_context_.get(), test_network_delegate_.get()); | 328 url_request_context_.get(), test_network_delegate_.get()); |
| 325 | 329 |
| 326 // Start the request, and cancel it immediately after it. | 330 // Start the request, and cancel it immediately after it. |
| 327 request.Start(); | 331 request.Start(); |
| 328 request.Cancel(); | 332 request.Cancel(); |
| 329 | 333 |
| 330 base::MessageLoop::current()->Run(); | 334 base::RunLoop().Run(); |
| 331 | 335 |
| 332 EXPECT_EQ(net::URLRequestStatus::CANCELED, request.status().status()); | 336 EXPECT_EQ(net::URLRequestStatus::CANCELED, request.status().status()); |
| 333 } | 337 } |
| 334 | 338 |
| 335 TEST_F(DriveURLRequestJobTest, RangeHeader) { | 339 TEST_F(DriveURLRequestJobTest, RangeHeader) { |
| 336 const GURL kTestUrl("drive:drive/root/File 1.txt"); | 340 const GURL kTestUrl("drive:drive/root/File 1.txt"); |
| 337 const base::FilePath kTestFilePath("drive/root/File 1.txt"); | 341 const base::FilePath kTestFilePath("drive/root/File 1.txt"); |
| 338 | 342 |
| 339 net::URLRequest request( | 343 net::URLRequest request( |
| 340 kTestUrl, test_delegate_.get(), | 344 kTestUrl, test_delegate_.get(), |
| 341 url_request_context_.get(), test_network_delegate_.get()); | 345 url_request_context_.get(), test_network_delegate_.get()); |
| 342 | 346 |
| 343 // Set range header. | 347 // Set range header. |
| 344 request.SetExtraRequestHeaderByName( | 348 request.SetExtraRequestHeaderByName( |
| 345 "Range", "bytes=3-5", false /* overwrite */); | 349 "Range", "bytes=3-5", false /* overwrite */); |
| 346 request.Start(); | 350 request.Start(); |
| 347 | 351 |
| 348 base::MessageLoop::current()->Run(); | 352 base::RunLoop().Run(); |
| 349 | 353 |
| 350 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 354 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
| 351 | 355 |
| 352 // Reading file must be done after |request| runs, otherwise | 356 // Reading file must be done after |request| runs, otherwise |
| 353 // it'll create a local cache file, and we cannot test correctly. | 357 // it'll create a local cache file, and we cannot test correctly. |
| 354 std::string expected_data; | 358 std::string expected_data; |
| 355 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); | 359 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); |
| 356 EXPECT_EQ(expected_data.substr(3, 3), test_delegate_->data_received()); | 360 EXPECT_EQ(expected_data.substr(3, 3), test_delegate_->data_received()); |
| 357 } | 361 } |
| 358 | 362 |
| 359 TEST_F(DriveURLRequestJobTest, WrongRangeHeader) { | 363 TEST_F(DriveURLRequestJobTest, WrongRangeHeader) { |
| 360 const GURL kTestUrl("drive:drive/root/File 1.txt"); | 364 const GURL kTestUrl("drive:drive/root/File 1.txt"); |
| 361 | 365 |
| 362 net::URLRequest request( | 366 net::URLRequest request( |
| 363 kTestUrl, test_delegate_.get(), | 367 kTestUrl, test_delegate_.get(), |
| 364 url_request_context_.get(), test_network_delegate_.get()); | 368 url_request_context_.get(), test_network_delegate_.get()); |
| 365 | 369 |
| 366 // Set range header. | 370 // Set range header. |
| 367 request.SetExtraRequestHeaderByName( | 371 request.SetExtraRequestHeaderByName( |
| 368 "Range", "Wrong Range Header Value", false /* overwrite */); | 372 "Range", "Wrong Range Header Value", false /* overwrite */); |
| 369 request.Start(); | 373 request.Start(); |
| 370 | 374 |
| 371 base::MessageLoop::current()->Run(); | 375 base::RunLoop().Run(); |
| 372 | 376 |
| 373 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 377 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
| 374 EXPECT_EQ(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE, request.status().error()); | 378 EXPECT_EQ(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE, request.status().error()); |
| 375 } | 379 } |
| 376 | 380 |
| 377 } // namespace drive | 381 } // namespace drive |
| OLD | NEW |