Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: content/browser/loader/mojo_async_resource_handler_unittest.cc

Issue 2581393002: Update MojoAsyncResourceHandler tests to use MockResourceLoader. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698