| 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 <stack> | 5 #include <stack> |
| 6 #include <utility> | 6 #include <utility> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| 11 #include "base/file_util.h" | 11 #include "base/file_util.h" |
| 12 #include "base/run_loop.h" |
| 12 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
| 13 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/message_loop_proxy.h" | 15 #include "base/message_loop_proxy.h" |
| 15 #include "base/scoped_temp_dir.h" | 16 #include "base/scoped_temp_dir.h" |
| 16 #include "base/synchronization/waitable_event.h" | 17 #include "base/synchronization/waitable_event.h" |
| 17 #include "base/threading/thread.h" | 18 #include "base/threading/thread.h" |
| 18 #include "base/time.h" | 19 #include "base/time.h" |
| 19 #include "net/base/file_stream.h" | 20 #include "net/base/file_stream.h" |
| 20 #include "net/base/io_buffer.h" | 21 #include "net/base/io_buffer.h" |
| 21 #include "net/base/net_errors.h" | 22 #include "net/base/net_errors.h" |
| 22 #include "net/http/http_request_headers.h" | 23 #include "net/http/http_request_headers.h" |
| 23 #include "net/http/http_response_headers.h" | 24 #include "net/http/http_response_headers.h" |
| 24 #include "net/url_request/url_request.h" | 25 #include "net/url_request/url_request.h" |
| 25 #include "net/url_request/url_request_context.h" | 26 #include "net/url_request/url_request_context.h" |
| 26 #include "net/url_request/url_request_error_job.h" | 27 #include "net/url_request/url_request_error_job.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include "webkit/blob/blob_data.h" | 29 #include "webkit/blob/blob_data.h" |
| 29 #include "webkit/blob/blob_url_request_job.h" | 30 #include "webkit/blob/blob_url_request_job.h" |
| 31 #include "webkit/fileapi/file_system_context.h" |
| 32 #include "webkit/fileapi/file_system_file_util.h" |
| 33 #include "webkit/fileapi/file_system_operation_context.h" |
| 34 #include "webkit/fileapi/file_system_task_runners.h" |
| 35 #include "webkit/fileapi/file_system_url.h" |
| 36 #include "webkit/fileapi/mock_file_system_options.h" |
| 30 | 37 |
| 31 namespace webkit_blob { | 38 namespace webkit_blob { |
| 32 | 39 |
| 33 static const int kBufferSize = 1024; | 40 namespace { |
| 34 static const char kTestData1[] = "Hello"; | 41 |
| 35 static const char kTestData2[] = "Here it is data."; | 42 const int kBufferSize = 1024; |
| 36 static const char kTestFileData1[] = "0123456789"; | 43 const char kTestData1[] = "Hello"; |
| 37 static const char kTestFileData2[] = "This is sample file."; | 44 const char kTestData2[] = "Here it is data."; |
| 38 static const char kTestContentType[] = "foo/bar"; | 45 const char kTestFileData1[] = "0123456789"; |
| 39 static const char kTestContentDisposition[] = "attachment; filename=foo.txt"; | 46 const char kTestFileData2[] = "This is sample file."; |
| 47 const char kTestFileSystemFileData1[] = "abcdefghijklmnop"; |
| 48 const char kTestFileSystemFileData2[] = "File system file test data."; |
| 49 const char kTestContentType[] = "foo/bar"; |
| 50 const char kTestContentDisposition[] = "attachment; filename=foo.txt"; |
| 51 |
| 52 const char kFileSystemURLOrigin[] = "http://remote"; |
| 53 const fileapi::FileSystemType kFileSystemType = |
| 54 fileapi::kFileSystemTypeTemporary; |
| 55 |
| 56 } // namespace |
| 40 | 57 |
| 41 class BlobURLRequestJobTest : public testing::Test { | 58 class BlobURLRequestJobTest : public testing::Test { |
| 42 public: | 59 public: |
| 43 | 60 |
| 44 // Test Harness ------------------------------------------------------------- | 61 // Test Harness ------------------------------------------------------------- |
| 45 // TODO(jianli): share this test harness with AppCacheURLRequestJobTest | 62 // TODO(jianli): share this test harness with AppCacheURLRequestJobTest |
| 46 | 63 |
| 47 class MockURLRequestDelegate : public net::URLRequest::Delegate { | 64 class MockURLRequestDelegate : public net::URLRequest::Delegate { |
| 48 public: | 65 public: |
| 49 explicit MockURLRequestDelegate(BlobURLRequestJobTest* test) | 66 explicit MockURLRequestDelegate(base::RunLoop* run_loop) |
| 50 : test_(test), | 67 : run_loop_(run_loop), |
| 51 received_data_(new net::IOBuffer(kBufferSize)) { | 68 received_data_(new net::IOBuffer(kBufferSize)) { |
| 52 } | 69 } |
| 53 | 70 |
| 54 virtual void OnResponseStarted(net::URLRequest* request) { | 71 virtual void OnResponseStarted(net::URLRequest* request) { |
| 55 if (request->status().is_success()) { | 72 if (request->status().is_success()) { |
| 56 EXPECT_TRUE(request->response_headers()); | 73 EXPECT_TRUE(request->response_headers()); |
| 57 ReadSome(request); | 74 ReadSome(request); |
| 58 } else { | 75 } else { |
| 59 RequestComplete(); | 76 RequestComplete(); |
| 60 } | 77 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 91 if (bytes_read) { | 108 if (bytes_read) { |
| 92 response_data_.append(received_data_->data(), | 109 response_data_.append(received_data_->data(), |
| 93 static_cast<size_t>(bytes_read)); | 110 static_cast<size_t>(bytes_read)); |
| 94 ReadSome(request); | 111 ReadSome(request); |
| 95 } else { | 112 } else { |
| 96 RequestComplete(); | 113 RequestComplete(); |
| 97 } | 114 } |
| 98 } | 115 } |
| 99 | 116 |
| 100 void RequestComplete() { | 117 void RequestComplete() { |
| 101 test_->ScheduleNextTask(); | 118 run_loop_->Quit(); |
| 102 } | 119 } |
| 103 | 120 |
| 104 BlobURLRequestJobTest* test_; | 121 base::RunLoop* run_loop_; |
| 105 scoped_refptr<net::IOBuffer> received_data_; | 122 scoped_refptr<net::IOBuffer> received_data_; |
| 106 std::string response_data_; | 123 std::string response_data_; |
| 107 }; | 124 }; |
| 108 | 125 |
| 109 // Helper class run a test on our io_thread. The io_thread | 126 // Helper class run a test on our io_thread. The io_thread |
| 110 // is spun up once and reused for all tests. | 127 // is spun up once and reused for all tests. |
| 111 template <class Method> | 128 template <class Method> |
| 112 void MethodWrapper(Method method) { | 129 void MethodWrapper(Method method) { |
| 130 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
| 113 SetUpTest(); | 131 SetUpTest(); |
| 114 (this->*method)(); | 132 (this->*method)(); |
| 133 TearDownTest(); |
| 134 test_finished_event_->Signal(); |
| 115 } | 135 } |
| 116 | 136 |
| 117 void SetUp() { | 137 void SetUp() { |
| 118 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 138 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 119 | 139 |
| 120 temp_file1_ = temp_dir_.path().AppendASCII("BlobFile1.dat"); | 140 temp_file1_ = temp_dir_.path().AppendASCII("BlobFile1.dat"); |
| 121 ASSERT_EQ(static_cast<int>(arraysize(kTestFileData1) - 1), | 141 ASSERT_EQ(static_cast<int>(arraysize(kTestFileData1) - 1), |
| 122 file_util::WriteFile(temp_file1_, kTestFileData1, | 142 file_util::WriteFile(temp_file1_, kTestFileData1, |
| 123 arraysize(kTestFileData1) - 1)); | 143 arraysize(kTestFileData1) - 1)); |
| 124 base::PlatformFileInfo file_info1; | 144 base::PlatformFileInfo file_info1; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 | 177 |
| 158 template <class Method> | 178 template <class Method> |
| 159 void RunTestOnIOThread(Method method) { | 179 void RunTestOnIOThread(Method method) { |
| 160 test_finished_event_ .reset(new base::WaitableEvent(false, false)); | 180 test_finished_event_ .reset(new base::WaitableEvent(false, false)); |
| 161 io_thread_->message_loop()->PostTask( | 181 io_thread_->message_loop()->PostTask( |
| 162 FROM_HERE, base::Bind(&BlobURLRequestJobTest::MethodWrapper<Method>, | 182 FROM_HERE, base::Bind(&BlobURLRequestJobTest::MethodWrapper<Method>, |
| 163 base::Unretained(this), method)); | 183 base::Unretained(this), method)); |
| 164 test_finished_event_->Wait(); | 184 test_finished_event_->Wait(); |
| 165 } | 185 } |
| 166 | 186 |
| 187 void SetUpFileSystem() { |
| 188 // Prepare file system. |
| 189 file_system_context_ = new fileapi::FileSystemContext( |
| 190 fileapi::FileSystemTaskRunners::CreateMockTaskRunners(), |
| 191 NULL, |
| 192 NULL, |
| 193 temp_dir_.path(), |
| 194 fileapi::CreateDisallowFileAccessOptions()); |
| 195 |
| 196 file_system_context_->OpenFileSystem( |
| 197 GURL(kFileSystemURLOrigin), |
| 198 kFileSystemType, |
| 199 true, // create |
| 200 base::Bind(&BlobURLRequestJobTest::OnValidateFileSystem, |
| 201 base::Unretained(this))); |
| 202 base::RunLoop run_loop; |
| 203 run_loop.RunUntilIdle(); |
| 204 ASSERT_TRUE(file_system_root_url_.is_valid()); |
| 205 |
| 206 // Prepare files on file system. |
| 207 const char kFilename1[] = "FileSystemFile1.dat"; |
| 208 temp_file_system_file1_ = GetFileSystemURL(kFilename1); |
| 209 WriteFileSystemFile(kFilename1, kTestFileSystemFileData1, |
| 210 arraysize(kTestFileSystemFileData1), |
| 211 &temp_file_system_file_modification_time1_); |
| 212 const char kFilename2[] = "FileSystemFile2.dat"; |
| 213 temp_file_system_file2_ = GetFileSystemURL(kFilename2); |
| 214 WriteFileSystemFile(kFilename2, kTestFileSystemFileData2, |
| 215 arraysize(kTestFileSystemFileData2), |
| 216 &temp_file_system_file_modification_time2_); |
| 217 } |
| 218 |
| 219 GURL GetFileSystemURL(const std::string& filename) { |
| 220 return GURL(file_system_root_url_.spec() + filename); |
| 221 } |
| 222 |
| 223 void WriteFileSystemFile(const std::string& filename, |
| 224 const char* buf, int buf_size, |
| 225 base::Time* modification_time) { |
| 226 fileapi::FileSystemURL url(GURL(kFileSystemURLOrigin), |
| 227 kFileSystemType, |
| 228 FilePath().AppendASCII(filename)); |
| 229 |
| 230 fileapi::FileSystemFileUtil* file_util = |
| 231 file_system_context_->GetFileUtil(kFileSystemType); |
| 232 |
| 233 fileapi::FileSystemOperationContext context(file_system_context_); |
| 234 context.set_allowed_bytes_growth(1024); |
| 235 |
| 236 base::PlatformFile handle = base::kInvalidPlatformFileValue; |
| 237 bool created = false; |
| 238 ASSERT_EQ(base::PLATFORM_FILE_OK, file_util->CreateOrOpen( |
| 239 &context, |
| 240 url, |
| 241 base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE, |
| 242 &handle, |
| 243 &created)); |
| 244 EXPECT_TRUE(created); |
| 245 ASSERT_NE(base::kInvalidPlatformFileValue, handle); |
| 246 ASSERT_EQ(buf_size, |
| 247 base::WritePlatformFile(handle, 0 /* offset */, buf, buf_size)); |
| 248 base::ClosePlatformFile(handle); |
| 249 |
| 250 base::PlatformFileInfo file_info; |
| 251 FilePath platform_path; |
| 252 ASSERT_EQ(base::PLATFORM_FILE_OK, |
| 253 file_util->GetFileInfo(&context, url, &file_info, |
| 254 &platform_path)); |
| 255 if (modification_time) |
| 256 *modification_time = file_info.last_modified; |
| 257 } |
| 258 |
| 167 void SetUpTest() { | 259 void SetUpTest() { |
| 168 DCHECK(MessageLoop::current() == io_thread_->message_loop()); | 260 DCHECK(MessageLoop::current() == io_thread_->message_loop()); |
| 169 | 261 |
| 170 net::URLRequest::Deprecated::RegisterProtocolFactory( | 262 net::URLRequest::Deprecated::RegisterProtocolFactory( |
| 171 "blob", &BlobURLRequestJobFactory); | 263 "blob", &BlobURLRequestJobFactory); |
| 172 url_request_delegate_.reset(new MockURLRequestDelegate(this)); | 264 |
| 265 ASSERT_EQ(static_cast<int>(arraysize(kTestFileData1) - 1), |
| 266 file_util::WriteFile(temp_file1_, kTestFileData1, |
| 267 arraysize(kTestFileData1) - 1)); |
| 173 } | 268 } |
| 174 | 269 |
| 175 void TearDownTest() { | 270 void TearDownTest() { |
| 176 DCHECK(MessageLoop::current() == io_thread_->message_loop()); | 271 DCHECK(MessageLoop::current() == io_thread_->message_loop()); |
| 177 | 272 |
| 273 file_system_context_ = NULL; |
| 274 |
| 178 request_.reset(); | 275 request_.reset(); |
| 179 url_request_delegate_.reset(); | |
| 180 | 276 |
| 181 DCHECK(!blob_url_request_job_); | 277 DCHECK(!blob_url_request_job_); |
| 182 net::URLRequest::Deprecated::RegisterProtocolFactory("blob", NULL); | 278 net::URLRequest::Deprecated::RegisterProtocolFactory("blob", NULL); |
| 183 } | 279 } |
| 184 | 280 |
| 185 void TestFinished() { | 281 void OnValidateFileSystem(base::PlatformFileError result, |
| 186 // We unwind the stack prior to finishing up to let stack | 282 const std::string& name, |
| 187 // based objects get deleted. | 283 const GURL& root) { |
| 188 DCHECK(MessageLoop::current() == io_thread_->message_loop()); | 284 ASSERT_EQ(base::PLATFORM_FILE_OK, result); |
| 189 MessageLoop::current()->PostTask( | 285 ASSERT_TRUE(root.is_valid()); |
| 190 FROM_HERE, | 286 file_system_root_url_ = root; |
| 191 base::Bind(&BlobURLRequestJobTest::TestFinishedUnwound, | |
| 192 base::Unretained(this))); | |
| 193 } | |
| 194 | |
| 195 void TestFinishedUnwound() { | |
| 196 TearDownTest(); | |
| 197 test_finished_event_->Signal(); | |
| 198 } | |
| 199 | |
| 200 void PushNextTask(const base::Closure& task) { | |
| 201 task_stack_.push(std::pair<base::Closure, bool>(task, false)); | |
| 202 } | |
| 203 | |
| 204 void PushNextTaskAsImmediate(const base::Closure& task) { | |
| 205 task_stack_.push(std::pair<base::Closure, bool>(task, true)); | |
| 206 } | |
| 207 | |
| 208 void ScheduleNextTask() { | |
| 209 DCHECK(MessageLoop::current() == io_thread_->message_loop()); | |
| 210 if (task_stack_.empty()) { | |
| 211 TestFinished(); | |
| 212 return; | |
| 213 } | |
| 214 | |
| 215 base::Closure task = task_stack_.top().first; | |
| 216 bool immediate = task_stack_.top().second; | |
| 217 task_stack_.pop(); | |
| 218 if (immediate) | |
| 219 task.Run(); | |
| 220 else | |
| 221 MessageLoop::current()->PostTask(FROM_HERE, task); | |
| 222 } | 287 } |
| 223 | 288 |
| 224 void TestSuccessRequest(BlobData* blob_data, | 289 void TestSuccessRequest(BlobData* blob_data, |
| 225 const std::string& expected_response) { | 290 const std::string& expected_response) { |
| 226 PushNextTask(base::Bind(&BlobURLRequestJobTest::VerifyResponse, | |
| 227 base::Unretained(this))); | |
| 228 expected_status_code_ = 200; | 291 expected_status_code_ = 200; |
| 229 expected_response_ = expected_response; | 292 expected_response_ = expected_response; |
| 230 return TestRequest("GET", net::HttpRequestHeaders(), blob_data); | 293 TestRequest("GET", net::HttpRequestHeaders(), blob_data); |
| 231 } | 294 } |
| 232 | 295 |
| 233 void TestErrorRequest(BlobData* blob_data, | 296 void TestErrorRequest(BlobData* blob_data, |
| 234 int expected_status_code) { | 297 int expected_status_code) { |
| 235 PushNextTask(base::Bind(&BlobURLRequestJobTest::VerifyResponse, | |
| 236 base::Unretained(this))); | |
| 237 expected_status_code_ = expected_status_code; | 298 expected_status_code_ = expected_status_code; |
| 238 expected_response_ = ""; | 299 expected_response_ = ""; |
| 239 return TestRequest("GET", net::HttpRequestHeaders(), blob_data); | 300 TestRequest("GET", net::HttpRequestHeaders(), blob_data); |
| 240 } | 301 } |
| 241 | 302 |
| 242 void TestRequest(const std::string& method, | 303 void TestRequest(const std::string& method, |
| 243 const net::HttpRequestHeaders& extra_headers, | 304 const net::HttpRequestHeaders& extra_headers, |
| 244 BlobData* blob_data) { | 305 BlobData* blob_data) { |
| 245 // This test has async steps. | 306 base::RunLoop run_loop; |
| 307 MockURLRequestDelegate url_request_delegate(&run_loop); |
| 308 |
| 246 request_.reset(empty_context_.CreateRequest( | 309 request_.reset(empty_context_.CreateRequest( |
| 247 GURL("blob:blah"), url_request_delegate_.get())); | 310 GURL("blob:blah"), &url_request_delegate)); |
| 248 request_->set_method(method); | 311 request_->set_method(method); |
| 249 blob_url_request_job_ = new BlobURLRequestJob( | 312 blob_url_request_job_ = new BlobURLRequestJob( |
| 250 request_.get(), | 313 request_.get(), |
| 251 empty_context_.network_delegate(), | 314 empty_context_.network_delegate(), |
| 252 blob_data, | 315 blob_data, |
| 316 file_system_context_, |
| 253 base::MessageLoopProxy::current()); | 317 base::MessageLoopProxy::current()); |
| 254 | 318 |
| 255 // Start the request. | 319 // Start the request. |
| 256 if (!extra_headers.IsEmpty()) | 320 if (!extra_headers.IsEmpty()) |
| 257 request_->SetExtraRequestHeaders(extra_headers); | 321 request_->SetExtraRequestHeaders(extra_headers); |
| 258 request_->Start(); | 322 request_->Start(); |
| 259 | 323 |
| 260 // Completion is async. | 324 run_loop.Run(); |
| 261 } | |
| 262 | 325 |
| 263 void VerifyResponse() { | 326 // Verify response. |
| 264 EXPECT_TRUE(request_->status().is_success()); | 327 EXPECT_TRUE(request_->status().is_success()); |
| 265 EXPECT_EQ(expected_status_code_, | 328 EXPECT_EQ(expected_status_code_, |
| 266 request_->response_headers()->response_code()); | 329 request_->response_headers()->response_code()); |
| 267 EXPECT_STREQ(expected_response_.c_str(), | 330 EXPECT_STREQ(expected_response_.c_str(), |
| 268 url_request_delegate_->response_data().c_str()); | 331 url_request_delegate.response_data().c_str()); |
| 269 TestFinished(); | |
| 270 } | 332 } |
| 271 | 333 |
| 272 // Test Cases --------------------------------------------------------------- | 334 // Test Cases --------------------------------------------------------------- |
| 273 | 335 |
| 274 void TestGetSimpleDataRequest() { | 336 void TestGetSimpleDataRequest() { |
| 275 scoped_refptr<BlobData> blob_data(new BlobData()); | 337 scoped_refptr<BlobData> blob_data(new BlobData()); |
| 276 blob_data->AppendData(kTestData1); | 338 blob_data->AppendData(kTestData1); |
| 277 TestSuccessRequest(blob_data, kTestData1); | 339 TestSuccessRequest(blob_data, kTestData1); |
| 278 } | 340 } |
| 279 | 341 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 TestErrorRequest(blob_data, 404); | 375 TestErrorRequest(blob_data, 404); |
| 314 } | 376 } |
| 315 | 377 |
| 316 void TestGetSlicedFileRequest() { | 378 void TestGetSlicedFileRequest() { |
| 317 scoped_refptr<BlobData> blob_data(new BlobData()); | 379 scoped_refptr<BlobData> blob_data(new BlobData()); |
| 318 blob_data->AppendFile(temp_file1_, 2, 4, temp_file_modification_time1_); | 380 blob_data->AppendFile(temp_file1_, 2, 4, temp_file_modification_time1_); |
| 319 std::string result(kTestFileData1 + 2, 4); | 381 std::string result(kTestFileData1 + 2, 4); |
| 320 TestSuccessRequest(blob_data, result); | 382 TestSuccessRequest(blob_data, result); |
| 321 } | 383 } |
| 322 | 384 |
| 385 void TestGetSimpleFileSystemFileRequest() { |
| 386 SetUpFileSystem(); |
| 387 scoped_refptr<BlobData> blob_data(new BlobData()); |
| 388 blob_data->AppendFileSystemFile(temp_file_system_file1_, 0, -1, |
| 389 base::Time()); |
| 390 TestSuccessRequest(blob_data, kTestFileSystemFileData1); |
| 391 } |
| 392 |
| 393 void TestGetLargeFileSystemFileRequest() { |
| 394 SetUpFileSystem(); |
| 395 std::string large_data; |
| 396 large_data.reserve(kBufferSize * 5); |
| 397 for (int i = 0; i < kBufferSize * 5; ++i) |
| 398 large_data.append(1, static_cast<char>(i % 256)); |
| 399 |
| 400 const char kFilename[] = "LargeBlob.dat"; |
| 401 WriteFileSystemFile(kFilename, large_data.data(), large_data.size(), NULL); |
| 402 |
| 403 scoped_refptr<BlobData> blob_data(new BlobData()); |
| 404 blob_data->AppendFileSystemFile(GetFileSystemURL(kFilename), |
| 405 0, -1, base::Time()); |
| 406 TestSuccessRequest(blob_data, large_data); |
| 407 } |
| 408 |
| 409 void TestGetNonExistentFileSystemFileRequest() { |
| 410 SetUpFileSystem(); |
| 411 GURL non_existent_file = GetFileSystemURL("non-existent.dat"); |
| 412 scoped_refptr<BlobData> blob_data(new BlobData()); |
| 413 blob_data->AppendFileSystemFile(non_existent_file, 0, -1, base::Time()); |
| 414 TestErrorRequest(blob_data, 404); |
| 415 } |
| 416 |
| 417 void TestGetChangedFileSystemFileRequest() { |
| 418 SetUpFileSystem(); |
| 419 scoped_refptr<BlobData> blob_data(new BlobData()); |
| 420 base::Time old_time = |
| 421 temp_file_system_file_modification_time1_ - |
| 422 base::TimeDelta::FromSeconds(10); |
| 423 blob_data->AppendFileSystemFile(temp_file_system_file1_, 0, 3, old_time); |
| 424 TestErrorRequest(blob_data, 404); |
| 425 } |
| 426 |
| 427 void TestGetSlicedFileSystemFileRequest() { |
| 428 SetUpFileSystem(); |
| 429 scoped_refptr<BlobData> blob_data(new BlobData()); |
| 430 blob_data->AppendFileSystemFile(temp_file_system_file1_, 2, 4, |
| 431 temp_file_system_file_modification_time1_); |
| 432 std::string result(kTestFileSystemFileData1 + 2, 4); |
| 433 TestSuccessRequest(blob_data, result); |
| 434 } |
| 435 |
| 323 scoped_refptr<BlobData> BuildComplicatedData(std::string* expected_result) { | 436 scoped_refptr<BlobData> BuildComplicatedData(std::string* expected_result) { |
| 437 SetUpFileSystem(); |
| 324 scoped_refptr<BlobData> blob_data(new BlobData()); | 438 scoped_refptr<BlobData> blob_data(new BlobData()); |
| 325 blob_data->AppendData(kTestData1 + 1, 2); | 439 blob_data->AppendData(kTestData1 + 1, 2); |
| 326 blob_data->AppendFile(temp_file1_, 2, 3, temp_file_modification_time1_); | 440 blob_data->AppendFile(temp_file1_, 2, 3, temp_file_modification_time1_); |
| 327 blob_data->AppendData(kTestData2 + 3, 4); | 441 blob_data->AppendFileSystemFile(temp_file_system_file1_, 3, 4, |
| 328 blob_data->AppendFile(temp_file2_, 4, 5, temp_file_modification_time2_); | 442 temp_file_system_file_modification_time1_); |
| 443 blob_data->AppendData(kTestData2 + 4, 5); |
| 444 blob_data->AppendFile(temp_file2_, 5, 6, temp_file_modification_time2_); |
| 445 blob_data->AppendFileSystemFile(temp_file_system_file2_, 6, 7, |
| 446 temp_file_system_file_modification_time2_); |
| 329 *expected_result = std::string(kTestData1 + 1, 2); | 447 *expected_result = std::string(kTestData1 + 1, 2); |
| 330 *expected_result += std::string(kTestFileData1 + 2, 3); | 448 *expected_result += std::string(kTestFileData1 + 2, 3); |
| 331 *expected_result += std::string(kTestData2 + 3, 4); | 449 *expected_result += std::string(kTestFileSystemFileData1 + 3, 4); |
| 332 *expected_result += std::string(kTestFileData2 + 4, 5); | 450 *expected_result += std::string(kTestData2 + 4, 5); |
| 451 *expected_result += std::string(kTestFileData2 + 5, 6); |
| 452 *expected_result += std::string(kTestFileSystemFileData2 + 6, 7); |
| 333 return blob_data; | 453 return blob_data; |
| 334 } | 454 } |
| 335 | 455 |
| 336 void TestGetComplicatedDataAndFileRequest() { | 456 void TestGetComplicatedDataAndFileRequest() { |
| 337 std::string result; | 457 std::string result; |
| 338 scoped_refptr<BlobData> blob_data = BuildComplicatedData(&result); | 458 scoped_refptr<BlobData> blob_data = BuildComplicatedData(&result); |
| 339 TestSuccessRequest(blob_data, result); | 459 TestSuccessRequest(blob_data, result); |
| 340 } | 460 } |
| 341 | 461 |
| 342 void TestGetRangeRequest1() { | 462 void TestGetRangeRequest1() { |
| 343 std::string result; | 463 std::string result; |
| 344 scoped_refptr<BlobData> blob_data = BuildComplicatedData(&result); | 464 scoped_refptr<BlobData> blob_data = BuildComplicatedData(&result); |
| 345 net::HttpRequestHeaders extra_headers; | 465 net::HttpRequestHeaders extra_headers; |
| 346 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, "bytes=5-10"); | 466 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, "bytes=5-10"); |
| 347 PushNextTask(base::Bind(&BlobURLRequestJobTest::VerifyResponse, | |
| 348 base::Unretained(this))); | |
| 349 expected_status_code_ = 206; | 467 expected_status_code_ = 206; |
| 350 expected_response_ = result.substr(5, 10 - 5 + 1); | 468 expected_response_ = result.substr(5, 10 - 5 + 1); |
| 351 return TestRequest("GET", extra_headers, blob_data); | 469 TestRequest("GET", extra_headers, blob_data); |
| 352 } | 470 } |
| 353 | 471 |
| 354 void TestGetRangeRequest2() { | 472 void TestGetRangeRequest2() { |
| 355 std::string result; | 473 std::string result; |
| 356 scoped_refptr<BlobData> blob_data = BuildComplicatedData(&result); | 474 scoped_refptr<BlobData> blob_data = BuildComplicatedData(&result); |
| 357 net::HttpRequestHeaders extra_headers; | 475 net::HttpRequestHeaders extra_headers; |
| 358 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, "bytes=-10"); | 476 extra_headers.SetHeader(net::HttpRequestHeaders::kRange, "bytes=-10"); |
| 359 PushNextTask(base::Bind(&BlobURLRequestJobTest::VerifyResponse, | |
| 360 base::Unretained(this))); | |
| 361 expected_status_code_ = 206; | 477 expected_status_code_ = 206; |
| 362 expected_response_ = result.substr(result.length() - 10); | 478 expected_response_ = result.substr(result.length() - 10); |
| 363 return TestRequest("GET", extra_headers, blob_data); | 479 TestRequest("GET", extra_headers, blob_data); |
| 364 } | 480 } |
| 365 | 481 |
| 366 void TestExtraHeaders() { | 482 void TestExtraHeaders() { |
| 367 scoped_refptr<BlobData> blob_data(new BlobData()); | 483 scoped_refptr<BlobData> blob_data(new BlobData()); |
| 368 blob_data->set_content_type(kTestContentType); | 484 blob_data->set_content_type(kTestContentType); |
| 369 blob_data->set_content_disposition(kTestContentDisposition); | 485 blob_data->set_content_disposition(kTestContentDisposition); |
| 370 blob_data->AppendData(kTestData1); | 486 blob_data->AppendData(kTestData1); |
| 371 PushNextTask( | 487 expected_status_code_ = 200; |
| 372 base::Bind(&BlobURLRequestJobTest::VerifyResponseForTestExtraHeaders, | 488 expected_response_ = kTestData1; |
| 373 base::Unretained(this))); | |
| 374 TestRequest("GET", net::HttpRequestHeaders(), blob_data); | 489 TestRequest("GET", net::HttpRequestHeaders(), blob_data); |
| 375 } | |
| 376 | 490 |
| 377 void VerifyResponseForTestExtraHeaders() { | |
| 378 EXPECT_TRUE(request_->status().is_success()); | |
| 379 EXPECT_EQ(request_->response_headers()->response_code(), 200); | |
| 380 EXPECT_STREQ(url_request_delegate_->response_data().c_str(), kTestData1); | |
| 381 std::string content_type; | 491 std::string content_type; |
| 382 EXPECT_TRUE(request_->response_headers()->GetMimeType(&content_type)); | 492 EXPECT_TRUE(request_->response_headers()->GetMimeType(&content_type)); |
| 383 EXPECT_STREQ(content_type.c_str(), kTestContentType); | 493 EXPECT_STREQ(content_type.c_str(), kTestContentType); |
| 384 void* iter = NULL; | 494 void* iter = NULL; |
| 385 std::string content_disposition; | 495 std::string content_disposition; |
| 386 EXPECT_TRUE(request_->response_headers()->EnumerateHeader( | 496 EXPECT_TRUE(request_->response_headers()->EnumerateHeader( |
| 387 &iter, "Content-Disposition", &content_disposition)); | 497 &iter, "Content-Disposition", &content_disposition)); |
| 388 EXPECT_STREQ(content_disposition.c_str(), kTestContentDisposition); | 498 EXPECT_STREQ(content_disposition.c_str(), kTestContentDisposition); |
| 389 TestFinished(); | |
| 390 } | 499 } |
| 391 | 500 |
| 392 private: | 501 private: |
| 393 ScopedTempDir temp_dir_; | 502 ScopedTempDir temp_dir_; |
| 394 FilePath temp_file1_; | 503 FilePath temp_file1_; |
| 395 FilePath temp_file2_; | 504 FilePath temp_file2_; |
| 396 base::Time temp_file_modification_time1_; | 505 base::Time temp_file_modification_time1_; |
| 397 base::Time temp_file_modification_time2_; | 506 base::Time temp_file_modification_time2_; |
| 507 GURL file_system_root_url_; |
| 508 GURL temp_file_system_file1_; |
| 509 GURL temp_file_system_file2_; |
| 510 base::Time temp_file_system_file_modification_time1_; |
| 511 base::Time temp_file_system_file_modification_time2_; |
| 398 scoped_ptr<base::Thread> io_thread_; | 512 scoped_ptr<base::Thread> io_thread_; |
| 399 static BlobURLRequestJob* blob_url_request_job_; | 513 static BlobURLRequestJob* blob_url_request_job_; |
| 400 | 514 |
| 401 scoped_ptr<base::WaitableEvent> test_finished_event_; | 515 scoped_ptr<base::WaitableEvent> test_finished_event_; |
| 402 std::stack<std::pair<base::Closure, bool> > task_stack_; | |
| 403 net::URLRequestContext empty_context_; | 516 net::URLRequestContext empty_context_; |
| 404 scoped_ptr<net::URLRequest> request_; | 517 scoped_ptr<net::URLRequest> request_; |
| 405 scoped_ptr<MockURLRequestDelegate> url_request_delegate_; | 518 scoped_refptr<fileapi::FileSystemContext> file_system_context_; |
| 406 int expected_status_code_; | 519 int expected_status_code_; |
| 407 std::string expected_response_; | 520 std::string expected_response_; |
| 408 }; | 521 }; |
| 409 | 522 |
| 410 // static | 523 // static |
| 411 BlobURLRequestJob* BlobURLRequestJobTest::blob_url_request_job_ = NULL; | 524 BlobURLRequestJob* BlobURLRequestJobTest::blob_url_request_job_ = NULL; |
| 412 | 525 |
| 413 TEST_F(BlobURLRequestJobTest, TestGetSimpleDataRequest) { | 526 TEST_F(BlobURLRequestJobTest, TestGetSimpleDataRequest) { |
| 414 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetSimpleDataRequest); | 527 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetSimpleDataRequest); |
| 415 } | 528 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 427 } | 540 } |
| 428 | 541 |
| 429 TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileRequest) { | 542 TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileRequest) { |
| 430 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetNonExistentFileRequest); | 543 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetNonExistentFileRequest); |
| 431 } | 544 } |
| 432 | 545 |
| 433 TEST_F(BlobURLRequestJobTest, TestGetChangedFileRequest) { | 546 TEST_F(BlobURLRequestJobTest, TestGetChangedFileRequest) { |
| 434 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetChangedFileRequest); | 547 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetChangedFileRequest); |
| 435 } | 548 } |
| 436 | 549 |
| 550 TEST_F(BlobURLRequestJobTest, TestGetSimpleFileSystemFileRequest) { |
| 551 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetSimpleFileSystemFileRequest); |
| 552 } |
| 553 |
| 554 TEST_F(BlobURLRequestJobTest, TestGetLargeFileSystemFileRequest) { |
| 555 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetLargeFileSystemFileRequest); |
| 556 } |
| 557 |
| 558 TEST_F(BlobURLRequestJobTest, TestGetSlicedFileSystemFileRequest) { |
| 559 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetSlicedFileSystemFileRequest); |
| 560 } |
| 561 |
| 562 TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileSystemFileRequest) { |
| 563 RunTestOnIOThread( |
| 564 &BlobURLRequestJobTest::TestGetNonExistentFileSystemFileRequest); |
| 565 } |
| 566 |
| 567 TEST_F(BlobURLRequestJobTest, TestGetChangedFileSystemFileRequest) { |
| 568 RunTestOnIOThread( |
| 569 &BlobURLRequestJobTest::TestGetChangedFileSystemFileRequest); |
| 570 } |
| 571 |
| 437 TEST_F(BlobURLRequestJobTest, TestGetComplicatedDataAndFileRequest) { | 572 TEST_F(BlobURLRequestJobTest, TestGetComplicatedDataAndFileRequest) { |
| 438 RunTestOnIOThread( | 573 RunTestOnIOThread( |
| 439 &BlobURLRequestJobTest::TestGetComplicatedDataAndFileRequest); | 574 &BlobURLRequestJobTest::TestGetComplicatedDataAndFileRequest); |
| 440 } | 575 } |
| 441 | 576 |
| 442 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest1) { | 577 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest1) { |
| 443 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetRangeRequest1); | 578 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetRangeRequest1); |
| 444 } | 579 } |
| 445 | 580 |
| 446 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest2) { | 581 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest2) { |
| 447 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetRangeRequest2); | 582 RunTestOnIOThread(&BlobURLRequestJobTest::TestGetRangeRequest2); |
| 448 } | 583 } |
| 449 | 584 |
| 450 TEST_F(BlobURLRequestJobTest, TestExtraHeaders) { | 585 TEST_F(BlobURLRequestJobTest, TestExtraHeaders) { |
| 451 RunTestOnIOThread(&BlobURLRequestJobTest::TestExtraHeaders); | 586 RunTestOnIOThread(&BlobURLRequestJobTest::TestExtraHeaders); |
| 452 } | 587 } |
| 453 | 588 |
| 454 } // namespace webkit_blob | 589 } // namespace webkit_blob |
| OLD | NEW |