Chromium Code Reviews| 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 |