| 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 "android_webview/browser/net/android_stream_reader_url_request_job.h" |
| 6 |
| 7 #include <utility> |
| 8 |
| 5 #include "android_webview/browser/input_stream.h" | 9 #include "android_webview/browser/input_stream.h" |
| 6 #include "android_webview/browser/net/android_stream_reader_url_request_job.h" | |
| 7 #include "android_webview/browser/net/aw_url_request_job_factory.h" | 10 #include "android_webview/browser/net/aw_url_request_job_factory.h" |
| 8 #include "android_webview/browser/net/input_stream_reader.h" | 11 #include "android_webview/browser/net/input_stream_reader.h" |
| 9 #include "base/format_macros.h" | 12 #include "base/format_macros.h" |
| 10 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
| 12 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 13 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
| 14 #include "base/thread_task_runner_handle.h" | 17 #include "base/thread_task_runner_handle.h" |
| 15 #include "net/base/request_priority.h" | 18 #include "net/base/request_priority.h" |
| 16 #include "net/http/http_byte_range.h" | 19 #include "net/http/http_byte_range.h" |
| 17 #include "net/http/http_response_headers.h" | 20 #include "net/http/http_response_headers.h" |
| 18 #include "net/url_request/url_request.h" | 21 #include "net/url_request/url_request.h" |
| 19 #include "net/url_request/url_request_job_factory_impl.h" | 22 #include "net/url_request/url_request_job_factory_impl.h" |
| 20 #include "net/url_request/url_request_test_util.h" | 23 #include "net/url_request/url_request_test_util.h" |
| 21 | |
| 22 #include "testing/gmock/include/gmock/gmock.h" | 24 #include "testing/gmock/include/gmock/gmock.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 26 |
| 25 using net::TestDelegate; | 27 using net::TestDelegate; |
| 26 using net::TestJobInterceptor; | 28 using net::TestJobInterceptor; |
| 27 using net::TestNetworkDelegate; | 29 using net::TestNetworkDelegate; |
| 28 using net::TestURLRequestContext; | 30 using net::TestURLRequestContext; |
| 29 using net::URLRequest; | 31 using net::URLRequest; |
| 30 using testing::DoAll; | 32 using testing::DoAll; |
| 31 using testing::Ge; | 33 using testing::Ge; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 MockInputStreamReader() : InputStreamReader(new NotImplInputStream()) {} | 149 MockInputStreamReader() : InputStreamReader(new NotImplInputStream()) {} |
| 148 ~MockInputStreamReader() {} | 150 ~MockInputStreamReader() {} |
| 149 | 151 |
| 150 MOCK_METHOD1(Seek, int(const net::HttpByteRange& byte_range)); | 152 MOCK_METHOD1(Seek, int(const net::HttpByteRange& byte_range)); |
| 151 MOCK_METHOD2(ReadRawData, int(net::IOBuffer* buffer, int buffer_size)); | 153 MOCK_METHOD2(ReadRawData, int(net::IOBuffer* buffer, int buffer_size)); |
| 152 }; | 154 }; |
| 153 | 155 |
| 154 | 156 |
| 155 class TestStreamReaderJob : public AndroidStreamReaderURLRequestJob { | 157 class TestStreamReaderJob : public AndroidStreamReaderURLRequestJob { |
| 156 public: | 158 public: |
| 157 TestStreamReaderJob( | 159 TestStreamReaderJob(net::URLRequest* request, |
| 158 net::URLRequest* request, | 160 net::NetworkDelegate* network_delegate, |
| 159 net::NetworkDelegate* network_delegate, | 161 scoped_ptr<Delegate> delegate, |
| 160 scoped_ptr<Delegate> delegate, | 162 scoped_ptr<InputStreamReader> stream_reader) |
| 161 scoped_ptr<InputStreamReader> stream_reader) | |
| 162 : AndroidStreamReaderURLRequestJob(request, | 163 : AndroidStreamReaderURLRequestJob(request, |
| 163 network_delegate, | 164 network_delegate, |
| 164 delegate.Pass()), | 165 std::move(delegate)), |
| 165 stream_reader_(stream_reader.Pass()) { | 166 stream_reader_(std::move(stream_reader)) { |
| 166 task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 167 task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 167 } | 168 } |
| 168 | 169 |
| 169 ~TestStreamReaderJob() override {} | 170 ~TestStreamReaderJob() override {} |
| 170 | 171 |
| 171 scoped_ptr<InputStreamReader> CreateStreamReader( | 172 scoped_ptr<InputStreamReader> CreateStreamReader( |
| 172 InputStream* stream) override { | 173 InputStream* stream) override { |
| 173 return stream_reader_.Pass(); | 174 return std::move(stream_reader_); |
| 174 } | 175 } |
| 175 | 176 |
| 176 protected: | 177 protected: |
| 177 base::TaskRunner* GetWorkerThreadRunner() override { | 178 base::TaskRunner* GetWorkerThreadRunner() override { |
| 178 return task_runner_.get(); | 179 return task_runner_.get(); |
| 179 } | 180 } |
| 180 | 181 |
| 181 scoped_ptr<InputStreamReader> stream_reader_; | 182 scoped_ptr<InputStreamReader> stream_reader_; |
| 182 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 183 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| 183 }; | 184 }; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 201 | 202 |
| 202 void SetRange(net::URLRequest* req, int first_byte, int last_byte) { | 203 void SetRange(net::URLRequest* req, int first_byte, int last_byte) { |
| 203 net::HttpRequestHeaders headers; | 204 net::HttpRequestHeaders headers; |
| 204 headers.SetHeader(net::HttpRequestHeaders::kRange, | 205 headers.SetHeader(net::HttpRequestHeaders::kRange, |
| 205 net::HttpByteRange::Bounded( | 206 net::HttpByteRange::Bounded( |
| 206 first_byte, last_byte).GetHeaderValue()); | 207 first_byte, last_byte).GetHeaderValue()); |
| 207 req->SetExtraRequestHeaders(headers); | 208 req->SetExtraRequestHeaders(headers); |
| 208 } | 209 } |
| 209 | 210 |
| 210 void SetUpTestJob(scoped_ptr<InputStreamReader> stream_reader) { | 211 void SetUpTestJob(scoped_ptr<InputStreamReader> stream_reader) { |
| 211 SetUpTestJob(stream_reader.Pass(), | 212 SetUpTestJob(std::move(stream_reader), |
| 212 make_scoped_ptr(new StreamReaderDelegate())); | 213 make_scoped_ptr(new StreamReaderDelegate())); |
| 213 } | 214 } |
| 214 | 215 |
| 215 void SetUpTestJob(scoped_ptr<InputStreamReader> stream_reader, | 216 void SetUpTestJob(scoped_ptr<InputStreamReader> stream_reader, |
| 216 scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate> | 217 scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate> |
| 217 stream_reader_delegate) { | 218 stream_reader_delegate) { |
| 218 scoped_ptr<TestStreamReaderJob> test_stream_reader_job( | 219 scoped_ptr<TestStreamReaderJob> test_stream_reader_job( |
| 219 new TestStreamReaderJob(req_.get(), &network_delegate_, | 220 new TestStreamReaderJob(req_.get(), &network_delegate_, |
| 220 stream_reader_delegate.Pass(), | 221 std::move(stream_reader_delegate), |
| 221 stream_reader.Pass())); | 222 std::move(stream_reader))); |
| 222 // The Interceptor is owned by the |factory_|. | 223 // The Interceptor is owned by the |factory_|. |
| 223 scoped_ptr<TestJobInterceptor> protocol_handler(new TestJobInterceptor); | 224 scoped_ptr<TestJobInterceptor> protocol_handler(new TestJobInterceptor); |
| 224 protocol_handler->set_main_intercept_job(std::move(test_stream_reader_job)); | 225 protocol_handler->set_main_intercept_job(std::move(test_stream_reader_job)); |
| 225 bool set_protocol = | 226 bool set_protocol = |
| 226 factory_.SetProtocolHandler("content", std::move(protocol_handler)); | 227 factory_.SetProtocolHandler("content", std::move(protocol_handler)); |
| 227 DCHECK(set_protocol); | 228 DCHECK(set_protocol); |
| 228 } | 229 } |
| 229 | 230 |
| 230 base::MessageLoopForIO loop_; | 231 base::MessageLoopForIO loop_; |
| 231 TestURLRequestContext context_; | 232 TestURLRequestContext context_; |
| 232 android_webview::AwURLRequestJobFactory factory_; | 233 android_webview::AwURLRequestJobFactory factory_; |
| 233 TestDelegate url_request_delegate_; | 234 TestDelegate url_request_delegate_; |
| 234 TestNetworkDelegate network_delegate_; | 235 TestNetworkDelegate network_delegate_; |
| 235 scoped_ptr<URLRequest> req_; | 236 scoped_ptr<URLRequest> req_; |
| 236 }; | 237 }; |
| 237 | 238 |
| 238 TEST_F(AndroidStreamReaderURLRequestJobTest, ReadEmptyStream) { | 239 TEST_F(AndroidStreamReaderURLRequestJobTest, ReadEmptyStream) { |
| 239 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( | 240 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
| 240 new StrictMock<MockInputStreamReader>()); | 241 new StrictMock<MockInputStreamReader>()); |
| 241 { | 242 { |
| 242 InSequence s; | 243 InSequence s; |
| 243 EXPECT_CALL(*stream_reader, Seek(_)) | 244 EXPECT_CALL(*stream_reader, Seek(_)) |
| 244 .WillOnce(Return(0)); | 245 .WillOnce(Return(0)); |
| 245 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Gt(0))) | 246 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Gt(0))) |
| 246 .WillOnce(Return(0)); | 247 .WillOnce(Return(0)); |
| 247 } | 248 } |
| 248 | 249 |
| 249 SetUpTestJob(stream_reader.Pass()); | 250 SetUpTestJob(std::move(stream_reader)); |
| 250 | 251 |
| 251 req_->Start(); | 252 req_->Start(); |
| 252 | 253 |
| 253 // The TestDelegate will quit the message loop on request completion. | 254 // The TestDelegate will quit the message loop on request completion. |
| 254 base::MessageLoop::current()->Run(); | 255 base::MessageLoop::current()->Run(); |
| 255 | 256 |
| 256 EXPECT_FALSE(url_request_delegate_.request_failed()); | 257 EXPECT_FALSE(url_request_delegate_.request_failed()); |
| 257 EXPECT_EQ(1, network_delegate_.completed_requests()); | 258 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 258 EXPECT_EQ(0, network_delegate_.error_count()); | 259 EXPECT_EQ(0, network_delegate_.error_count()); |
| 259 EXPECT_EQ(200, req_->GetResponseCode()); | 260 EXPECT_EQ(200, req_->GetResponseCode()); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 EXPECT_CALL(*stream_reader, Seek(_)) | 315 EXPECT_CALL(*stream_reader, Seek(_)) |
| 315 .WillOnce(Return(bytes_available)); | 316 .WillOnce(Return(bytes_available)); |
| 316 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 317 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 317 .WillOnce(Return(bytes_to_read/2)); | 318 .WillOnce(Return(bytes_to_read/2)); |
| 318 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 319 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 319 .WillOnce(Return(bytes_to_read/2)); | 320 .WillOnce(Return(bytes_to_read/2)); |
| 320 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 321 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 321 .WillOnce(Return(0)); | 322 .WillOnce(Return(0)); |
| 322 } | 323 } |
| 323 | 324 |
| 324 SetUpTestJob(stream_reader.Pass()); | 325 SetUpTestJob(std::move(stream_reader)); |
| 325 | 326 |
| 326 SetRange(req_.get(), offset, bytes_available); | 327 SetRange(req_.get(), offset, bytes_available); |
| 327 req_->Start(); | 328 req_->Start(); |
| 328 | 329 |
| 329 base::MessageLoop::current()->Run(); | 330 base::MessageLoop::current()->Run(); |
| 330 | 331 |
| 331 EXPECT_FALSE(url_request_delegate_.request_failed()); | 332 EXPECT_FALSE(url_request_delegate_.request_failed()); |
| 332 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); | 333 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); |
| 333 EXPECT_EQ(1, network_delegate_.completed_requests()); | 334 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 334 EXPECT_EQ(0, network_delegate_.error_count()); | 335 EXPECT_EQ(0, network_delegate_.error_count()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 345 { | 346 { |
| 346 InSequence s; | 347 InSequence s; |
| 347 EXPECT_CALL(*stream_reader, Seek(_)) | 348 EXPECT_CALL(*stream_reader, Seek(_)) |
| 348 .WillOnce(Return(bytes_available_reported)); | 349 .WillOnce(Return(bytes_available_reported)); |
| 349 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 350 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 350 .WillOnce(Return(bytes_available)); | 351 .WillOnce(Return(bytes_available)); |
| 351 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 352 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 352 .WillOnce(Return(0)); | 353 .WillOnce(Return(0)); |
| 353 } | 354 } |
| 354 | 355 |
| 355 SetUpTestJob(stream_reader.Pass()); | 356 SetUpTestJob(std::move(stream_reader)); |
| 356 | 357 |
| 357 SetRange(req_.get(), offset, bytes_available_reported); | 358 SetRange(req_.get(), offset, bytes_available_reported); |
| 358 req_->Start(); | 359 req_->Start(); |
| 359 | 360 |
| 360 base::MessageLoop::current()->Run(); | 361 base::MessageLoop::current()->Run(); |
| 361 | 362 |
| 362 EXPECT_FALSE(url_request_delegate_.request_failed()); | 363 EXPECT_FALSE(url_request_delegate_.request_failed()); |
| 363 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); | 364 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); |
| 364 EXPECT_EQ(1, network_delegate_.completed_requests()); | 365 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 365 EXPECT_EQ(0, network_delegate_.error_count()); | 366 EXPECT_EQ(0, network_delegate_.error_count()); |
| 366 } | 367 } |
| 367 | 368 |
| 368 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWaySeek) { | 369 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWaySeek) { |
| 369 const int offset = 20; | 370 const int offset = 20; |
| 370 const int bytes_available = 128; | 371 const int bytes_available = 128; |
| 371 base::RunLoop loop; | 372 base::RunLoop loop; |
| 372 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( | 373 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
| 373 new StrictMock<MockInputStreamReader>()); | 374 new StrictMock<MockInputStreamReader>()); |
| 374 EXPECT_CALL(*stream_reader, Seek(_)) | 375 EXPECT_CALL(*stream_reader, Seek(_)) |
| 375 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), | 376 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), |
| 376 Return(bytes_available))); | 377 Return(bytes_available))); |
| 377 ON_CALL(*stream_reader, ReadRawData(_, _)) | 378 ON_CALL(*stream_reader, ReadRawData(_, _)) |
| 378 .WillByDefault(Return(0)); | 379 .WillByDefault(Return(0)); |
| 379 | 380 |
| 380 SetUpTestJob(stream_reader.Pass()); | 381 SetUpTestJob(std::move(stream_reader)); |
| 381 | 382 |
| 382 SetRange(req_.get(), offset, bytes_available); | 383 SetRange(req_.get(), offset, bytes_available); |
| 383 req_->Start(); | 384 req_->Start(); |
| 384 | 385 |
| 385 loop.Run(); | 386 loop.Run(); |
| 386 | 387 |
| 387 EXPECT_EQ(0, network_delegate_.completed_requests()); | 388 EXPECT_EQ(0, network_delegate_.completed_requests()); |
| 388 req_->Cancel(); | 389 req_->Cancel(); |
| 389 EXPECT_EQ(1, network_delegate_.completed_requests()); | 390 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 390 } | 391 } |
| 391 | 392 |
| 392 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWayRead) { | 393 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWayRead) { |
| 393 const int offset = 20; | 394 const int offset = 20; |
| 394 const int bytes_available = 128; | 395 const int bytes_available = 128; |
| 395 base::RunLoop loop; | 396 base::RunLoop loop; |
| 396 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( | 397 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
| 397 new StrictMock<MockInputStreamReader>()); | 398 new StrictMock<MockInputStreamReader>()); |
| 398 net::CompletionCallback read_completion_callback; | 399 net::CompletionCallback read_completion_callback; |
| 399 EXPECT_CALL(*stream_reader, Seek(_)) | 400 EXPECT_CALL(*stream_reader, Seek(_)) |
| 400 .WillOnce(Return(bytes_available)); | 401 .WillOnce(Return(bytes_available)); |
| 401 EXPECT_CALL(*stream_reader, ReadRawData(_, _)) | 402 EXPECT_CALL(*stream_reader, ReadRawData(_, _)) |
| 402 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), | 403 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), |
| 403 Return(bytes_available))); | 404 Return(bytes_available))); |
| 404 | 405 |
| 405 SetUpTestJob(stream_reader.Pass()); | 406 SetUpTestJob(std::move(stream_reader)); |
| 406 | 407 |
| 407 SetRange(req_.get(), offset, bytes_available); | 408 SetRange(req_.get(), offset, bytes_available); |
| 408 req_->Start(); | 409 req_->Start(); |
| 409 | 410 |
| 410 loop.Run(); | 411 loop.Run(); |
| 411 | 412 |
| 412 EXPECT_EQ(0, network_delegate_.completed_requests()); | 413 EXPECT_EQ(0, network_delegate_.completed_requests()); |
| 413 req_->Cancel(); | 414 req_->Cancel(); |
| 414 EXPECT_EQ(1, network_delegate_.completed_requests()); | 415 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 415 } | 416 } |
| 416 | 417 |
| 417 } // namespace android_webview | 418 } // namespace android_webview |
| OLD | NEW |