| 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 "base/basictypes.h" | 5 #include <stdint.h> |
| 6 |
| 7 #include <limits> |
| 8 |
| 6 #include "base/bind.h" | 9 #include "base/bind.h" |
| 7 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 8 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
| 9 #include "base/files/scoped_temp_dir.h" | 12 #include "base/files/scoped_temp_dir.h" |
| 10 #include "base/macros.h" | 13 #include "base/macros.h" |
| 11 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
| 12 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/numerics/safe_conversions.h" | 16 #include "base/numerics/safe_conversions.h" |
| 14 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
| 15 #include "base/thread_task_runner_handle.h" | 18 #include "base/thread_task_runner_handle.h" |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 | 220 |
| 218 void OnValidateFileSystem(const GURL& root, | 221 void OnValidateFileSystem(const GURL& root, |
| 219 const std::string& name, | 222 const std::string& name, |
| 220 base::File::Error result) { | 223 base::File::Error result) { |
| 221 ASSERT_EQ(base::File::FILE_OK, result); | 224 ASSERT_EQ(base::File::FILE_OK, result); |
| 222 ASSERT_TRUE(root.is_valid()); | 225 ASSERT_TRUE(root.is_valid()); |
| 223 file_system_root_url_ = root; | 226 file_system_root_url_ = root; |
| 224 } | 227 } |
| 225 | 228 |
| 226 void TestSuccessNonrangeRequest(const std::string& expected_response, | 229 void TestSuccessNonrangeRequest(const std::string& expected_response, |
| 227 int64 expected_content_length) { | 230 int64_t expected_content_length) { |
| 228 expected_status_code_ = 200; | 231 expected_status_code_ = 200; |
| 229 expected_response_ = expected_response; | 232 expected_response_ = expected_response; |
| 230 TestRequest("GET", net::HttpRequestHeaders()); | 233 TestRequest("GET", net::HttpRequestHeaders()); |
| 231 EXPECT_EQ(expected_content_length, | 234 EXPECT_EQ(expected_content_length, |
| 232 request_->response_headers()->GetContentLength()); | 235 request_->response_headers()->GetContentLength()); |
| 233 } | 236 } |
| 234 | 237 |
| 235 void TestErrorRequest(int expected_status_code) { | 238 void TestErrorRequest(int expected_status_code) { |
| 236 expected_status_code_ = expected_status_code; | 239 expected_status_code_ = expected_status_code; |
| 237 expected_response_ = ""; | 240 expected_response_ = ""; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 | 288 |
| 286 storage::BlobDataHandle* GetHandleFromBuilder() { | 289 storage::BlobDataHandle* GetHandleFromBuilder() { |
| 287 if (!blob_handle_) { | 290 if (!blob_handle_) { |
| 288 blob_handle_ = blob_context_.AddFinishedBlob(blob_data_.get()).Pass(); | 291 blob_handle_ = blob_context_.AddFinishedBlob(blob_data_.get()).Pass(); |
| 289 } | 292 } |
| 290 return blob_handle_.get(); | 293 return blob_handle_.get(); |
| 291 } | 294 } |
| 292 | 295 |
| 293 // This only works if all the Blob items have a definite pre-computed length. | 296 // This only works if all the Blob items have a definite pre-computed length. |
| 294 // Otherwise, this will fail a CHECK. | 297 // Otherwise, this will fail a CHECK. |
| 295 int64 GetTotalBlobLength() { | 298 int64_t GetTotalBlobLength() { |
| 296 int64 total = 0; | 299 int64_t total = 0; |
| 297 scoped_ptr<BlobDataSnapshot> data = | 300 scoped_ptr<BlobDataSnapshot> data = |
| 298 GetHandleFromBuilder()->CreateSnapshot(); | 301 GetHandleFromBuilder()->CreateSnapshot(); |
| 299 const auto& items = data->items(); | 302 const auto& items = data->items(); |
| 300 for (const auto& item : items) { | 303 for (const auto& item : items) { |
| 301 int64 length = base::checked_cast<int64>(item->length()); | 304 int64_t length = base::checked_cast<int64_t>(item->length()); |
| 302 CHECK(length <= kint64max - total); | 305 CHECK(length <= std::numeric_limits<int64_t>::max() - total); |
| 303 total += length; | 306 total += length; |
| 304 } | 307 } |
| 305 return total; | 308 return total; |
| 306 } | 309 } |
| 307 | 310 |
| 308 protected: | 311 protected: |
| 309 base::ScopedTempDir temp_dir_; | 312 base::ScopedTempDir temp_dir_; |
| 310 base::FilePath temp_file1_; | 313 base::FilePath temp_file1_; |
| 311 base::FilePath temp_file2_; | 314 base::FilePath temp_file2_; |
| 312 base::Time temp_file_modification_time1_; | 315 base::Time temp_file_modification_time1_; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 335 int expected_status_code_; | 338 int expected_status_code_; |
| 336 std::string expected_response_; | 339 std::string expected_response_; |
| 337 }; | 340 }; |
| 338 | 341 |
| 339 TEST_F(BlobURLRequestJobTest, TestGetSimpleDataRequest) { | 342 TEST_F(BlobURLRequestJobTest, TestGetSimpleDataRequest) { |
| 340 blob_data_->AppendData(kTestData1); | 343 blob_data_->AppendData(kTestData1); |
| 341 TestSuccessNonrangeRequest(kTestData1, arraysize(kTestData1) - 1); | 344 TestSuccessNonrangeRequest(kTestData1, arraysize(kTestData1) - 1); |
| 342 } | 345 } |
| 343 | 346 |
| 344 TEST_F(BlobURLRequestJobTest, TestGetSimpleFileRequest) { | 347 TEST_F(BlobURLRequestJobTest, TestGetSimpleFileRequest) { |
| 345 blob_data_->AppendFile(temp_file1_, 0, kuint64max, base::Time()); | 348 blob_data_->AppendFile(temp_file1_, 0, std::numeric_limits<uint64_t>::max(), |
| 349 base::Time()); |
| 346 TestSuccessNonrangeRequest(kTestFileData1, arraysize(kTestFileData1) - 1); | 350 TestSuccessNonrangeRequest(kTestFileData1, arraysize(kTestFileData1) - 1); |
| 347 } | 351 } |
| 348 | 352 |
| 349 TEST_F(BlobURLRequestJobTest, TestGetLargeFileRequest) { | 353 TEST_F(BlobURLRequestJobTest, TestGetLargeFileRequest) { |
| 350 base::FilePath large_temp_file = | 354 base::FilePath large_temp_file = |
| 351 temp_dir_.path().AppendASCII("LargeBlob.dat"); | 355 temp_dir_.path().AppendASCII("LargeBlob.dat"); |
| 352 std::string large_data; | 356 std::string large_data; |
| 353 large_data.reserve(kBufferSize * 5); | 357 large_data.reserve(kBufferSize * 5); |
| 354 for (int i = 0; i < kBufferSize * 5; ++i) | 358 for (int i = 0; i < kBufferSize * 5; ++i) |
| 355 large_data.append(1, static_cast<char>(i % 256)); | 359 large_data.append(1, static_cast<char>(i % 256)); |
| 356 ASSERT_EQ(static_cast<int>(large_data.size()), | 360 ASSERT_EQ(static_cast<int>(large_data.size()), |
| 357 base::WriteFile(large_temp_file, large_data.data(), | 361 base::WriteFile(large_temp_file, large_data.data(), |
| 358 large_data.size())); | 362 large_data.size())); |
| 359 blob_data_->AppendFile(large_temp_file, 0, kuint64max, base::Time()); | 363 blob_data_->AppendFile(large_temp_file, 0, |
| 364 std::numeric_limits<uint64_t>::max(), base::Time()); |
| 360 TestSuccessNonrangeRequest(large_data, large_data.size()); | 365 TestSuccessNonrangeRequest(large_data, large_data.size()); |
| 361 } | 366 } |
| 362 | 367 |
| 363 TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileRequest) { | 368 TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileRequest) { |
| 364 base::FilePath non_existent_file = | 369 base::FilePath non_existent_file = |
| 365 temp_file1_.InsertBeforeExtension(FILE_PATH_LITERAL("-na")); | 370 temp_file1_.InsertBeforeExtension(FILE_PATH_LITERAL("-na")); |
| 366 blob_data_->AppendFile(non_existent_file, 0, kuint64max, base::Time()); | 371 blob_data_->AppendFile(non_existent_file, 0, |
| 372 std::numeric_limits<uint64_t>::max(), base::Time()); |
| 367 TestErrorRequest(404); | 373 TestErrorRequest(404); |
| 368 } | 374 } |
| 369 | 375 |
| 370 TEST_F(BlobURLRequestJobTest, TestGetChangedFileRequest) { | 376 TEST_F(BlobURLRequestJobTest, TestGetChangedFileRequest) { |
| 371 base::Time old_time = | 377 base::Time old_time = |
| 372 temp_file_modification_time1_ - base::TimeDelta::FromSeconds(10); | 378 temp_file_modification_time1_ - base::TimeDelta::FromSeconds(10); |
| 373 blob_data_->AppendFile(temp_file1_, 0, 3, old_time); | 379 blob_data_->AppendFile(temp_file1_, 0, 3, old_time); |
| 374 TestErrorRequest(404); | 380 TestErrorRequest(404); |
| 375 } | 381 } |
| 376 | 382 |
| 377 TEST_F(BlobURLRequestJobTest, TestGetSlicedFileRequest) { | 383 TEST_F(BlobURLRequestJobTest, TestGetSlicedFileRequest) { |
| 378 blob_data_->AppendFile(temp_file1_, 2, 4, temp_file_modification_time1_); | 384 blob_data_->AppendFile(temp_file1_, 2, 4, temp_file_modification_time1_); |
| 379 std::string result(kTestFileData1 + 2, 4); | 385 std::string result(kTestFileData1 + 2, 4); |
| 380 TestSuccessNonrangeRequest(result, 4); | 386 TestSuccessNonrangeRequest(result, 4); |
| 381 } | 387 } |
| 382 | 388 |
| 383 TEST_F(BlobURLRequestJobTest, TestGetSimpleFileSystemFileRequest) { | 389 TEST_F(BlobURLRequestJobTest, TestGetSimpleFileSystemFileRequest) { |
| 384 SetUpFileSystem(); | 390 SetUpFileSystem(); |
| 385 blob_data_->AppendFileSystemFile(temp_file_system_file1_, 0, kuint64max, | 391 blob_data_->AppendFileSystemFile(temp_file_system_file1_, 0, |
| 392 std::numeric_limits<uint64_t>::max(), |
| 386 base::Time()); | 393 base::Time()); |
| 387 TestSuccessNonrangeRequest(kTestFileSystemFileData1, | 394 TestSuccessNonrangeRequest(kTestFileSystemFileData1, |
| 388 arraysize(kTestFileSystemFileData1) - 1); | 395 arraysize(kTestFileSystemFileData1) - 1); |
| 389 } | 396 } |
| 390 | 397 |
| 391 TEST_F(BlobURLRequestJobTest, TestGetLargeFileSystemFileRequest) { | 398 TEST_F(BlobURLRequestJobTest, TestGetLargeFileSystemFileRequest) { |
| 392 SetUpFileSystem(); | 399 SetUpFileSystem(); |
| 393 std::string large_data; | 400 std::string large_data; |
| 394 large_data.reserve(kBufferSize * 5); | 401 large_data.reserve(kBufferSize * 5); |
| 395 for (int i = 0; i < kBufferSize * 5; ++i) | 402 for (int i = 0; i < kBufferSize * 5; ++i) |
| 396 large_data.append(1, static_cast<char>(i % 256)); | 403 large_data.append(1, static_cast<char>(i % 256)); |
| 397 | 404 |
| 398 const char kFilename[] = "LargeBlob.dat"; | 405 const char kFilename[] = "LargeBlob.dat"; |
| 399 WriteFileSystemFile(kFilename, large_data.data(), large_data.size(), NULL); | 406 WriteFileSystemFile(kFilename, large_data.data(), large_data.size(), NULL); |
| 400 | 407 |
| 401 blob_data_->AppendFileSystemFile(GetFileSystemURL(kFilename), 0, kuint64max, | 408 blob_data_->AppendFileSystemFile(GetFileSystemURL(kFilename), 0, |
| 409 std::numeric_limits<uint64_t>::max(), |
| 402 base::Time()); | 410 base::Time()); |
| 403 TestSuccessNonrangeRequest(large_data, large_data.size()); | 411 TestSuccessNonrangeRequest(large_data, large_data.size()); |
| 404 } | 412 } |
| 405 | 413 |
| 406 TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileSystemFileRequest) { | 414 TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileSystemFileRequest) { |
| 407 SetUpFileSystem(); | 415 SetUpFileSystem(); |
| 408 GURL non_existent_file = GetFileSystemURL("non-existent.dat"); | 416 GURL non_existent_file = GetFileSystemURL("non-existent.dat"); |
| 409 blob_data_->AppendFileSystemFile(non_existent_file, 0, kuint64max, | 417 blob_data_->AppendFileSystemFile( |
| 410 base::Time()); | 418 non_existent_file, 0, std::numeric_limits<uint64_t>::max(), base::Time()); |
| 411 TestErrorRequest(404); | 419 TestErrorRequest(404); |
| 412 } | 420 } |
| 413 | 421 |
| 414 TEST_F(BlobURLRequestJobTest, TestGetInvalidFileSystemFileRequest) { | 422 TEST_F(BlobURLRequestJobTest, TestGetInvalidFileSystemFileRequest) { |
| 415 SetUpFileSystem(); | 423 SetUpFileSystem(); |
| 416 GURL invalid_file; | 424 GURL invalid_file; |
| 417 blob_data_->AppendFileSystemFile(invalid_file, 0, kuint64max, base::Time()); | 425 blob_data_->AppendFileSystemFile( |
| 426 invalid_file, 0, std::numeric_limits<uint64_t>::max(), base::Time()); |
| 418 TestErrorRequest(500); | 427 TestErrorRequest(500); |
| 419 } | 428 } |
| 420 | 429 |
| 421 TEST_F(BlobURLRequestJobTest, TestGetChangedFileSystemFileRequest) { | 430 TEST_F(BlobURLRequestJobTest, TestGetChangedFileSystemFileRequest) { |
| 422 SetUpFileSystem(); | 431 SetUpFileSystem(); |
| 423 base::Time old_time = | 432 base::Time old_time = |
| 424 temp_file_system_file_modification_time1_ - | 433 temp_file_system_file_modification_time1_ - |
| 425 base::TimeDelta::FromSeconds(10); | 434 base::TimeDelta::FromSeconds(10); |
| 426 blob_data_->AppendFileSystemFile(temp_file_system_file1_, 0, 3, old_time); | 435 blob_data_->AppendFileSystemFile(temp_file_system_file1_, 0, 3, old_time); |
| 427 TestErrorRequest(404); | 436 TestErrorRequest(404); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 456 BuildComplicatedData(&result); | 465 BuildComplicatedData(&result); |
| 457 net::HttpRequestHeaders extra_headers; | 466 net::HttpRequestHeaders extra_headers; |
| 458 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, | 467 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, |
| 459 net::HttpByteRange::Bounded(5, 10).GetHeaderValue()); | 468 net::HttpByteRange::Bounded(5, 10).GetHeaderValue()); |
| 460 expected_status_code_ = 206; | 469 expected_status_code_ = 206; |
| 461 expected_response_ = result.substr(5, 10 - 5 + 1); | 470 expected_response_ = result.substr(5, 10 - 5 + 1); |
| 462 TestRequest("GET", extra_headers); | 471 TestRequest("GET", extra_headers); |
| 463 | 472 |
| 464 EXPECT_EQ(6, request_->response_headers()->GetContentLength()); | 473 EXPECT_EQ(6, request_->response_headers()->GetContentLength()); |
| 465 | 474 |
| 466 int64 first = 0, last = 0, length = 0; | 475 int64_t first = 0, last = 0, length = 0; |
| 467 EXPECT_TRUE( | 476 EXPECT_TRUE( |
| 468 request_->response_headers()->GetContentRange(&first, &last, &length)); | 477 request_->response_headers()->GetContentRange(&first, &last, &length)); |
| 469 EXPECT_EQ(5, first); | 478 EXPECT_EQ(5, first); |
| 470 EXPECT_EQ(10, last); | 479 EXPECT_EQ(10, last); |
| 471 EXPECT_EQ(GetTotalBlobLength(), length); | 480 EXPECT_EQ(GetTotalBlobLength(), length); |
| 472 } | 481 } |
| 473 | 482 |
| 474 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest2) { | 483 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest2) { |
| 475 SetUpFileSystem(); | 484 SetUpFileSystem(); |
| 476 std::string result; | 485 std::string result; |
| 477 BuildComplicatedData(&result); | 486 BuildComplicatedData(&result); |
| 478 net::HttpRequestHeaders extra_headers; | 487 net::HttpRequestHeaders extra_headers; |
| 479 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, | 488 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, |
| 480 net::HttpByteRange::Suffix(10).GetHeaderValue()); | 489 net::HttpByteRange::Suffix(10).GetHeaderValue()); |
| 481 expected_status_code_ = 206; | 490 expected_status_code_ = 206; |
| 482 expected_response_ = result.substr(result.length() - 10); | 491 expected_response_ = result.substr(result.length() - 10); |
| 483 TestRequest("GET", extra_headers); | 492 TestRequest("GET", extra_headers); |
| 484 | 493 |
| 485 EXPECT_EQ(10, request_->response_headers()->GetContentLength()); | 494 EXPECT_EQ(10, request_->response_headers()->GetContentLength()); |
| 486 | 495 |
| 487 int64 total = GetTotalBlobLength(); | 496 int64_t total = GetTotalBlobLength(); |
| 488 int64 first = 0, last = 0, length = 0; | 497 int64_t first = 0, last = 0, length = 0; |
| 489 EXPECT_TRUE( | 498 EXPECT_TRUE( |
| 490 request_->response_headers()->GetContentRange(&first, &last, &length)); | 499 request_->response_headers()->GetContentRange(&first, &last, &length)); |
| 491 EXPECT_EQ(total - 10, first); | 500 EXPECT_EQ(total - 10, first); |
| 492 EXPECT_EQ(total - 1, last); | 501 EXPECT_EQ(total - 1, last); |
| 493 EXPECT_EQ(total, length); | 502 EXPECT_EQ(total, length); |
| 494 } | 503 } |
| 495 | 504 |
| 496 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest3) { | 505 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest3) { |
| 497 SetUpFileSystem(); | 506 SetUpFileSystem(); |
| 498 std::string result; | 507 std::string result; |
| 499 BuildComplicatedData(&result); | 508 BuildComplicatedData(&result); |
| 500 net::HttpRequestHeaders extra_headers; | 509 net::HttpRequestHeaders extra_headers; |
| 501 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, | 510 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, |
| 502 net::HttpByteRange::Bounded(0, 2).GetHeaderValue()); | 511 net::HttpByteRange::Bounded(0, 2).GetHeaderValue()); |
| 503 expected_status_code_ = 206; | 512 expected_status_code_ = 206; |
| 504 expected_response_ = result.substr(0, 3); | 513 expected_response_ = result.substr(0, 3); |
| 505 TestRequest("GET", extra_headers); | 514 TestRequest("GET", extra_headers); |
| 506 | 515 |
| 507 EXPECT_EQ(3, request_->response_headers()->GetContentLength()); | 516 EXPECT_EQ(3, request_->response_headers()->GetContentLength()); |
| 508 | 517 |
| 509 int64 first = 0, last = 0, length = 0; | 518 int64_t first = 0, last = 0, length = 0; |
| 510 EXPECT_TRUE( | 519 EXPECT_TRUE( |
| 511 request_->response_headers()->GetContentRange(&first, &last, &length)); | 520 request_->response_headers()->GetContentRange(&first, &last, &length)); |
| 512 EXPECT_EQ(0, first); | 521 EXPECT_EQ(0, first); |
| 513 EXPECT_EQ(2, last); | 522 EXPECT_EQ(2, last); |
| 514 EXPECT_EQ(GetTotalBlobLength(), length); | 523 EXPECT_EQ(GetTotalBlobLength(), length); |
| 515 } | 524 } |
| 516 | 525 |
| 517 TEST_F(BlobURLRequestJobTest, TestExtraHeaders) { | 526 TEST_F(BlobURLRequestJobTest, TestExtraHeaders) { |
| 518 blob_data_->set_content_type(kTestContentType); | 527 blob_data_->set_content_type(kTestContentType); |
| 519 blob_data_->set_content_disposition(kTestContentDisposition); | 528 blob_data_->set_content_disposition(kTestContentDisposition); |
| 520 blob_data_->AppendData(kTestData1); | 529 blob_data_->AppendData(kTestData1); |
| 521 expected_status_code_ = 200; | 530 expected_status_code_ = 200; |
| 522 expected_response_ = kTestData1; | 531 expected_response_ = kTestData1; |
| 523 TestRequest("GET", net::HttpRequestHeaders()); | 532 TestRequest("GET", net::HttpRequestHeaders()); |
| 524 | 533 |
| 525 std::string content_type; | 534 std::string content_type; |
| 526 EXPECT_TRUE(request_->response_headers()->GetMimeType(&content_type)); | 535 EXPECT_TRUE(request_->response_headers()->GetMimeType(&content_type)); |
| 527 EXPECT_EQ(kTestContentType, content_type); | 536 EXPECT_EQ(kTestContentType, content_type); |
| 528 void* iter = NULL; | 537 void* iter = NULL; |
| 529 std::string content_disposition; | 538 std::string content_disposition; |
| 530 EXPECT_TRUE(request_->response_headers()->EnumerateHeader( | 539 EXPECT_TRUE(request_->response_headers()->EnumerateHeader( |
| 531 &iter, "Content-Disposition", &content_disposition)); | 540 &iter, "Content-Disposition", &content_disposition)); |
| 532 EXPECT_EQ(kTestContentDisposition, content_disposition); | 541 EXPECT_EQ(kTestContentDisposition, content_disposition); |
| 533 } | 542 } |
| 534 | 543 |
| 535 } // namespace content | 544 } // namespace content |
| OLD | NEW |