diff options
Diffstat (limited to 'chromium/content/browser/fileapi/blob_url_request_job_unittest.cc')
-rw-r--r-- | chromium/content/browser/fileapi/blob_url_request_job_unittest.cc | 166 |
1 files changed, 72 insertions, 94 deletions
diff --git a/chromium/content/browser/fileapi/blob_url_request_job_unittest.cc b/chromium/content/browser/fileapi/blob_url_request_job_unittest.cc index a09456b607f..5ce43121433 100644 --- a/chromium/content/browser/fileapi/blob_url_request_job_unittest.cc +++ b/chromium/content/browser/fileapi/blob_url_request_job_unittest.cc @@ -2,16 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/basictypes.h" #include "base/bind.h" #include "base/file_util.h" #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "base/numerics/safe_conversions.h" #include "base/run_loop.h" #include "base/time/time.h" +#include "content/browser/fileapi/mock_url_request_delegate.h" +#include "content/public/test/async_file_test_helper.h" #include "content/public/test/test_file_system_context.h" -#include "net/base/io_buffer.h" #include "net/base/request_priority.h" #include "net/http/http_byte_range.h" #include "net/http/http_request_headers.h" @@ -21,13 +24,15 @@ #include "net/url_request/url_request_job_factory_impl.h" #include "testing/gtest/include/gtest/gtest.h" #include "webkit/browser/blob/blob_url_request_job.h" -#include "webkit/browser/fileapi/async_file_test_helper.h" #include "webkit/browser/fileapi/file_system_context.h" #include "webkit/browser/fileapi/file_system_operation_context.h" #include "webkit/browser/fileapi/file_system_url.h" #include "webkit/common/blob/blob_data.h" -namespace webkit_blob { +using webkit_blob::BlobData; +using webkit_blob::BlobURLRequestJob; + +namespace content { namespace { @@ -49,70 +54,6 @@ const fileapi::FileSystemType kFileSystemType = class BlobURLRequestJobTest : public testing::Test { public: - - // Test Harness ------------------------------------------------------------- - // TODO(jianli): share this test harness with AppCacheURLRequestJobTest - - class MockURLRequestDelegate : public net::URLRequest::Delegate { - public: - MockURLRequestDelegate() - : received_data_(new net::IOBuffer(kBufferSize)) {} - - virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE { - if (request->status().is_success()) { - EXPECT_TRUE(request->response_headers()); - ReadSome(request); - } else { - RequestComplete(); - } - } - - virtual void OnReadCompleted(net::URLRequest* request, - int bytes_read) OVERRIDE { - if (bytes_read > 0) - ReceiveData(request, bytes_read); - else - RequestComplete(); - } - - const std::string& response_data() const { return response_data_; } - - private: - void ReadSome(net::URLRequest* request) { - if (!request->is_pending()) { - RequestComplete(); - return; - } - - int bytes_read = 0; - if (!request->Read(received_data_.get(), kBufferSize, &bytes_read)) { - if (!request->status().is_io_pending()) { - RequestComplete(); - } - return; - } - - ReceiveData(request, bytes_read); - } - - void ReceiveData(net::URLRequest* request, int bytes_read) { - if (bytes_read) { - response_data_.append(received_data_->data(), - static_cast<size_t>(bytes_read)); - ReadSome(request); - } else { - RequestComplete(); - } - } - - void RequestComplete() { - base::MessageLoop::current()->Quit(); - } - - scoped_refptr<net::IOBuffer> received_data_; - std::string response_data_; - }; - // A simple ProtocolHandler implementation to create BlobURLRequestJob. class MockProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { @@ -143,17 +84,17 @@ class BlobURLRequestJobTest : public testing::Test { temp_file1_ = temp_dir_.path().AppendASCII("BlobFile1.dat"); ASSERT_EQ(static_cast<int>(arraysize(kTestFileData1) - 1), - file_util::WriteFile(temp_file1_, kTestFileData1, + base::WriteFile(temp_file1_, kTestFileData1, arraysize(kTestFileData1) - 1)); - base::PlatformFileInfo file_info1; + base::File::Info file_info1; base::GetFileInfo(temp_file1_, &file_info1); temp_file_modification_time1_ = file_info1.last_modified; temp_file2_ = temp_dir_.path().AppendASCII("BlobFile2.dat"); ASSERT_EQ(static_cast<int>(arraysize(kTestFileData2) - 1), - file_util::WriteFile(temp_file2_, kTestFileData2, + base::WriteFile(temp_file2_, kTestFileData2, arraysize(kTestFileData2) - 1)); - base::PlatformFileInfo file_info2; + base::File::Info file_info2; base::GetFileInfo(temp_file2_, &file_info2); temp_file_modification_time2_ = file_info2.last_modified; @@ -167,7 +108,7 @@ class BlobURLRequestJobTest : public testing::Test { void SetUpFileSystem() { // Prepare file system. - file_system_context_ = fileapi::CreateFileSystemContextForTesting( + file_system_context_ = CreateFileSystemContextForTesting( NULL, temp_dir_.path()); file_system_context_->OpenFileSystem( @@ -205,13 +146,13 @@ class BlobURLRequestJobTest : public testing::Test { kFileSystemType, base::FilePath().AppendASCII(filename)); - ASSERT_EQ(base::PLATFORM_FILE_OK, - fileapi::AsyncFileTestHelper::CreateFileWithData( + ASSERT_EQ(base::File::FILE_OK, + content::AsyncFileTestHelper::CreateFileWithData( file_system_context_, url, buf, buf_size)); - base::PlatformFileInfo file_info; - ASSERT_EQ(base::PLATFORM_FILE_OK, - fileapi::AsyncFileTestHelper::GetMetadata( + base::File::Info file_info; + ASSERT_EQ(base::File::FILE_OK, + content::AsyncFileTestHelper::GetMetadata( file_system_context_, url, &file_info)); if (modification_time) *modification_time = file_info.last_modified; @@ -219,16 +160,19 @@ class BlobURLRequestJobTest : public testing::Test { void OnValidateFileSystem(const GURL& root, const std::string& name, - base::PlatformFileError result) { - ASSERT_EQ(base::PLATFORM_FILE_OK, result); + base::File::Error result) { + ASSERT_EQ(base::File::FILE_OK, result); ASSERT_TRUE(root.is_valid()); file_system_root_url_ = root; } - void TestSuccessRequest(const std::string& expected_response) { + void TestSuccessNonrangeRequest(const std::string& expected_response, + int64 expected_content_length) { expected_status_code_ = 200; expected_response_ = expected_response; TestRequest("GET", net::HttpRequestHeaders()); + EXPECT_EQ(expected_content_length, + request_->response_headers()->GetContentLength()); } void TestErrorRequest(int expected_status_code) { @@ -240,7 +184,7 @@ class BlobURLRequestJobTest : public testing::Test { void TestRequest(const std::string& method, const net::HttpRequestHeaders& extra_headers) { request_ = url_request_context_.CreateRequest( - GURL("blob:blah"), net::DEFAULT_PRIORITY, &url_request_delegate_); + GURL("blob:blah"), net::DEFAULT_PRIORITY, &url_request_delegate_, NULL); request_->set_method(method); if (!extra_headers.IsEmpty()) request_->SetExtraRequestHeaders(extra_headers); @@ -272,6 +216,20 @@ class BlobURLRequestJobTest : public testing::Test { *expected_result += std::string(kTestFileSystemFileData2 + 6, 7); } + // This only works if all the Blob items have a definite pre-computed length. + // Otherwise, this will fail a CHECK. + int64 GetTotalBlobLength() const { + int64 total = 0; + const std::vector<BlobData::Item>& items = blob_data_->items(); + for (std::vector<BlobData::Item>::const_iterator it = items.begin(); + it != items.end(); ++it) { + int64 length = base::checked_cast<int64>(it->length()); + CHECK(length <= kint64max - total); + total += length; + } + return total; + } + protected: base::ScopedTempDir temp_dir_; base::FilePath temp_file1_; @@ -298,12 +256,12 @@ class BlobURLRequestJobTest : public testing::Test { TEST_F(BlobURLRequestJobTest, TestGetSimpleDataRequest) { blob_data_->AppendData(kTestData1); - TestSuccessRequest(kTestData1); + TestSuccessNonrangeRequest(kTestData1, arraysize(kTestData1) - 1); } TEST_F(BlobURLRequestJobTest, TestGetSimpleFileRequest) { blob_data_->AppendFile(temp_file1_, 0, -1, base::Time()); - TestSuccessRequest(kTestFileData1); + TestSuccessNonrangeRequest(kTestFileData1, arraysize(kTestFileData1) - 1); } TEST_F(BlobURLRequestJobTest, TestGetLargeFileRequest) { @@ -314,10 +272,10 @@ TEST_F(BlobURLRequestJobTest, TestGetLargeFileRequest) { for (int i = 0; i < kBufferSize * 5; ++i) large_data.append(1, static_cast<char>(i % 256)); ASSERT_EQ(static_cast<int>(large_data.size()), - file_util::WriteFile(large_temp_file, large_data.data(), + base::WriteFile(large_temp_file, large_data.data(), large_data.size())); blob_data_->AppendFile(large_temp_file, 0, -1, base::Time()); - TestSuccessRequest(large_data); + TestSuccessNonrangeRequest(large_data, large_data.size()); } TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileRequest) { @@ -337,14 +295,15 @@ TEST_F(BlobURLRequestJobTest, TestGetChangedFileRequest) { TEST_F(BlobURLRequestJobTest, TestGetSlicedFileRequest) { blob_data_->AppendFile(temp_file1_, 2, 4, temp_file_modification_time1_); std::string result(kTestFileData1 + 2, 4); - TestSuccessRequest(result); + TestSuccessNonrangeRequest(result, 4); } TEST_F(BlobURLRequestJobTest, TestGetSimpleFileSystemFileRequest) { SetUpFileSystem(); blob_data_->AppendFileSystemFile(temp_file_system_file1_, 0, -1, - base::Time()); - TestSuccessRequest(kTestFileSystemFileData1); + base::Time()); + TestSuccessNonrangeRequest(kTestFileSystemFileData1, + arraysize(kTestFileSystemFileData1) - 1); } TEST_F(BlobURLRequestJobTest, TestGetLargeFileSystemFileRequest) { @@ -357,9 +316,9 @@ TEST_F(BlobURLRequestJobTest, TestGetLargeFileSystemFileRequest) { const char kFilename[] = "LargeBlob.dat"; WriteFileSystemFile(kFilename, large_data.data(), large_data.size(), NULL); - blob_data_->AppendFileSystemFile(GetFileSystemURL(kFilename), - 0, -1, base::Time()); - TestSuccessRequest(large_data); + blob_data_->AppendFileSystemFile(GetFileSystemURL(kFilename), 0, -1, + base::Time()); + TestSuccessNonrangeRequest(large_data, large_data.size()); } TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileSystemFileRequest) { @@ -383,14 +342,14 @@ TEST_F(BlobURLRequestJobTest, TestGetSlicedFileSystemFileRequest) { blob_data_->AppendFileSystemFile(temp_file_system_file1_, 2, 4, temp_file_system_file_modification_time1_); std::string result(kTestFileSystemFileData1 + 2, 4); - TestSuccessRequest(result); + TestSuccessNonrangeRequest(result, 4); } TEST_F(BlobURLRequestJobTest, TestGetComplicatedDataAndFileRequest) { SetUpFileSystem(); std::string result; BuildComplicatedData(&result); - TestSuccessRequest(result); + TestSuccessNonrangeRequest(result, GetTotalBlobLength()); } TEST_F(BlobURLRequestJobTest, TestGetRangeRequest1) { @@ -403,6 +362,15 @@ TEST_F(BlobURLRequestJobTest, TestGetRangeRequest1) { expected_status_code_ = 206; expected_response_ = result.substr(5, 10 - 5 + 1); TestRequest("GET", extra_headers); + + EXPECT_EQ(6, request_->response_headers()->GetContentLength()); + + int64 first = 0, last = 0, length = 0; + EXPECT_TRUE( + request_->response_headers()->GetContentRange(&first, &last, &length)); + EXPECT_EQ(5, first); + EXPECT_EQ(10, last); + EXPECT_EQ(GetTotalBlobLength(), length); } TEST_F(BlobURLRequestJobTest, TestGetRangeRequest2) { @@ -415,6 +383,16 @@ TEST_F(BlobURLRequestJobTest, TestGetRangeRequest2) { expected_status_code_ = 206; expected_response_ = result.substr(result.length() - 10); TestRequest("GET", extra_headers); + + EXPECT_EQ(10, request_->response_headers()->GetContentLength()); + + int64 total = GetTotalBlobLength(); + int64 first = 0, last = 0, length = 0; + EXPECT_TRUE( + request_->response_headers()->GetContentRange(&first, &last, &length)); + EXPECT_EQ(total - 10, first); + EXPECT_EQ(total - 1, last); + EXPECT_EQ(total, length); } TEST_F(BlobURLRequestJobTest, TestExtraHeaders) { @@ -435,4 +413,4 @@ TEST_F(BlobURLRequestJobTest, TestExtraHeaders) { EXPECT_EQ(kTestContentDisposition, content_disposition); } -} // namespace webkit_blob +} // namespace content |