14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/run_loop.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/fileapi/mock_url_request_delegate.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/async_file_test_helper.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_file_system_context.h" 180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/http/http_byte_range.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/blob/blob_url_request_job.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h" 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/blob_data.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::BlobData; 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::BlobURLRequestJob; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kBufferSize = 1024; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestData1[] = "Hello"; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestData2[] = "Here it is data."; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestFileData1[] = "0123456789"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestFileData2[] = "This is sample file."; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestFileSystemFileData1[] = "abcdefghijklmnop"; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestFileSystemFileData2[] = "File system file test data."; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestContentType[] = "foo/bar"; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestContentDisposition[] = "attachment; filename=foo.txt"; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFileSystemURLOrigin[] = "http://remote"; 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const storage::FileSystemType kFileSystemType = 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::kFileSystemTypeTemporary; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlobURLRequestJobTest : public testing::Test { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A simple ProtocolHandler implementation to create BlobURLRequestJob. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class MockProtocolHandler : 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public net::URLRequestJobFactory::ProtocolHandler { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockProtocolHandler(BlobURLRequestJobTest* test) : test_(test) {} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // net::URLRequestJobFactory::ProtocolHandler override. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequest* request, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new BlobURLRequestJob(request, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_delegate, 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) test_->blob_data_.get(), 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) test_->file_system_context_.get(), 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::MessageLoopProxy::current().get()); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BlobURLRequestJobTest* test_; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlobURLRequestJobTest() 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : blob_data_(new BlobData()), 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) expected_status_code_(0) {} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file1_ = temp_dir_.path().AppendASCII("BlobFile1.dat"); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<int>(arraysize(kTestFileData1) - 1), 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile(temp_file1_, kTestFileData1, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kTestFileData1) - 1)); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info file_info1; 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::GetFileInfo(temp_file1_, &file_info1); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file_modification_time1_ = file_info1.last_modified; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file2_ = temp_dir_.path().AppendASCII("BlobFile2.dat"); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<int>(arraysize(kTestFileData2) - 1), 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile(temp_file2_, kTestFileData2, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kTestFileData2) - 1)); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info file_info2; 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::GetFileInfo(temp_file2_, &file_info2); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file_modification_time2_ = file_info2.last_modified; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_request_job_factory_.SetProtocolHandler("blob", 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new MockProtocolHandler(this)); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_request_context_.set_job_factory(&url_request_job_factory_); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetUpFileSystem() { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare file system. 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_system_context_ = CreateFileSystemContextForTesting( 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, temp_dir_.path()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_system_context_->OpenFileSystem( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(kFileSystemURLOrigin), 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFileSystemType, 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&BlobURLRequestJobTest::OnValidateFileSystem, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_system_root_url_.is_valid()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare files on file system. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFilename1[] = "FileSystemFile1.dat"; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file_system_file1_ = GetFileSystemURL(kFilename1); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriteFileSystemFile(kFilename1, kTestFileSystemFileData1, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arraysize(kTestFileSystemFileData1) - 1, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &temp_file_system_file_modification_time1_); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFilename2[] = "FileSystemFile2.dat"; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file_system_file2_ = GetFileSystemURL(kFilename2); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriteFileSystemFile(kFilename2, kTestFileSystemFileData2, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arraysize(kTestFileSystemFileData2) - 1, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &temp_file_system_file_modification_time2_); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL GetFileSystemURL(const std::string& filename) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(file_system_root_url_.spec() + filename); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WriteFileSystemFile(const std::string& filename, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* buf, int buf_size, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time* modification_time) { 14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemURL url = 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_system_context_->CreateCrackedFileSystemURL( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(kFileSystemURLOrigin), 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kFileSystemType, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath().AppendASCII(filename)); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(base::File::FILE_OK, 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::AsyncFileTestHelper::CreateFileWithData( 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_system_context_.get(), url, buf, buf_size)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info file_info; 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(base::File::FILE_OK, 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::AsyncFileTestHelper::GetMetadata( 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_system_context_.get(), url, &file_info)); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (modification_time) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *modification_time = file_info.last_modified; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void OnValidateFileSystem(const GURL& root, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error result) { 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(base::File::FILE_OK, result); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.is_valid()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_system_root_url_ = root; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void TestSuccessNonrangeRequest(const std::string& expected_response, 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 expected_content_length) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_status_code_ = 200; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_response_ = expected_response; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest("GET", net::HttpRequestHeaders()); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_content_length, 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->response_headers()->GetContentLength()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void TestErrorRequest(int expected_status_code) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_status_code_ = expected_status_code; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_response_ = ""; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest("GET", net::HttpRequestHeaders()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestRequest(const std::string& method, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const net::HttpRequestHeaders& extra_headers) { 1860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) request_ = url_request_context_.CreateRequest( 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL("blob:blah"), net::DEFAULT_PRIORITY, &url_request_delegate_, NULL); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_->set_method(method); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extra_headers.IsEmpty()) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_->SetExtraRequestHeaders(extra_headers); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_->Start(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify response. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(request_->status().is_success()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_status_code_, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_->response_headers()->response_code()); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_response_, url_request_delegate_.response_data()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void BuildComplicatedData(std::string* expected_result) { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendData(kTestData1 + 1, 2); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendFile(temp_file1_, 2, 3, temp_file_modification_time1_); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendFileSystemFile(temp_file_system_file1_, 3, 4, 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_file_system_file_modification_time1_); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendData(kTestData2 + 4, 5); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendFile(temp_file2_, 5, 6, temp_file_modification_time2_); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendFileSystemFile(temp_file_system_file2_, 6, 7, 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_file_system_file_modification_time2_); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *expected_result = std::string(kTestData1 + 1, 2); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *expected_result += std::string(kTestFileData1 + 2, 3); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *expected_result += std::string(kTestFileSystemFileData1 + 3, 4); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *expected_result += std::string(kTestData2 + 4, 5); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *expected_result += std::string(kTestFileData2 + 5, 6); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *expected_result += std::string(kTestFileSystemFileData2 + 6, 7); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This only works if all the Blob items have a definite pre-computed length. 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Otherwise, this will fail a CHECK. 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 GetTotalBlobLength() const { 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 total = 0; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<BlobData::Item>& items = blob_data_->items(); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<BlobData::Item>::const_iterator it = items.begin(); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != items.end(); ++it) { 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 length = base::checked_cast<int64>(it->length()); 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(length <= kint64max - total); 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) total += length; 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return total; 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_file1_; 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_file2_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time temp_file_modification_time1_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time temp_file_modification_time2_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL file_system_root_url_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL temp_file_system_file1_; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL temp_file_system_file2_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time temp_file_system_file_modification_time1_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time temp_file_system_file_modification_time2_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoopForIO message_loop_; 24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<storage::FileSystemContext> file_system_context_; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<BlobData> blob_data_; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequestJobFactoryImpl url_request_job_factory_; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequestContext url_request_context_; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockURLRequestDelegate url_request_delegate_; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> request_; 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_status_code_; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected_response_; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetSimpleDataRequest) { 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendData(kTestData1); 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSuccessNonrangeRequest(kTestData1, arraysize(kTestData1) - 1); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetSimpleFileRequest) { 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blob_data_->AppendFile(temp_file1_, 0, kuint64max, base::Time()); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSuccessNonrangeRequest(kTestFileData1, arraysize(kTestFileData1) - 1); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetLargeFileRequest) { 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath large_temp_file = 2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) temp_dir_.path().AppendASCII("LargeBlob.dat"); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string large_data; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) large_data.reserve(kBufferSize * 5); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBufferSize * 5; ++i) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) large_data.append(1, static_cast<char>(i % 256)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<int>(large_data.size()), 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile(large_temp_file, large_data.data(), 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) large_data.size())); 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blob_data_->AppendFile(large_temp_file, 0, kuint64max, base::Time()); 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSuccessNonrangeRequest(large_data, large_data.size()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileRequest) { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath non_existent_file = 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file1_.InsertBeforeExtension(FILE_PATH_LITERAL("-na")); 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blob_data_->AppendFile(non_existent_file, 0, kuint64max, base::Time()); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestErrorRequest(404); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetChangedFileRequest) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time old_time = 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file_modification_time1_ - base::TimeDelta::FromSeconds(10); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendFile(temp_file1_, 0, 3, old_time); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestErrorRequest(404); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetSlicedFileRequest) { 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendFile(temp_file1_, 2, 4, temp_file_modification_time1_); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result(kTestFileData1 + 2, 4); 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSuccessNonrangeRequest(result, 4); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetSimpleFileSystemFileRequest) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpFileSystem(); 303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blob_data_->AppendFileSystemFile(temp_file_system_file1_, 0, kuint64max, 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time()); 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSuccessNonrangeRequest(kTestFileSystemFileData1, 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) arraysize(kTestFileSystemFileData1) - 1); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetLargeFileSystemFileRequest) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpFileSystem(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string large_data; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) large_data.reserve(kBufferSize * 5); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBufferSize * 5; ++i) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) large_data.append(1, static_cast<char>(i % 256)); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFilename[] = "LargeBlob.dat"; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriteFileSystemFile(kFilename, large_data.data(), large_data.size(), NULL); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blob_data_->AppendFileSystemFile(GetFileSystemURL(kFilename), 0, kuint64max, 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time()); 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSuccessNonrangeRequest(large_data, large_data.size()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileSystemFileRequest) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpFileSystem(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL non_existent_file = GetFileSystemURL("non-existent.dat"); 327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blob_data_->AppendFileSystemFile(non_existent_file, 0, kuint64max, 328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Time()); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestErrorRequest(404); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetChangedFileSystemFileRequest) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpFileSystem(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time old_time = 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file_system_file_modification_time1_ - 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromSeconds(10); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendFileSystemFile(temp_file_system_file1_, 0, 3, old_time); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestErrorRequest(404); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetSlicedFileSystemFileRequest) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpFileSystem(); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendFileSystemFile(temp_file_system_file1_, 2, 4, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_file_system_file_modification_time1_); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result(kTestFileSystemFileData1 + 2, 4); 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSuccessNonrangeRequest(result, 4); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetComplicatedDataAndFileRequest) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpFileSystem(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BuildComplicatedData(&result); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSuccessNonrangeRequest(result, GetTotalBlobLength()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetRangeRequest1) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpFileSystem(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BuildComplicatedData(&result); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpRequestHeaders extra_headers; 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extra_headers.SetHeader(net::HttpRequestHeaders::kRange, 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HttpByteRange::Bounded(5, 10).GetHeaderValue()); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_status_code_ = 206; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_response_ = result.substr(5, 10 - 5 + 1); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest("GET", extra_headers); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(6, request_->response_headers()->GetContentLength()); 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 first = 0, last = 0, length = 0; 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->response_headers()->GetContentRange(&first, &last, &length)); 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(5, first); 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(10, last); 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(GetTotalBlobLength(), length); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestGetRangeRequest2) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpFileSystem(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BuildComplicatedData(&result); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpRequestHeaders extra_headers; 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extra_headers.SetHeader(net::HttpRequestHeaders::kRange, 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HttpByteRange::Suffix(10).GetHeaderValue()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_status_code_ = 206; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_response_ = result.substr(result.length() - 10); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest("GET", extra_headers); 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(10, request_->response_headers()->GetContentLength()); 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 total = GetTotalBlobLength(); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 first = 0, last = 0, length = 0; 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->response_headers()->GetContentRange(&first, &last, &length)); 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(total - 10, first); 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(total - 1, last); 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(total, length); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BlobURLRequestJobTest, TestExtraHeaders) { 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->set_content_type(kTestContentType); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->set_content_disposition(kTestContentDisposition); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob_data_->AppendData(kTestData1); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_status_code_ = 200; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_response_ = kTestData1; 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest("GET", net::HttpRequestHeaders()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string content_type; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(request_->response_headers()->GetMimeType(&content_type)); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTestContentType, content_type); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* iter = NULL; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string content_disposition; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(request_->response_headers()->EnumerateHeader( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &iter, "Content-Disposition", &content_disposition)); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTestContentDisposition, content_disposition); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace content 418