OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/browser/loader/mojo_async_resource_handler.h" | 5 #include "content/browser/loader/mojo_async_resource_handler.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/callback.h" | 12 #include "base/callback.h" |
13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
15 #include "base/memory/scoped_vector.h" | 15 #include "base/memory/scoped_vector.h" |
16 #include "base/memory/weak_ptr.h" | 16 #include "base/memory/weak_ptr.h" |
17 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
18 #include "content/browser/loader/mock_resource_loader.h" | |
18 #include "content/browser/loader/resource_controller.h" | 19 #include "content/browser/loader/resource_controller.h" |
19 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 20 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
20 #include "content/browser/loader/resource_request_info_impl.h" | 21 #include "content/browser/loader/resource_request_info_impl.h" |
21 #include "content/browser/loader/test_url_loader_client.h" | 22 #include "content/browser/loader/test_url_loader_client.h" |
22 #include "content/common/resource_request_completion_status.h" | 23 #include "content/common/resource_request_completion_status.h" |
23 #include "content/common/url_loader.mojom.h" | 24 #include "content/common/url_loader.mojom.h" |
24 #include "content/public/browser/appcache_service.h" | 25 #include "content/public/browser/appcache_service.h" |
25 #include "content/public/browser/navigation_data.h" | 26 #include "content/public/browser/navigation_data.h" |
26 #include "content/public/browser/resource_context.h" | 27 #include "content/public/browser/resource_context.h" |
27 #include "content/public/browser/resource_dispatcher_host_delegate.h" | 28 #include "content/public/browser/resource_dispatcher_host_delegate.h" |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
166 num_on_response_started_calls_expectation_ = expectation; | 167 num_on_response_started_calls_expectation_ = expectation; |
167 } | 168 } |
168 | 169 |
169 private: | 170 private: |
170 int num_on_response_started_calls_ = 0; | 171 int num_on_response_started_calls_ = 0; |
171 int num_on_response_started_calls_expectation_ = 0; | 172 int num_on_response_started_calls_expectation_ = 0; |
172 | 173 |
173 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherHostDelegate); | 174 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherHostDelegate); |
174 }; | 175 }; |
175 | 176 |
176 class TestResourceController : public ResourceController { | |
177 public: | |
178 TestResourceController() {} | |
179 ~TestResourceController() override {} | |
180 | |
181 void Cancel() override { ADD_FAILURE() << "Cancel should not be called."; } | |
182 | |
183 void CancelAndIgnore() override { | |
184 ADD_FAILURE() << "CancelAndIgnore should not be called."; | |
185 } | |
186 | |
187 void CancelWithError(int error_code) override { | |
188 // While cancelling more than once is legal, none of these tests should do | |
189 // it. | |
190 EXPECT_FALSE(is_cancel_with_error_called_); | |
191 | |
192 is_cancel_with_error_called_ = true; | |
193 error_ = error_code; | |
194 if (quit_closure_) | |
195 quit_closure_.Run(); | |
196 } | |
197 | |
198 void Resume() override { ++num_resume_calls_; } | |
199 | |
200 void RunUntilCancelWithErrorCalled() { | |
201 base::RunLoop run_loop; | |
202 quit_closure_ = run_loop.QuitClosure(); | |
203 run_loop.Run(); | |
204 } | |
205 | |
206 void set_quit_closure(const base::Closure& quit_closure) { | |
207 quit_closure_ = quit_closure; | |
208 } | |
209 | |
210 bool is_cancel_with_error_called() const { | |
211 return is_cancel_with_error_called_; | |
212 } | |
213 int error() const { return error_; } | |
214 int num_resume_calls() const { return num_resume_calls_; } | |
215 | |
216 private: | |
217 bool is_cancel_with_error_called_ = false; | |
218 int error_ = net::OK; | |
219 int num_resume_calls_ = 0; | |
220 base::Closure quit_closure_; | |
221 | |
222 DISALLOW_COPY_AND_ASSIGN(TestResourceController); | |
223 }; | |
224 | |
225 class MojoAsyncResourceHandlerWithCustomDataPipeOperations | 177 class MojoAsyncResourceHandlerWithCustomDataPipeOperations |
226 : public MojoAsyncResourceHandler { | 178 : public MojoAsyncResourceHandler { |
227 public: | 179 public: |
228 MojoAsyncResourceHandlerWithCustomDataPipeOperations( | 180 MojoAsyncResourceHandlerWithCustomDataPipeOperations( |
229 net::URLRequest* request, | 181 net::URLRequest* request, |
230 ResourceDispatcherHostImpl* rdh, | 182 ResourceDispatcherHostImpl* rdh, |
231 mojom::URLLoaderAssociatedRequest mojo_request, | 183 mojom::URLLoaderAssociatedRequest mojo_request, |
232 mojom::URLLoaderClientAssociatedPtr url_loader_client) | 184 mojom::URLLoaderClientAssociatedPtr url_loader_client) |
233 : MojoAsyncResourceHandler(request, | 185 : MojoAsyncResourceHandler(request, |
234 rdh, | 186 rdh, |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
352 url_loader_factory_.FlushForTesting(); | 304 url_loader_factory_.FlushForTesting(); |
353 DCHECK(weak_binding); | 305 DCHECK(weak_binding); |
354 TestURLLoaderFactory* factory_impl = | 306 TestURLLoaderFactory* factory_impl = |
355 static_cast<TestURLLoaderFactory*>(weak_binding->impl()); | 307 static_cast<TestURLLoaderFactory*>(weak_binding->impl()); |
356 | 308 |
357 mojom::URLLoaderClientAssociatedPtr client_ptr; | 309 mojom::URLLoaderClientAssociatedPtr client_ptr; |
358 client_ptr.Bind(factory_impl->PassClientPtrInfo()); | 310 client_ptr.Bind(factory_impl->PassClientPtrInfo()); |
359 handler_.reset(new MojoAsyncResourceHandlerWithCustomDataPipeOperations( | 311 handler_.reset(new MojoAsyncResourceHandlerWithCustomDataPipeOperations( |
360 request_.get(), &rdh_, factory_impl->PassLoaderRequest(), | 312 request_.get(), &rdh_, factory_impl->PassLoaderRequest(), |
361 std::move(client_ptr))); | 313 std::move(client_ptr))); |
362 handler_->SetController(&resource_controller_); | 314 mock_loader_.reset(new MockResourceLoader(handler_.get())); |
363 } | 315 } |
364 | 316 |
365 virtual ~MojoAsyncResourceHandlerTestBase() { | 317 virtual ~MojoAsyncResourceHandlerTestBase() { |
366 net::URLRequestFilter::GetInstance()->ClearHandlers(); | 318 net::URLRequestFilter::GetInstance()->ClearHandlers(); |
367 MojoAsyncResourceHandler::SetAllocationSizeForTesting( | 319 MojoAsyncResourceHandler::SetAllocationSizeForTesting( |
368 MojoAsyncResourceHandler::kDefaultAllocationSize); | 320 MojoAsyncResourceHandler::kDefaultAllocationSize); |
369 base::RunLoop().RunUntilIdle(); | 321 base::RunLoop().RunUntilIdle(); |
370 } | 322 } |
371 | 323 |
372 // Returns false if something bad happens. | 324 // Returns false if something bad happens. |
373 bool CallOnWillStart() { | |
374 bool defer = false; | |
375 if (!handler_->OnWillStart(request_->url(), &defer)) { | |
376 ADD_FAILURE() << "OnWillStart returns false."; | |
377 return false; | |
378 } | |
379 if (defer) { | |
380 ADD_FAILURE() << "OnWillStart sets |defer| true."; | |
381 return false; | |
382 } | |
383 return true; | |
384 } | |
385 | |
386 // Returns false if something bad happens. | |
387 bool CallOnWillStartAndOnResponseStarted() { | 325 bool CallOnWillStartAndOnResponseStarted() { |
388 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 326 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
389 if (!CallOnWillStart()) | 327 MockResourceLoader::Status result = |
328 mock_loader_->OnWillStart(request_->url()); | |
329 EXPECT_EQ(MockResourceLoader::Status::IDLE, result); | |
330 if (result != MockResourceLoader::Status::IDLE) | |
390 return false; | 331 return false; |
391 | 332 |
392 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 333 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
393 bool defer = false; | 334 result = mock_loader_->OnResponseStarted(response.get()); |
394 if (!handler_->OnResponseStarted(response.get(), &defer)) { | 335 EXPECT_EQ(MockResourceLoader::Status::IDLE, result); |
395 ADD_FAILURE() << "OnResponseStarted returns false."; | 336 if (result != MockResourceLoader::Status::IDLE) |
396 return false; | 337 return false; |
397 } | 338 |
398 if (defer) { | |
399 ADD_FAILURE() << "OnResponseStarted sets |defer| true."; | |
400 return false; | |
401 } | |
402 if (url_loader_client_.has_received_response()) { | 339 if (url_loader_client_.has_received_response()) { |
403 ADD_FAILURE() << "URLLoaderClient unexpectedly gets a response."; | 340 ADD_FAILURE() << "URLLoaderClient unexpectedly gets a response."; |
404 return false; | 341 return false; |
405 } | 342 } |
406 url_loader_client_.RunUntilResponseReceived(); | 343 url_loader_client_.RunUntilResponseReceived(); |
407 return true; | 344 return true; |
408 } | 345 } |
409 | 346 |
410 TestBrowserThreadBundle thread_bundle_; | 347 TestBrowserThreadBundle thread_bundle_; |
411 TestResourceDispatcherHostDelegate rdh_delegate_; | 348 TestResourceDispatcherHostDelegate rdh_delegate_; |
412 ResourceDispatcherHostImpl rdh_; | 349 ResourceDispatcherHostImpl rdh_; |
413 mojom::URLLoaderFactoryPtr url_loader_factory_; | 350 mojom::URLLoaderFactoryPtr url_loader_factory_; |
414 mojom::URLLoaderAssociatedPtr url_loader_proxy_; | 351 mojom::URLLoaderAssociatedPtr url_loader_proxy_; |
415 TestURLLoaderClient url_loader_client_; | 352 TestURLLoaderClient url_loader_client_; |
416 TestResourceController resource_controller_; | |
417 std::unique_ptr<TestBrowserContext> browser_context_; | 353 std::unique_ptr<TestBrowserContext> browser_context_; |
418 std::unique_ptr<net::TestDelegate> url_request_delegate_; | 354 std::unique_ptr<net::TestDelegate> url_request_delegate_; |
419 std::unique_ptr<net::URLRequest> request_; | 355 std::unique_ptr<net::URLRequest> request_; |
420 std::unique_ptr<MojoAsyncResourceHandlerWithCustomDataPipeOperations> | 356 std::unique_ptr<MojoAsyncResourceHandlerWithCustomDataPipeOperations> |
421 handler_; | 357 handler_; |
358 std::unique_ptr<MockResourceLoader> mock_loader_; | |
422 | 359 |
423 DISALLOW_COPY_AND_ASSIGN(MojoAsyncResourceHandlerTestBase); | 360 DISALLOW_COPY_AND_ASSIGN(MojoAsyncResourceHandlerTestBase); |
424 }; | 361 }; |
425 | 362 |
426 class MojoAsyncResourceHandlerTest : public MojoAsyncResourceHandlerTestBase, | 363 class MojoAsyncResourceHandlerTest : public MojoAsyncResourceHandlerTestBase, |
427 public ::testing::Test {}; | 364 public ::testing::Test {}; |
428 | 365 |
429 // This test class is parameterized with MojoAsyncResourceHandler's allocation | 366 // This test class is parameterized with MojoAsyncResourceHandler's allocation |
430 // size. | 367 // size. |
431 class MojoAsyncResourceHandlerWithAllocationSizeTest | 368 class MojoAsyncResourceHandlerWithAllocationSizeTest |
432 : public MojoAsyncResourceHandlerTestBase, | 369 : public MojoAsyncResourceHandlerTestBase, |
433 public ::testing::TestWithParam<size_t> { | 370 public ::testing::TestWithParam<size_t> { |
434 protected: | 371 protected: |
435 MojoAsyncResourceHandlerWithAllocationSizeTest() { | 372 MojoAsyncResourceHandlerWithAllocationSizeTest() { |
436 MojoAsyncResourceHandler::SetAllocationSizeForTesting(GetParam()); | 373 MojoAsyncResourceHandler::SetAllocationSizeForTesting(GetParam()); |
437 } | 374 } |
438 }; | 375 }; |
439 | 376 |
440 TEST_F(MojoAsyncResourceHandlerTest, InFlightRequests) { | 377 TEST_F(MojoAsyncResourceHandlerTest, InFlightRequests) { |
441 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 378 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
442 handler_ = nullptr; | 379 handler_ = nullptr; |
443 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 380 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
444 } | 381 } |
445 | 382 |
446 TEST_F(MojoAsyncResourceHandlerTest, OnWillStart) { | 383 TEST_F(MojoAsyncResourceHandlerTest, OnWillStart) { |
447 bool defer = false; | 384 EXPECT_EQ(MockResourceLoader::Status::IDLE, |
448 EXPECT_TRUE(handler_->OnWillStart(request_->url(), &defer)); | 385 mock_loader_->OnWillStart(request_->url())); |
449 EXPECT_FALSE(defer); | |
450 } | 386 } |
451 | 387 |
452 TEST_F(MojoAsyncResourceHandlerTest, OnResponseStarted) { | 388 TEST_F(MojoAsyncResourceHandlerTest, OnResponseStarted) { |
453 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 389 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
454 ASSERT_TRUE(CallOnWillStart()); | 390 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
391 mock_loader_->OnWillStart(request_->url())); | |
455 | 392 |
456 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 393 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
457 response->head.content_length = 99; | 394 response->head.content_length = 99; |
458 response->head.request_start = | 395 response->head.request_start = |
459 base::TimeTicks::UnixEpoch() + base::TimeDelta::FromDays(14); | 396 base::TimeTicks::UnixEpoch() + base::TimeDelta::FromDays(14); |
460 response->head.response_start = | 397 response->head.response_start = |
461 base::TimeTicks::UnixEpoch() + base::TimeDelta::FromDays(28); | 398 base::TimeTicks::UnixEpoch() + base::TimeDelta::FromDays(28); |
462 | 399 |
463 bool defer = false; | |
464 | |
465 EXPECT_EQ(0, rdh_delegate_.num_on_response_started_calls()); | 400 EXPECT_EQ(0, rdh_delegate_.num_on_response_started_calls()); |
466 base::TimeTicks now1 = base::TimeTicks::Now(); | 401 base::TimeTicks now1 = base::TimeTicks::Now(); |
467 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 402 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
403 mock_loader_->OnResponseStarted(response.get())); | |
468 base::TimeTicks now2 = base::TimeTicks::Now(); | 404 base::TimeTicks now2 = base::TimeTicks::Now(); |
469 | 405 |
470 EXPECT_FALSE(defer); | |
471 EXPECT_EQ(request_->creation_time(), response->head.request_start); | 406 EXPECT_EQ(request_->creation_time(), response->head.request_start); |
472 EXPECT_LE(now1, response->head.response_start); | 407 EXPECT_LE(now1, response->head.response_start); |
473 EXPECT_LE(response->head.response_start, now2); | 408 EXPECT_LE(response->head.response_start, now2); |
474 EXPECT_EQ(1, rdh_delegate_.num_on_response_started_calls()); | 409 EXPECT_EQ(1, rdh_delegate_.num_on_response_started_calls()); |
475 | 410 |
476 url_loader_client_.RunUntilResponseReceived(); | 411 url_loader_client_.RunUntilResponseReceived(); |
477 EXPECT_EQ(response->head.request_start, | 412 EXPECT_EQ(response->head.request_start, |
478 url_loader_client_.response_head().request_start); | 413 url_loader_client_.response_head().request_start); |
479 EXPECT_EQ(response->head.response_start, | 414 EXPECT_EQ(response->head.response_start, |
480 url_loader_client_.response_head().response_start); | 415 url_loader_client_.response_head().response_start); |
481 EXPECT_EQ(99, url_loader_client_.response_head().content_length); | 416 EXPECT_EQ(99, url_loader_client_.response_head().content_length); |
482 } | 417 } |
483 | 418 |
484 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndInFlightRequests) { | 419 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndInFlightRequests) { |
485 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 420 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
486 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 421 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
487 scoped_refptr<net::IOBuffer> io_buffer; | 422 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
488 int io_buffer_size = 0; | |
489 EXPECT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
490 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); | 423 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); |
491 handler_ = nullptr; | 424 handler_ = nullptr; |
492 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 425 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
493 } | 426 } |
494 | 427 |
495 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadWithInsufficientResource) { | 428 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadWithInsufficientResource) { |
496 rdh_.set_max_num_in_flight_requests_per_process(0); | 429 rdh_.set_max_num_in_flight_requests_per_process(0); |
497 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 430 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
498 | 431 |
499 scoped_refptr<net::IOBuffer> io_buffer; | 432 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead(-1)); |
500 int io_buffer_size = 0; | |
501 EXPECT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
502 EXPECT_FALSE(io_buffer); | |
503 EXPECT_EQ(0, io_buffer_size); | |
504 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); | 433 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); |
505 EXPECT_TRUE(resource_controller_.is_cancel_with_error_called()); | 434 // TODO(mmenke): Should make sure the class is cancelling with |
506 EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES, resource_controller_.error()); | 435 // ERR_INSUFFICIENT_RESOURCES here (Which it isn't currently doing). |
507 handler_ = nullptr; | 436 handler_ = nullptr; |
508 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 437 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
509 } | 438 } |
510 | 439 |
511 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndOnReadCompleted) { | 440 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndOnReadCompleted) { |
512 bool defer = false; | |
513 scoped_refptr<net::IOBuffer> io_buffer; | |
514 int io_buffer_size = 0; | |
515 | |
516 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 441 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
517 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 442 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
518 ASSERT_TRUE(io_buffer); | |
519 // The buffer size that the mime sniffer requires implicitly. | 443 // The buffer size that the mime sniffer requires implicitly. |
520 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); | 444 ASSERT_GE(mock_loader_->io_buffer_size(), |
445 kSizeMimeSnifferRequiresForFirstOnWillRead); | |
521 | 446 |
522 url_loader_client_.RunUntilResponseBodyArrived(); | 447 url_loader_client_.RunUntilResponseBodyArrived(); |
523 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 448 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
524 | 449 |
525 io_buffer->data()[0] = 'A'; | 450 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
526 io_buffer->data()[1] = 'B'; | 451 mock_loader_->OnReadCompleted("AB")); |
527 ASSERT_TRUE(handler_->OnReadCompleted(2, &defer)); | |
528 EXPECT_FALSE(defer); | |
529 | 452 |
530 std::string contents; | 453 std::string contents; |
531 while (contents.size() < 2) { | 454 while (contents.size() < 2) { |
532 char buffer[16]; | 455 char buffer[16]; |
533 uint32_t read_size = sizeof(buffer); | 456 uint32_t read_size = sizeof(buffer); |
534 MojoResult result = | 457 MojoResult result = |
535 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 458 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
536 &read_size, MOJO_READ_DATA_FLAG_NONE); | 459 &read_size, MOJO_READ_DATA_FLAG_NONE); |
537 if (result == MOJO_RESULT_SHOULD_WAIT) { | 460 if (result == MOJO_RESULT_SHOULD_WAIT) { |
538 base::RunLoop().RunUntilIdle(); | 461 base::RunLoop().RunUntilIdle(); |
539 continue; | 462 continue; |
540 } | 463 } |
541 contents.append(buffer, read_size); | 464 contents.append(buffer, read_size); |
542 } | 465 } |
543 EXPECT_EQ("AB", contents); | 466 EXPECT_EQ("AB", contents); |
544 } | 467 } |
545 | 468 |
546 TEST_F(MojoAsyncResourceHandlerTest, | 469 TEST_F(MojoAsyncResourceHandlerTest, |
547 OnWillReadAndOnReadCompletedWithInsufficientInitialCapacity) { | 470 OnWillReadAndOnReadCompletedWithInsufficientInitialCapacity) { |
548 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); | 471 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); |
549 | 472 |
550 bool defer = false; | |
551 scoped_refptr<net::IOBuffer> io_buffer; | |
552 int io_buffer_size = 0; | |
553 | |
554 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 473 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
555 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 474 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
556 ASSERT_TRUE(io_buffer); | |
557 // The buffer size that the mime sniffer requires implicitly. | 475 // The buffer size that the mime sniffer requires implicitly. |
558 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); | 476 ASSERT_GE(mock_loader_->io_buffer_size(), |
477 kSizeMimeSnifferRequiresForFirstOnWillRead); | |
559 | 478 |
560 url_loader_client_.RunUntilResponseBodyArrived(); | 479 url_loader_client_.RunUntilResponseBodyArrived(); |
561 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 480 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
562 | 481 |
563 const std::string data("abcdefgh"); | 482 const std::string data("abcdefgh"); |
564 strcpy(io_buffer->data(), data.c_str()); | 483 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
565 ASSERT_TRUE(handler_->OnReadCompleted(data.size(), &defer)); | 484 mock_loader_->OnReadCompleted(data)); |
566 EXPECT_TRUE(defer); | |
567 | 485 |
568 std::string contents; | 486 std::string contents; |
569 while (contents.size() < data.size()) { | 487 while (contents.size() < data.size()) { |
570 // This is needed for Resume to be called. | 488 // This is needed for Resume to be called. |
571 base::RunLoop().RunUntilIdle(); | 489 base::RunLoop().RunUntilIdle(); |
572 char buffer[16]; | 490 char buffer[16]; |
573 uint32_t read_size = sizeof(buffer); | 491 uint32_t read_size = sizeof(buffer); |
574 MojoResult result = | 492 MojoResult result = |
575 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 493 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
576 &read_size, MOJO_READ_DATA_FLAG_NONE); | 494 &read_size, MOJO_READ_DATA_FLAG_NONE); |
577 if (result == MOJO_RESULT_SHOULD_WAIT) | 495 if (result == MOJO_RESULT_SHOULD_WAIT) |
578 continue; | 496 continue; |
579 ASSERT_EQ(MOJO_RESULT_OK, result); | 497 ASSERT_EQ(MOJO_RESULT_OK, result); |
580 contents.append(buffer, read_size); | 498 contents.append(buffer, read_size); |
581 } | 499 } |
582 EXPECT_EQ(data, contents); | 500 EXPECT_EQ(data, contents); |
583 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | 501 EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
502 mock_loader_->status()); | |
584 } | 503 } |
585 | 504 |
586 TEST_F(MojoAsyncResourceHandlerTest, | 505 TEST_F(MojoAsyncResourceHandlerTest, |
587 IOBufferFromOnWillReadShouldRemainValidEvenIfHandlerIsGone) { | 506 IOBufferFromOnWillReadShouldRemainValidEvenIfHandlerIsGone) { |
588 scoped_refptr<net::IOBuffer> io_buffer; | |
589 int io_buffer_size = 0; | |
590 | |
591 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 507 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
592 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 508 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
593 ASSERT_TRUE(io_buffer); | |
594 // The io_buffer size that the mime sniffer requires implicitly. | 509 // The io_buffer size that the mime sniffer requires implicitly. |
595 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); | 510 ASSERT_GE(mock_loader_->io_buffer_size(), |
511 kSizeMimeSnifferRequiresForFirstOnWillRead); | |
596 | 512 |
597 handler_ = nullptr; | 513 handler_ = nullptr; |
598 url_loader_client_.Unbind(); | 514 url_loader_client_.Unbind(); |
599 base::RunLoop().RunUntilIdle(); | 515 base::RunLoop().RunUntilIdle(); |
600 | 516 |
601 // Hopefully ASAN checks this operation's validity. | 517 // Hopefully ASAN checks this operation's validity. |
602 io_buffer->data()[0] = 'A'; | 518 mock_loader_->io_buffer()->data()[0] = 'A'; |
603 } | 519 } |
604 | 520 |
605 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted) { | 521 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted) { |
606 bool defer = false; | |
607 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 522 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
608 | 523 |
609 ResourceRequestInfoImpl::ForRequest(request_.get()) | 524 ResourceRequestInfoImpl::ForRequest(request_.get()) |
610 ->set_was_ignored_by_handler(false); | 525 ->set_was_ignored_by_handler(false); |
611 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 526 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
612 | 527 |
613 base::TimeTicks now1 = base::TimeTicks::Now(); | 528 base::TimeTicks now1 = base::TimeTicks::Now(); |
614 handler_->OnResponseCompleted(status, &defer); | 529 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
530 mock_loader_->OnResponseCompleted(status)); | |
615 base::TimeTicks now2 = base::TimeTicks::Now(); | 531 base::TimeTicks now2 = base::TimeTicks::Now(); |
616 EXPECT_FALSE(defer); | |
617 | 532 |
618 url_loader_client_.RunUntilComplete(); | 533 url_loader_client_.RunUntilComplete(); |
619 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 534 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
620 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 535 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
621 EXPECT_FALSE(url_loader_client_.completion_status().was_ignored_by_handler); | 536 EXPECT_FALSE(url_loader_client_.completion_status().was_ignored_by_handler); |
622 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); | 537 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); |
623 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); | 538 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); |
624 EXPECT_EQ(request_->GetTotalReceivedBytes(), | 539 EXPECT_EQ(request_->GetTotalReceivedBytes(), |
625 url_loader_client_.completion_status().encoded_data_length); | 540 url_loader_client_.completion_status().encoded_data_length); |
626 } | 541 } |
627 | 542 |
628 // This test case sets different status values from OnResponseCompleted. | 543 // This test case sets different status values from OnResponseCompleted. |
629 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted2) { | 544 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted2) { |
630 rdh_.SetDelegate(nullptr); | 545 rdh_.SetDelegate(nullptr); |
631 bool defer = false; | |
632 // Don't use CallOnWillStartAndOnResponseStarted as this test case manually | 546 // Don't use CallOnWillStartAndOnResponseStarted as this test case manually |
633 // sets the null delegate. | 547 // sets the null delegate. |
634 ASSERT_TRUE(CallOnWillStart()); | 548 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
549 mock_loader_->OnWillStart(request_->url())); | |
635 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 550 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
636 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 551 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
637 ASSERT_FALSE(defer); | 552 mock_loader_->OnResponseStarted(response.get())); |
638 ASSERT_FALSE(url_loader_client_.has_received_response()); | 553 ASSERT_FALSE(url_loader_client_.has_received_response()); |
639 url_loader_client_.RunUntilResponseReceived(); | 554 url_loader_client_.RunUntilResponseReceived(); |
640 | 555 |
641 ResourceRequestInfoImpl::ForRequest(request_.get()) | 556 ResourceRequestInfoImpl::ForRequest(request_.get()) |
642 ->set_was_ignored_by_handler(true); | 557 ->set_was_ignored_by_handler(true); |
643 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, | 558 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, |
644 net::ERR_ABORTED); | 559 net::ERR_ABORTED); |
645 | 560 |
646 base::TimeTicks now1 = base::TimeTicks::Now(); | 561 base::TimeTicks now1 = base::TimeTicks::Now(); |
647 handler_->OnResponseCompleted(status, &defer); | 562 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
563 mock_loader_->OnResponseCompleted(status)); | |
648 base::TimeTicks now2 = base::TimeTicks::Now(); | 564 base::TimeTicks now2 = base::TimeTicks::Now(); |
649 EXPECT_FALSE(defer); | |
650 | 565 |
651 url_loader_client_.RunUntilComplete(); | 566 url_loader_client_.RunUntilComplete(); |
652 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 567 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
653 EXPECT_EQ(net::ERR_ABORTED, | 568 EXPECT_EQ(net::ERR_ABORTED, |
654 url_loader_client_.completion_status().error_code); | 569 url_loader_client_.completion_status().error_code); |
655 EXPECT_TRUE(url_loader_client_.completion_status().was_ignored_by_handler); | 570 EXPECT_TRUE(url_loader_client_.completion_status().was_ignored_by_handler); |
656 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); | 571 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); |
657 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); | 572 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); |
658 EXPECT_EQ(request_->GetTotalReceivedBytes(), | 573 EXPECT_EQ(request_->GetTotalReceivedBytes(), |
659 url_loader_client_.completion_status().encoded_data_length); | 574 url_loader_client_.completion_status().encoded_data_length); |
660 } | 575 } |
661 | 576 |
662 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithCanceledTimedOut) { | 577 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithCanceledTimedOut) { |
663 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, | 578 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, |
664 net::ERR_TIMED_OUT); | 579 net::ERR_TIMED_OUT); |
665 bool defer = false; | |
666 | 580 |
667 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 581 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
668 handler_->OnResponseCompleted(status, &defer); | 582 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
669 EXPECT_FALSE(defer); | 583 mock_loader_->OnResponseCompleted(status)); |
670 | 584 |
671 url_loader_client_.RunUntilComplete(); | 585 url_loader_client_.RunUntilComplete(); |
672 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 586 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
673 EXPECT_EQ(net::ERR_TIMED_OUT, | 587 EXPECT_EQ(net::ERR_TIMED_OUT, |
674 url_loader_client_.completion_status().error_code); | 588 url_loader_client_.completion_status().error_code); |
675 } | 589 } |
676 | 590 |
677 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithFailedTimedOut) { | 591 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithFailedTimedOut) { |
678 net::URLRequestStatus status(net::URLRequestStatus::FAILED, | 592 net::URLRequestStatus status(net::URLRequestStatus::FAILED, |
679 net::ERR_TIMED_OUT); | 593 net::ERR_TIMED_OUT); |
680 bool defer = false; | |
681 | 594 |
682 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 595 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
683 handler_->OnResponseCompleted(status, &defer); | 596 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
684 EXPECT_FALSE(defer); | 597 mock_loader_->OnResponseCompleted(status)); |
685 | 598 |
686 url_loader_client_.RunUntilComplete(); | 599 url_loader_client_.RunUntilComplete(); |
687 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 600 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
688 EXPECT_EQ(net::ERR_TIMED_OUT, | 601 EXPECT_EQ(net::ERR_TIMED_OUT, |
689 url_loader_client_.completion_status().error_code); | 602 url_loader_client_.completion_status().error_code); |
690 } | 603 } |
691 | 604 |
692 TEST_F(MojoAsyncResourceHandlerTest, ResponseCompletionShouldCloseDataPipe) { | 605 TEST_F(MojoAsyncResourceHandlerTest, ResponseCompletionShouldCloseDataPipe) { |
693 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 606 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
694 | 607 |
695 scoped_refptr<net::IOBuffer> io_buffer; | 608 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
696 int io_buffer_size = 0; | |
697 bool defer = false; | |
698 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
699 url_loader_client_.RunUntilResponseBodyArrived(); | 609 url_loader_client_.RunUntilResponseBodyArrived(); |
700 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 610 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
701 ASSERT_TRUE(handler_->OnReadCompleted(0, &defer)); | 611 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0)); |
702 EXPECT_FALSE(defer); | |
703 | 612 |
704 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 613 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
705 handler_->OnResponseCompleted(status, &defer); | 614 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
706 EXPECT_FALSE(defer); | 615 mock_loader_->OnResponseCompleted(status)); |
707 | 616 |
708 url_loader_client_.RunUntilComplete(); | 617 url_loader_client_.RunUntilComplete(); |
709 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 618 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
710 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 619 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
711 | 620 |
712 // This is needed because |*io_buffer| may keep the data producer alive. | 621 // This is needed because |*io_buffer| may keep the data producer alive. |
713 io_buffer = nullptr; | 622 mock_loader_->ReleaseIOBuffer(); |
714 | 623 |
715 while (true) { | 624 while (true) { |
716 char buffer[16]; | 625 char buffer[16]; |
717 uint32_t read_size = sizeof(buffer); | 626 uint32_t read_size = sizeof(buffer); |
718 MojoResult result = | 627 MojoResult result = |
719 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 628 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
720 &read_size, MOJO_READ_DATA_FLAG_NONE); | 629 &read_size, MOJO_READ_DATA_FLAG_NONE); |
721 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 630 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
722 break; | 631 break; |
723 ASSERT_EQ(result, MOJO_RESULT_SHOULD_WAIT); | 632 ASSERT_EQ(result, MOJO_RESULT_SHOULD_WAIT); |
724 } | 633 } |
725 } | 634 } |
726 | 635 |
727 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission) { | 636 TEST_F(MojoAsyncResourceHandlerTest, OutOfBandCancelDuringBodyTransmission) { |
728 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 637 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
729 | 638 |
730 scoped_refptr<net::IOBuffer> io_buffer; | 639 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
731 int io_buffer_size = 0; | |
732 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
733 url_loader_client_.RunUntilResponseBodyArrived(); | 640 url_loader_client_.RunUntilResponseBodyArrived(); |
734 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 641 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
735 ASSERT_GT(io_buffer_size, 0); | 642 const std::string kData(mock_loader_->io_buffer_size(), 'a'); |
Randy Smith (Not in Mondays)
2016/12/21 16:47:37
If kData is used below, shouldn't it be used here?
mmenke
2017/01/05 18:50:25
This line is the one that declares and initializes
Randy Smith (Not in Mondays)
2017/01/10 23:07:47
Sorry, that looks like a braino on my part. Regar
| |
736 memset(io_buffer->data(), 'a', io_buffer_size); | 643 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
737 bool defer = false; | 644 mock_loader_->OnReadCompleted(kData)); |
738 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | |
739 // We don't care |defer|'s value here. | |
740 | 645 |
741 defer = false; | |
742 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); | 646 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); |
743 handler_->OnResponseCompleted(status, &defer); | 647 ASSERT_EQ( |
744 EXPECT_FALSE(defer); | 648 MockResourceLoader::Status::IDLE, |
649 mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel(status)); | |
745 | 650 |
746 url_loader_client_.RunUntilComplete(); | 651 url_loader_client_.RunUntilComplete(); |
747 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 652 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
748 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); | 653 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); |
749 | 654 |
750 // This is needed because |*io_buffer| may keep the data producer alive. | 655 // This is needed because |*io_buffer| may keep the data producer alive. |
751 io_buffer = nullptr; | 656 mock_loader_->ReleaseIOBuffer(); |
752 | 657 |
753 std::string actual; | 658 std::string actual; |
754 while (true) { | 659 while (true) { |
755 char buf[16]; | 660 char buf[16]; |
756 uint32_t read_size = sizeof(buf); | 661 uint32_t read_size = sizeof(buf); |
757 MojoResult result = | 662 MojoResult result = |
758 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 663 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
759 MOJO_READ_DATA_FLAG_NONE); | 664 MOJO_READ_DATA_FLAG_NONE); |
760 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 665 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
761 break; | 666 break; |
762 if (result == MOJO_RESULT_SHOULD_WAIT) { | 667 if (result == MOJO_RESULT_SHOULD_WAIT) { |
763 base::RunLoop().RunUntilIdle(); | 668 base::RunLoop().RunUntilIdle(); |
764 continue; | 669 continue; |
765 } | 670 } |
766 EXPECT_EQ(MOJO_RESULT_OK, result); | 671 EXPECT_EQ(MOJO_RESULT_OK, result); |
767 actual.append(buf, read_size); | 672 actual.append(buf, read_size); |
768 } | 673 } |
769 EXPECT_EQ(std::string(io_buffer_size, 'a'), actual); | 674 EXPECT_EQ(kData, actual); |
770 } | 675 } |
771 | 676 |
772 // In this case, an error is notified after OnWillRead, before OnReadCompleted. | 677 // In this case, an error is notified after OnWillRead, before OnReadCompleted. |
773 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission2) { | 678 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission2) { |
774 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 679 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
775 | 680 |
776 scoped_refptr<net::IOBuffer> io_buffer; | 681 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
777 int io_buffer_size = 0; | |
778 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
779 url_loader_client_.RunUntilResponseBodyArrived(); | 682 url_loader_client_.RunUntilResponseBodyArrived(); |
780 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 683 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
781 bool defer = false; | |
782 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); | 684 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); |
783 handler_->OnResponseCompleted(status, &defer); | 685 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
784 EXPECT_FALSE(defer); | 686 mock_loader_->OnResponseCompleted(status)); |
785 | 687 |
786 url_loader_client_.RunUntilComplete(); | 688 url_loader_client_.RunUntilComplete(); |
787 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 689 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
788 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); | 690 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); |
789 | 691 |
790 // This is needed because |*io_buffer| may keep the data producer alive. | 692 // This is needed because |*io_buffer| may keep the data producer alive. |
791 io_buffer = nullptr; | 693 mock_loader_->ReleaseIOBuffer(); |
792 | 694 |
793 while (true) { | 695 while (true) { |
794 char buf[16]; | 696 char buf[16]; |
795 uint32_t read_size = sizeof(buf); | 697 uint32_t read_size = sizeof(buf); |
796 MojoResult result = | 698 MojoResult result = |
797 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 699 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
798 MOJO_READ_DATA_FLAG_NONE); | 700 MOJO_READ_DATA_FLAG_NONE); |
799 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 701 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
800 break; | 702 break; |
801 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, result); | 703 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, result); |
802 base::RunLoop().RunUntilIdle(); | 704 base::RunLoop().RunUntilIdle(); |
803 } | 705 } |
804 } | 706 } |
805 | 707 |
806 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteFailsOnWillRead) { | 708 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteFailsOnWillRead) { |
807 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); | 709 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); |
808 scoped_refptr<net::IOBuffer> io_buffer; | 710 scoped_refptr<net::IOBuffer> io_buffer; |
809 int io_buffer_size = 0; | 711 int io_buffer_size = 0; |
810 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 712 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
811 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 713 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); |
812 EXPECT_FALSE(resource_controller_.is_cancel_with_error_called()); | |
813 } | 714 } |
814 | 715 |
815 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteReturnsShouldWaitOnWillRead) { | 716 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteReturnsShouldWaitOnWillRead) { |
816 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 717 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
817 scoped_refptr<net::IOBuffer> io_buffer; | |
818 int io_buffer_size = 0; | |
819 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 718 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
820 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 719 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
821 EXPECT_TRUE(io_buffer); | |
822 EXPECT_GT(io_buffer_size, 0); | |
823 } | 720 } |
824 | 721 |
825 TEST_F(MojoAsyncResourceHandlerTest, | 722 TEST_F(MojoAsyncResourceHandlerTest, |
826 BeginWriteReturnsShouldWaitOnWillReadAndThenReturnsOK) { | 723 BeginWriteReturnsShouldWaitOnWillReadAndThenReturnsOK) { |
827 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 724 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
828 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 725 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
829 size_t written = 0; | 726 size_t written = 0; |
830 while (true) { | 727 while (true) { |
831 scoped_refptr<net::IOBuffer> io_buffer; | 728 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
832 int io_buffer_size = 0; | 729 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( |
833 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 730 std::string(mock_loader_->io_buffer_size(), 'X')); |
834 EXPECT_TRUE(io_buffer); | 731 written += mock_loader_->io_buffer_size(); |
835 EXPECT_GT(io_buffer_size, 0); | 732 if (result == MockResourceLoader::Status::CALLBACK_PENDING) |
836 memset(io_buffer->data(), 'X', io_buffer_size); | |
837 written += io_buffer_size; | |
838 bool defer = false; | |
839 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | |
840 if (defer) | |
841 break; | 733 break; |
734 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
842 } | 735 } |
843 | 736 |
844 url_loader_client_.RunUntilResponseBodyArrived(); | 737 url_loader_client_.RunUntilResponseBodyArrived(); |
845 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 738 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
846 handler_->ResetBeginWriteExpectation(); | 739 handler_->ResetBeginWriteExpectation(); |
847 handler_->OnWritableForTesting(); | 740 handler_->OnWritableForTesting(); |
848 | 741 |
849 std::string actual; | 742 std::string actual; |
850 while (actual.size() < written) { | 743 while (actual.size() < written) { |
851 char buf[16]; | 744 char buf[16]; |
852 uint32_t read_size = sizeof(buf); | 745 uint32_t read_size = sizeof(buf); |
853 MojoResult result = | 746 MojoResult result = |
854 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 747 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
855 MOJO_READ_DATA_FLAG_NONE); | 748 MOJO_READ_DATA_FLAG_NONE); |
856 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); | 749 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); |
857 if (result == MOJO_RESULT_OK) | 750 if (result == MOJO_RESULT_OK) |
858 actual.append(buf, read_size); | 751 actual.append(buf, read_size); |
859 base::RunLoop().RunUntilIdle(); | 752 base::RunLoop().RunUntilIdle(); |
860 } | 753 } |
861 | 754 |
862 EXPECT_EQ(std::string(written, 'X'), actual); | 755 EXPECT_EQ(std::string(written, 'X'), actual); |
863 EXPECT_EQ(1, resource_controller_.num_resume_calls()); | 756 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
864 } | 757 } |
865 | 758 |
866 TEST_F(MojoAsyncResourceHandlerTest, | 759 TEST_F(MojoAsyncResourceHandlerTest, |
867 EndWriteFailsOnWillReadWithInsufficientInitialCapacity) { | 760 EndWriteFailsOnWillReadWithInsufficientInitialCapacity) { |
868 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); | 761 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); |
869 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 762 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
870 handler_->set_end_write_expectation(MOJO_RESULT_UNKNOWN); | 763 handler_->set_end_write_expectation(MOJO_RESULT_UNKNOWN); |
871 scoped_refptr<net::IOBuffer> io_buffer; | 764 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead(-1)); |
872 int io_buffer_size = 0; | |
873 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
874 } | 765 } |
875 | 766 |
876 TEST_F(MojoAsyncResourceHandlerTest, EndWriteFailsOnReadCompleted) { | 767 TEST_F(MojoAsyncResourceHandlerTest, EndWriteFailsOnReadCompleted) { |
877 scoped_refptr<net::IOBuffer> io_buffer; | |
878 int io_buffer_size = 0; | |
879 bool defer = false; | |
880 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 768 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
881 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 769 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
882 | 770 |
883 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 771 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
884 ASSERT_FALSE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 772 ASSERT_EQ(MockResourceLoader::Status::CANCELED, |
773 mock_loader_->OnReadCompleted( | |
774 std::string(mock_loader_->io_buffer_size(), 'w'))); | |
885 } | 775 } |
886 | 776 |
887 TEST_F(MojoAsyncResourceHandlerTest, | 777 TEST_F(MojoAsyncResourceHandlerTest, |
888 EndWriteFailsOnReadCompletedWithInsufficientInitialCapacity) { | 778 EndWriteFailsOnReadCompletedWithInsufficientInitialCapacity) { |
889 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); | 779 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); |
890 scoped_refptr<net::IOBuffer> io_buffer; | |
891 int io_buffer_size = 0; | |
892 bool defer = false; | |
893 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 780 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
894 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 781 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
895 | 782 |
896 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 783 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
897 ASSERT_FALSE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 784 ASSERT_EQ(MockResourceLoader::Status::CANCELED, |
785 mock_loader_->OnReadCompleted( | |
786 std::string(mock_loader_->io_buffer_size(), 'w'))); | |
898 } | 787 } |
899 | 788 |
900 TEST_F(MojoAsyncResourceHandlerTest, | 789 TEST_F(MojoAsyncResourceHandlerTest, |
901 EndWriteFailsOnResumeWithInsufficientInitialCapacity) { | 790 EndWriteFailsOnResumeWithInsufficientInitialCapacity) { |
902 MojoAsyncResourceHandler::SetAllocationSizeForTesting(8); | 791 MojoAsyncResourceHandler::SetAllocationSizeForTesting(8); |
903 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 792 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
904 scoped_refptr<net::IOBuffer> io_buffer; | 793 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
905 int io_buffer_size = 0; | |
906 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
907 url_loader_client_.RunUntilResponseBodyArrived(); | 794 url_loader_client_.RunUntilResponseBodyArrived(); |
908 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 795 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
909 | 796 |
910 while (true) { | 797 while (true) { |
911 bool defer = false; | 798 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( |
912 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 799 std::string(mock_loader_->io_buffer_size(), 'A')); |
913 ASSERT_GE(io_buffer_size, 0); | 800 if (result == MockResourceLoader::Status::CALLBACK_PENDING) |
914 if (defer) | |
915 break; | 801 break; |
916 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 802 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); |
803 | |
804 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); | |
917 } | 805 } |
918 | 806 |
919 while (true) { | 807 while (true) { |
920 char buf[16]; | 808 char buf[16]; |
921 uint32_t read_size = sizeof(buf); | 809 uint32_t read_size = sizeof(buf); |
922 MojoResult result = | 810 MojoResult result = |
923 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 811 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
924 MOJO_READ_DATA_FLAG_NONE); | 812 MOJO_READ_DATA_FLAG_NONE); |
925 if (result == MOJO_RESULT_SHOULD_WAIT) | 813 if (result == MOJO_RESULT_SHOULD_WAIT) |
926 break; | 814 break; |
927 ASSERT_EQ(MOJO_RESULT_OK, result); | 815 ASSERT_EQ(MOJO_RESULT_OK, result); |
928 } | 816 } |
929 | 817 |
930 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 818 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
931 resource_controller_.RunUntilCancelWithErrorCalled(); | 819 mock_loader_->WaitUntilIdleOrCanceled(); |
932 EXPECT_FALSE(url_loader_client_.has_received_completion()); | 820 EXPECT_FALSE(url_loader_client_.has_received_completion()); |
933 EXPECT_TRUE(resource_controller_.is_cancel_with_error_called()); | 821 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
934 EXPECT_EQ(net::ERR_FAILED, resource_controller_.error()); | 822 EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code()); |
935 } | 823 } |
936 | 824 |
937 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 825 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
938 OnWillReadWithLongContents) { | 826 OnWillReadWithLongContents) { |
939 bool defer = false; | |
940 scoped_refptr<net::IOBuffer> io_buffer; | |
941 int io_buffer_size = 0; | |
942 | |
943 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 827 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
944 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 828 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
945 ASSERT_TRUE(io_buffer); | |
946 // The io_buffer size that the mime sniffer requires implicitly. | |
947 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); | |
948 std::string expected; | 829 std::string expected; |
949 for (int i = 0; i < 3 * io_buffer_size + 2; ++i) | 830 for (int i = 0; i < 3 * mock_loader_->io_buffer_size() + 2; ++i) |
950 expected += ('A' + i % 26); | 831 expected += ('A' + i % 26); |
951 | 832 |
952 ASSERT_TRUE(handler_->OnReadCompleted(0, &defer)); | 833 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0)); |
953 ASSERT_FALSE(defer); | |
954 | 834 |
955 url_loader_client_.RunUntilResponseBodyArrived(); | 835 url_loader_client_.RunUntilResponseBodyArrived(); |
956 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 836 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
957 | 837 |
958 size_t written = 0; | 838 size_t written = 0; |
959 std::string actual; | 839 std::string actual; |
960 while (actual.size() < expected.size()) { | 840 while (actual.size() < expected.size()) { |
961 while (written < expected.size() && !defer) { | 841 while (written < expected.size() && |
962 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 842 mock_loader_->status() == MockResourceLoader::Status::IDLE) { |
963 const size_t to_be_written = std::min(static_cast<size_t>(io_buffer_size), | 843 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
964 expected.size() - written); | 844 const size_t to_be_written = |
965 memcpy(io_buffer->data(), &expected[written], to_be_written); | 845 std::min(static_cast<size_t>(mock_loader_->io_buffer_size()), |
966 ASSERT_TRUE(handler_->OnReadCompleted(to_be_written, &defer)); | 846 expected.size() - written); |
847 | |
848 // Request should be resumed or paused. | |
849 ASSERT_NE(MockResourceLoader::Status::CANCELED, | |
850 mock_loader_->OnReadCompleted( | |
851 expected.substr(written, to_be_written))); | |
852 | |
967 written += to_be_written; | 853 written += to_be_written; |
968 } | 854 } |
969 | 855 |
970 char buf[16]; | 856 char buf[16]; |
971 uint32_t read_size = sizeof(buf); | 857 uint32_t read_size = sizeof(buf); |
972 MojoResult result = | 858 MojoResult result = |
973 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 859 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
974 MOJO_READ_DATA_FLAG_NONE); | 860 MOJO_READ_DATA_FLAG_NONE); |
975 if (result != MOJO_RESULT_SHOULD_WAIT) { | 861 if (result != MOJO_RESULT_SHOULD_WAIT) { |
976 ASSERT_EQ(MOJO_RESULT_OK, result); | 862 ASSERT_EQ(MOJO_RESULT_OK, result); |
977 actual.append(buf, read_size); | 863 actual.append(buf, read_size); |
978 } | 864 } |
979 int resume_count = resource_controller_.num_resume_calls(); | 865 |
866 // Give mojo a chance pass data back and forth, and to request more data | |
867 // from the handler. | |
980 base::RunLoop().RunUntilIdle(); | 868 base::RunLoop().RunUntilIdle(); |
981 // Continue writing if controller->Resume() is called. | |
982 defer = (resume_count == resource_controller_.num_resume_calls()); | |
983 } | 869 } |
984 EXPECT_EQ(expected, actual); | 870 EXPECT_EQ(expected, actual); |
985 } | 871 } |
986 | 872 |
987 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 873 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
988 BeginWriteFailsOnReadCompleted) { | 874 BeginWriteFailsOnReadCompleted) { |
989 scoped_refptr<net::IOBuffer> io_buffer; | |
990 int io_buffer_size = 0; | |
991 bool defer = false; | |
992 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 875 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
993 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 876 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
994 | 877 |
995 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); | 878 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); |
996 ASSERT_FALSE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 879 ASSERT_EQ(MockResourceLoader::Status::CANCELED, |
880 mock_loader_->OnReadCompleted( | |
881 std::string(mock_loader_->io_buffer_size(), 'A'))); | |
997 } | 882 } |
998 | 883 |
999 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 884 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
1000 BeginWriteReturnsShouldWaitOnReadCompleted) { | 885 BeginWriteReturnsShouldWaitOnReadCompleted) { |
1001 scoped_refptr<net::IOBuffer> io_buffer; | |
1002 int io_buffer_size = 0; | |
1003 bool defer = false; | |
1004 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 886 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
1005 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 887 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
1006 | 888 |
1007 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 889 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
1008 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 890 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
1009 EXPECT_TRUE(defer); | 891 mock_loader_->OnReadCompleted( |
892 std::string(mock_loader_->io_buffer_size(), 'A'))); | |
1010 } | 893 } |
1011 | 894 |
1012 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 895 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
1013 BeginWriteFailsOnResume) { | 896 BeginWriteFailsOnResume) { |
1014 bool defer = false; | |
1015 int io_buffer_size = 0; | |
1016 scoped_refptr<net::IOBuffer> io_buffer; | |
1017 | |
1018 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 897 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
1019 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 898 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
1020 ASSERT_TRUE(handler_->OnReadCompleted(0, &defer)); | 899 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0)); |
1021 ASSERT_FALSE(defer); | |
1022 url_loader_client_.RunUntilResponseBodyArrived(); | 900 url_loader_client_.RunUntilResponseBodyArrived(); |
1023 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 901 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
1024 | 902 |
1025 while (!defer) { | 903 while (true) { |
1026 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 904 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
1027 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 905 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( |
906 std::string(mock_loader_->io_buffer_size(), 'A')); | |
907 if (result == MockResourceLoader::Status::CALLBACK_PENDING) | |
908 break; | |
909 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
1028 } | 910 } |
1029 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); | 911 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); |
1030 | 912 |
1031 while (!resource_controller_.is_cancel_with_error_called()) { | 913 while (mock_loader_->status() != MockResourceLoader::Status::CANCELED) { |
1032 char buf[256]; | 914 char buf[256]; |
1033 uint32_t read_size = sizeof(buf); | 915 uint32_t read_size = sizeof(buf); |
1034 MojoResult result = | 916 MojoResult result = |
1035 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 917 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
1036 MOJO_READ_DATA_FLAG_NONE); | 918 MOJO_READ_DATA_FLAG_NONE); |
1037 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); | 919 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); |
1038 base::RunLoop().RunUntilIdle(); | 920 base::RunLoop().RunUntilIdle(); |
1039 } | 921 } |
1040 | 922 |
1041 EXPECT_FALSE(url_loader_client_.has_received_completion()); | 923 EXPECT_FALSE(url_loader_client_.has_received_completion()); |
1042 EXPECT_EQ(net::ERR_FAILED, resource_controller_.error()); | 924 EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code()); |
1043 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | |
1044 } | 925 } |
1045 | 926 |
1046 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, CancelWhileWaiting) { | 927 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, CancelWhileWaiting) { |
1047 bool defer = false; | |
1048 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 928 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
1049 | 929 |
1050 while (!defer) { | 930 while (true) { |
1051 scoped_refptr<net::IOBuffer> io_buffer; | 931 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
1052 int io_buffer_size = 0; | 932 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( |
1053 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 933 std::string(mock_loader_->io_buffer_size(), 'A')); |
1054 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 934 if (result == MockResourceLoader::Status::CALLBACK_PENDING) |
935 break; | |
936 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
1055 } | 937 } |
1056 | 938 |
1057 url_loader_client_.RunUntilResponseBodyArrived(); | 939 url_loader_client_.RunUntilResponseBodyArrived(); |
1058 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 940 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
1059 | 941 |
1060 defer = false; | |
1061 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, | 942 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, |
1062 net::ERR_ABORTED); | 943 net::ERR_ABORTED); |
1063 handler_->OnResponseCompleted(status, &defer); | 944 ASSERT_EQ( |
945 MockResourceLoader::Status::IDLE, | |
946 mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel(status)); | |
1064 | 947 |
1065 ASSERT_FALSE(url_loader_client_.has_received_completion()); | 948 ASSERT_FALSE(url_loader_client_.has_received_completion()); |
1066 url_loader_client_.RunUntilComplete(); | 949 url_loader_client_.RunUntilComplete(); |
1067 EXPECT_EQ(net::ERR_ABORTED, | 950 EXPECT_EQ(net::ERR_ABORTED, |
1068 url_loader_client_.completion_status().error_code); | 951 url_loader_client_.completion_status().error_code); |
1069 | 952 |
1070 while (true) { | 953 while (true) { |
1071 char buffer[16]; | 954 char buffer[16]; |
1072 uint32_t read_size = sizeof(buffer); | 955 uint32_t read_size = sizeof(buffer); |
1073 MojoResult result = | 956 MojoResult result = |
1074 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 957 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
1075 &read_size, MOJO_READ_DATA_FLAG_NONE); | 958 &read_size, MOJO_READ_DATA_FLAG_NONE); |
1076 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 959 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
1077 break; | 960 break; |
1078 base::RunLoop().RunUntilIdle(); | 961 base::RunLoop().RunUntilIdle(); |
1079 DCHECK(result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_OK); | 962 DCHECK(result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_OK); |
1080 } | 963 } |
1081 | 964 |
1082 base::RunLoop().RunUntilIdle(); | 965 base::RunLoop().RunUntilIdle(); |
1083 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | |
1084 } | 966 } |
1085 | 967 |
1086 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, RedirectHandling) { | 968 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, RedirectHandling) { |
1087 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 969 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
1088 bool defer = false; | |
1089 | 970 |
1090 ASSERT_TRUE(handler_->OnWillStart(request_->url(), &defer)); | 971 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1091 ASSERT_FALSE(defer); | 972 mock_loader_->OnWillStart(request_->url())); |
973 | |
1092 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 974 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
1093 net::RedirectInfo redirect_info; | 975 net::RedirectInfo redirect_info; |
1094 redirect_info.status_code = 301; | 976 redirect_info.status_code = 301; |
1095 ASSERT_TRUE( | 977 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
1096 handler_->OnRequestRedirected(redirect_info, response.get(), &defer)); | 978 mock_loader_->OnRequestRedirected(redirect_info, response.get())); |
1097 ASSERT_TRUE(defer); | |
1098 | 979 |
1099 ASSERT_FALSE(url_loader_client_.has_received_response()); | 980 ASSERT_FALSE(url_loader_client_.has_received_response()); |
1100 ASSERT_FALSE(url_loader_client_.has_received_redirect()); | 981 ASSERT_FALSE(url_loader_client_.has_received_redirect()); |
1101 url_loader_client_.RunUntilRedirectReceived(); | 982 url_loader_client_.RunUntilRedirectReceived(); |
1102 | 983 |
1103 ASSERT_FALSE(url_loader_client_.has_received_response()); | 984 ASSERT_FALSE(url_loader_client_.has_received_response()); |
1104 ASSERT_TRUE(url_loader_client_.has_received_redirect()); | 985 ASSERT_TRUE(url_loader_client_.has_received_redirect()); |
1105 EXPECT_EQ(301, url_loader_client_.redirect_info().status_code); | 986 EXPECT_EQ(301, url_loader_client_.redirect_info().status_code); |
1106 | 987 |
1107 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | 988 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
989 mock_loader_->status()); | |
1108 handler_->FollowRedirect(); | 990 handler_->FollowRedirect(); |
1109 EXPECT_EQ(1, resource_controller_.num_resume_calls()); | 991 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
1110 | 992 |
1111 url_loader_client_.ClearHasReceivedRedirect(); | 993 url_loader_client_.ClearHasReceivedRedirect(); |
1112 // Redirect once more. | 994 // Redirect once more. |
1113 defer = false; | |
1114 redirect_info.status_code = 302; | 995 redirect_info.status_code = 302; |
1115 ASSERT_TRUE( | 996 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
1116 handler_->OnRequestRedirected(redirect_info, response.get(), &defer)); | 997 mock_loader_->OnRequestRedirected(redirect_info, response.get())); |
1117 ASSERT_TRUE(defer); | |
1118 | 998 |
1119 ASSERT_FALSE(url_loader_client_.has_received_response()); | 999 ASSERT_FALSE(url_loader_client_.has_received_response()); |
1120 ASSERT_FALSE(url_loader_client_.has_received_redirect()); | 1000 ASSERT_FALSE(url_loader_client_.has_received_redirect()); |
1121 url_loader_client_.RunUntilRedirectReceived(); | 1001 url_loader_client_.RunUntilRedirectReceived(); |
1122 | 1002 |
1123 ASSERT_FALSE(url_loader_client_.has_received_response()); | 1003 ASSERT_FALSE(url_loader_client_.has_received_response()); |
1124 ASSERT_TRUE(url_loader_client_.has_received_redirect()); | 1004 ASSERT_TRUE(url_loader_client_.has_received_redirect()); |
1125 EXPECT_EQ(302, url_loader_client_.redirect_info().status_code); | 1005 EXPECT_EQ(302, url_loader_client_.redirect_info().status_code); |
1126 | 1006 |
1127 EXPECT_EQ(1, resource_controller_.num_resume_calls()); | 1007 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
1008 mock_loader_->status()); | |
1128 handler_->FollowRedirect(); | 1009 handler_->FollowRedirect(); |
1129 EXPECT_EQ(2, resource_controller_.num_resume_calls()); | 1010 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
1130 | 1011 |
1131 // Give the final response. | 1012 // Give the final response. |
1132 defer = false; | 1013 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1133 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 1014 mock_loader_->OnResponseStarted(response.get())); |
1134 ASSERT_FALSE(defer); | |
1135 | 1015 |
1136 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 1016 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
1137 handler_->OnResponseCompleted(status, &defer); | 1017 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1138 ASSERT_FALSE(defer); | 1018 mock_loader_->OnResponseCompleted(status)); |
1139 | 1019 |
1140 ASSERT_FALSE(url_loader_client_.has_received_completion()); | 1020 ASSERT_FALSE(url_loader_client_.has_received_completion()); |
1141 url_loader_client_.RunUntilComplete(); | 1021 url_loader_client_.RunUntilComplete(); |
1142 | 1022 |
1143 ASSERT_TRUE(url_loader_client_.has_received_response()); | 1023 ASSERT_TRUE(url_loader_client_.has_received_response()); |
1144 ASSERT_TRUE(url_loader_client_.has_received_completion()); | 1024 ASSERT_TRUE(url_loader_client_.has_received_completion()); |
1145 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 1025 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
1146 } | 1026 } |
1147 | 1027 |
1028 // Test the case where th other process tells the ResourceHandler to follow a | |
1029 // redirect, despite the fact that no redirect has been received yet. | |
1148 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 1030 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
1149 MalformedFollowRedirectRequest) { | 1031 MalformedFollowRedirectRequest) { |
1150 handler_->FollowRedirect(); | 1032 handler_->FollowRedirect(); |
1151 | 1033 |
1152 EXPECT_TRUE(handler_->has_received_bad_message()); | 1034 EXPECT_TRUE(handler_->has_received_bad_message()); |
1153 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | |
1154 } | 1035 } |
1155 | 1036 |
1156 // Typically ResourceHandler methods are called in this order. | 1037 // Typically ResourceHandler methods are called in this order. |
1157 TEST_P( | 1038 TEST_P( |
1158 MojoAsyncResourceHandlerWithAllocationSizeTest, | 1039 MojoAsyncResourceHandlerWithAllocationSizeTest, |
1159 OnWillStartThenOnResponseStartedThenOnWillReadThenOnReadCompletedThenOnRespo nseCompleted) { | 1040 OnWillStartThenOnResponseStartedThenOnWillReadThenOnReadCompletedThenOnRespo nseCompleted) { |
1160 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 1041 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
1161 bool defer = false; | |
1162 | 1042 |
1163 ASSERT_TRUE(handler_->OnWillStart(request_->url(), &defer)); | 1043 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1164 ASSERT_FALSE(defer); | 1044 mock_loader_->OnWillStart(request_->url())); |
1165 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 1045 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
1166 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 1046 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1167 ASSERT_FALSE(defer); | 1047 mock_loader_->OnResponseStarted(response.get())); |
1168 | 1048 |
1169 ASSERT_FALSE(url_loader_client_.has_received_response()); | 1049 ASSERT_FALSE(url_loader_client_.has_received_response()); |
1170 url_loader_client_.RunUntilResponseReceived(); | 1050 url_loader_client_.RunUntilResponseReceived(); |
1171 | 1051 |
1172 int io_buffer_size = 0; | 1052 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
1173 scoped_refptr<net::IOBuffer> io_buffer; | |
1174 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
1175 ASSERT_TRUE(io_buffer); | |
1176 ASSERT_GT(io_buffer_size, 0); | |
1177 io_buffer->data()[0] = 'A'; | |
1178 | 1053 |
1179 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); | 1054 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); |
1180 url_loader_client_.RunUntilResponseBodyArrived(); | 1055 url_loader_client_.RunUntilResponseBodyArrived(); |
1181 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 1056 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
1182 | 1057 |
1183 ASSERT_TRUE(handler_->OnReadCompleted(1, &defer)); | 1058 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1184 ASSERT_FALSE(defer); | 1059 mock_loader_->OnReadCompleted("A")); |
1185 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 1060 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
1186 handler_->OnResponseCompleted(status, &defer); | 1061 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1187 ASSERT_FALSE(defer); | 1062 mock_loader_->OnResponseCompleted(status)); |
1188 | 1063 |
1189 ASSERT_FALSE(url_loader_client_.has_received_completion()); | 1064 ASSERT_FALSE(url_loader_client_.has_received_completion()); |
1190 url_loader_client_.RunUntilComplete(); | 1065 url_loader_client_.RunUntilComplete(); |
1191 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 1066 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
1192 | 1067 |
1193 // This is needed because |*io_buffer| may keep the data producer alive. | 1068 // This is needed because |*io_buffer| may keep the data producer alive. |
1194 io_buffer = nullptr; | 1069 mock_loader_->ReleaseIOBuffer(); |
1195 | 1070 |
1196 std::string body; | 1071 std::string body; |
1197 while (true) { | 1072 while (true) { |
1198 char buffer[16]; | 1073 char buffer[16]; |
1199 uint32_t read_size = sizeof(buffer); | 1074 uint32_t read_size = sizeof(buffer); |
1200 MojoResult result = | 1075 MojoResult result = |
1201 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 1076 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
1202 &read_size, MOJO_READ_DATA_FLAG_NONE); | 1077 &read_size, MOJO_READ_DATA_FLAG_NONE); |
1203 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 1078 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
1204 break; | 1079 break; |
1205 if (result == MOJO_RESULT_SHOULD_WAIT) { | 1080 if (result == MOJO_RESULT_SHOULD_WAIT) { |
1206 base::RunLoop().RunUntilIdle(); | 1081 base::RunLoop().RunUntilIdle(); |
1207 } else { | 1082 } else { |
1208 ASSERT_EQ(result, MOJO_RESULT_OK); | 1083 ASSERT_EQ(result, MOJO_RESULT_OK); |
1209 body.append(buffer, read_size); | 1084 body.append(buffer, read_size); |
1210 } | 1085 } |
1211 } | 1086 } |
1212 EXPECT_EQ("A", body); | 1087 EXPECT_EQ("A", body); |
1213 } | 1088 } |
1214 | 1089 |
1215 // MimeResourceHandler calls delegated ResourceHandler's methods in this order. | 1090 // MimeResourceHandler calls delegated ResourceHandler's methods in this order. |
1216 TEST_P( | 1091 TEST_P( |
1217 MojoAsyncResourceHandlerWithAllocationSizeTest, | 1092 MojoAsyncResourceHandlerWithAllocationSizeTest, |
1218 OnWillStartThenOnWillReadThenOnResponseStartedThenOnReadCompletedThenOnRespo nseCompleted) { | 1093 OnWillStartThenOnWillReadThenOnResponseStartedThenOnReadCompletedThenOnRespo nseCompleted) { |
1219 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 1094 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
1220 bool defer = false; | |
1221 | 1095 |
1222 ASSERT_TRUE(handler_->OnWillStart(request_->url(), &defer)); | 1096 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1223 ASSERT_FALSE(defer); | 1097 mock_loader_->OnWillStart(request_->url())); |
1224 | 1098 |
1225 int io_buffer_size = 0; | 1099 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
1226 scoped_refptr<net::IOBuffer> io_buffer; | |
1227 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
1228 ASSERT_TRUE(io_buffer); | |
1229 ASSERT_GT(io_buffer_size, 0); | |
1230 io_buffer->data()[0] = 'B'; | |
1231 | 1100 |
1232 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); | 1101 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); |
1233 url_loader_client_.RunUntilResponseBodyArrived(); | 1102 url_loader_client_.RunUntilResponseBodyArrived(); |
1234 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 1103 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
1235 | 1104 |
1236 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 1105 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
1237 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 1106 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1238 ASSERT_FALSE(defer); | 1107 mock_loader_->OnResponseStarted(response.get())); |
1239 | 1108 |
1240 ASSERT_FALSE(url_loader_client_.has_received_response()); | 1109 ASSERT_FALSE(url_loader_client_.has_received_response()); |
1241 url_loader_client_.RunUntilResponseReceived(); | 1110 url_loader_client_.RunUntilResponseReceived(); |
1242 | 1111 |
1243 ASSERT_TRUE(handler_->OnReadCompleted(1, &defer)); | 1112 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1244 ASSERT_FALSE(defer); | 1113 mock_loader_->OnReadCompleted("B")); |
1245 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 1114 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
1246 handler_->OnResponseCompleted(status, &defer); | 1115 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
1247 ASSERT_FALSE(defer); | 1116 mock_loader_->OnResponseCompleted(status)); |
1248 | 1117 |
1249 ASSERT_FALSE(url_loader_client_.has_received_completion()); | 1118 ASSERT_FALSE(url_loader_client_.has_received_completion()); |
1250 url_loader_client_.RunUntilComplete(); | 1119 url_loader_client_.RunUntilComplete(); |
1251 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 1120 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
1252 | 1121 |
1253 // This is needed because |*io_buffer| may keep the data producer alive. | 1122 // This is needed because |*io_buffer| may keep the data producer alive. |
1254 io_buffer = nullptr; | 1123 mock_loader_->ReleaseIOBuffer(); |
1255 | 1124 |
1256 std::string body; | 1125 std::string body; |
1257 while (true) { | 1126 while (true) { |
1258 char buffer[16]; | 1127 char buffer[16]; |
1259 uint32_t read_size = sizeof(buffer); | 1128 uint32_t read_size = sizeof(buffer); |
1260 MojoResult result = | 1129 MojoResult result = |
1261 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 1130 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
1262 &read_size, MOJO_READ_DATA_FLAG_NONE); | 1131 &read_size, MOJO_READ_DATA_FLAG_NONE); |
1263 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 1132 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
1264 break; | 1133 break; |
1265 if (result == MOJO_RESULT_SHOULD_WAIT) { | 1134 if (result == MOJO_RESULT_SHOULD_WAIT) { |
1266 base::RunLoop().RunUntilIdle(); | 1135 base::RunLoop().RunUntilIdle(); |
1267 } else { | 1136 } else { |
1268 ASSERT_EQ(result, MOJO_RESULT_OK); | 1137 ASSERT_EQ(result, MOJO_RESULT_OK); |
1269 body.append(buffer, read_size); | 1138 body.append(buffer, read_size); |
1270 } | 1139 } |
1271 } | 1140 } |
1272 EXPECT_EQ("B", body); | 1141 EXPECT_EQ("B", body); |
1273 } | 1142 } |
1274 | 1143 |
1275 INSTANTIATE_TEST_CASE_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 1144 INSTANTIATE_TEST_CASE_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
1276 MojoAsyncResourceHandlerWithAllocationSizeTest, | 1145 MojoAsyncResourceHandlerWithAllocationSizeTest, |
1277 ::testing::Values(8, 32 * 2014)); | 1146 ::testing::Values(8, 32 * 2014)); |
1278 } // namespace | 1147 } // namespace |
1279 } // namespace content | 1148 } // namespace content |
OLD | NEW |