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 |