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

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

Issue 2526983002: Refactor ResourceHandler API. (Closed)
Patch Set: Fix merge again (?) 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/resource_controller.h" 18 #include "content/browser/loader/resource_controller.h"
19 #include "content/browser/loader/resource_dispatcher_host_impl.h" 19 #include "content/browser/loader/resource_dispatcher_host_impl.h"
20 #include "content/browser/loader/resource_request_info_impl.h" 20 #include "content/browser/loader/resource_request_info_impl.h"
21 #include "content/browser/loader/test_resource_handler_wrapper.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"
28 #include "content/public/browser/resource_throttle.h" 29 #include "content/public/browser/resource_throttle.h"
29 #include "content/public/browser/stream_info.h" 30 #include "content/public/browser/stream_info.h"
30 #include "content/public/common/resource_response.h" 31 #include "content/public/common/resource_response.h"
(...skipping 135 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 handler_wrapper_.reset(new TestResourceHandlerWrapper(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 TestResourceHandlerWrapper::Result result =
328 handler_wrapper_->OnWillStart(request_->url());
329 EXPECT_EQ(TestResourceHandlerWrapper::Result::RESUME, result);
330 if (result != TestResourceHandlerWrapper::Result::RESUME)
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 = handler_wrapper_->OnResponseStarted(response.get());
394 if (!handler_->OnResponseStarted(response.get(), &defer)) { 335 EXPECT_EQ(TestResourceHandlerWrapper::Result::RESUME, result);
395 ADD_FAILURE() << "OnResponseStarted returns false."; 336 if (result != TestResourceHandlerWrapper::Result::RESUME)
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<TestResourceHandlerWrapper> handler_wrapper_;
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(TestResourceHandlerWrapper::Result::RESUME,
448 EXPECT_TRUE(handler_->OnWillStart(request_->url(), &defer)); 385 handler_wrapper_->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(TestResourceHandlerWrapper::Result::RESUME,
391 handler_wrapper_->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(TestResourceHandlerWrapper::Result::RESUME,
403 handler_wrapper_->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);
(...skipping 14 matching lines...) Expand all
495 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadWithInsufficientResource) { 430 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadWithInsufficientResource) {
496 rdh_.set_max_num_in_flight_requests_per_process(0); 431 rdh_.set_max_num_in_flight_requests_per_process(0);
497 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 432 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
498 433
499 scoped_refptr<net::IOBuffer> io_buffer; 434 scoped_refptr<net::IOBuffer> io_buffer;
500 int io_buffer_size = 0; 435 int io_buffer_size = 0;
501 EXPECT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 436 EXPECT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
502 EXPECT_FALSE(io_buffer); 437 EXPECT_FALSE(io_buffer);
503 EXPECT_EQ(0, io_buffer_size); 438 EXPECT_EQ(0, io_buffer_size);
504 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); 439 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing());
505 EXPECT_TRUE(resource_controller_.is_cancel_with_error_called()); 440 // TODO(mmenke): Should make sure the class is cancelling with
506 EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES, resource_controller_.error()); 441 // ERR_INSUFFICIENT_RESOURCES here (Which it isn't currently doing).
507 handler_ = nullptr; 442 handler_ = nullptr;
508 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); 443 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing());
509 } 444 }
510 445
511 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndOnReadCompleted) { 446 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndOnReadCompleted) {
512 bool defer = false;
513 scoped_refptr<net::IOBuffer> io_buffer; 447 scoped_refptr<net::IOBuffer> io_buffer;
514 int io_buffer_size = 0; 448 int io_buffer_size = 0;
515 449
516 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 450 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
517 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 451 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
518 ASSERT_TRUE(io_buffer); 452 ASSERT_TRUE(io_buffer);
519 // The buffer size that the mime sniffer requires implicitly. 453 // The buffer size that the mime sniffer requires implicitly.
520 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); 454 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead);
521 455
522 url_loader_client_.RunUntilResponseBodyArrived(); 456 url_loader_client_.RunUntilResponseBodyArrived();
523 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 457 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
524 458
525 io_buffer->data()[0] = 'A'; 459 io_buffer->data()[0] = 'A';
526 io_buffer->data()[1] = 'B'; 460 io_buffer->data()[1] = 'B';
527 ASSERT_TRUE(handler_->OnReadCompleted(2, &defer)); 461 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
528 EXPECT_FALSE(defer); 462 handler_wrapper_->OnReadCompleted(2));
529 463
530 std::string contents; 464 std::string contents;
531 while (contents.size() < 2) { 465 while (contents.size() < 2) {
532 char buffer[16]; 466 char buffer[16];
533 uint32_t read_size = sizeof(buffer); 467 uint32_t read_size = sizeof(buffer);
534 MojoResult result = 468 MojoResult result =
535 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, 469 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer,
536 &read_size, MOJO_READ_DATA_FLAG_NONE); 470 &read_size, MOJO_READ_DATA_FLAG_NONE);
537 if (result == MOJO_RESULT_SHOULD_WAIT) { 471 if (result == MOJO_RESULT_SHOULD_WAIT) {
538 base::RunLoop().RunUntilIdle(); 472 base::RunLoop().RunUntilIdle();
539 continue; 473 continue;
540 } 474 }
541 contents.append(buffer, read_size); 475 contents.append(buffer, read_size);
542 } 476 }
543 EXPECT_EQ("AB", contents); 477 EXPECT_EQ("AB", contents);
544 } 478 }
545 479
546 TEST_F(MojoAsyncResourceHandlerTest, 480 TEST_F(MojoAsyncResourceHandlerTest,
547 OnWillReadAndOnReadCompletedWithInsufficientInitialCapacity) { 481 OnWillReadAndOnReadCompletedWithInsufficientInitialCapacity) {
548 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); 482 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2);
549 483
550 bool defer = false;
551 scoped_refptr<net::IOBuffer> io_buffer; 484 scoped_refptr<net::IOBuffer> io_buffer;
552 int io_buffer_size = 0; 485 int io_buffer_size = 0;
553 486
554 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 487 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
555 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 488 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
556 ASSERT_TRUE(io_buffer); 489 ASSERT_TRUE(io_buffer);
557 // The buffer size that the mime sniffer requires implicitly. 490 // The buffer size that the mime sniffer requires implicitly.
558 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); 491 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead);
559 492
560 url_loader_client_.RunUntilResponseBodyArrived(); 493 url_loader_client_.RunUntilResponseBodyArrived();
561 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 494 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
562 495
563 const std::string data("abcdefgh"); 496 const std::string data("abcdefgh");
564 strcpy(io_buffer->data(), data.c_str()); 497 strcpy(io_buffer->data(), data.c_str());
565 ASSERT_TRUE(handler_->OnReadCompleted(data.size(), &defer)); 498 ASSERT_EQ(TestResourceHandlerWrapper::Result::CALLBACK_PENDING,
566 EXPECT_TRUE(defer); 499 handler_wrapper_->OnReadCompleted(data.size()));
567 500
568 std::string contents; 501 std::string contents;
569 while (contents.size() < data.size()) { 502 while (contents.size() < data.size()) {
570 // This is needed for Resume to be called. 503 // This is needed for Resume to be called.
571 base::RunLoop().RunUntilIdle(); 504 base::RunLoop().RunUntilIdle();
572 char buffer[16]; 505 char buffer[16];
573 uint32_t read_size = sizeof(buffer); 506 uint32_t read_size = sizeof(buffer);
574 MojoResult result = 507 MojoResult result =
575 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, 508 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer,
576 &read_size, MOJO_READ_DATA_FLAG_NONE); 509 &read_size, MOJO_READ_DATA_FLAG_NONE);
577 if (result == MOJO_RESULT_SHOULD_WAIT) 510 if (result == MOJO_RESULT_SHOULD_WAIT)
578 continue; 511 continue;
579 ASSERT_EQ(MOJO_RESULT_OK, result); 512 ASSERT_EQ(MOJO_RESULT_OK, result);
580 contents.append(buffer, read_size); 513 contents.append(buffer, read_size);
581 } 514 }
582 EXPECT_EQ(data, contents); 515 EXPECT_EQ(data, contents);
583 EXPECT_EQ(0, resource_controller_.num_resume_calls()); 516 EXPECT_EQ(TestResourceHandlerWrapper::Result::CALLBACK_PENDING,
517 handler_wrapper_->last_result());
584 } 518 }
585 519
586 TEST_F(MojoAsyncResourceHandlerTest, 520 TEST_F(MojoAsyncResourceHandlerTest,
587 IOBufferFromOnWillReadShouldRemainValidEvenIfHandlerIsGone) { 521 IOBufferFromOnWillReadShouldRemainValidEvenIfHandlerIsGone) {
588 scoped_refptr<net::IOBuffer> io_buffer; 522 scoped_refptr<net::IOBuffer> io_buffer;
589 int io_buffer_size = 0; 523 int io_buffer_size = 0;
590 524
591 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 525 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
592 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 526 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
593 ASSERT_TRUE(io_buffer); 527 ASSERT_TRUE(io_buffer);
594 // The io_buffer size that the mime sniffer requires implicitly. 528 // The io_buffer size that the mime sniffer requires implicitly.
595 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); 529 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead);
596 530
597 handler_ = nullptr; 531 handler_ = nullptr;
598 url_loader_client_.Unbind(); 532 url_loader_client_.Unbind();
599 base::RunLoop().RunUntilIdle(); 533 base::RunLoop().RunUntilIdle();
600 534
601 // Hopefully ASAN checks this operation's validity. 535 // Hopefully ASAN checks this operation's validity.
602 io_buffer->data()[0] = 'A'; 536 io_buffer->data()[0] = 'A';
603 } 537 }
604 538
605 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted) { 539 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted) {
606 bool defer = false;
607 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 540 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
608 541
609 ResourceRequestInfoImpl::ForRequest(request_.get()) 542 ResourceRequestInfoImpl::ForRequest(request_.get())
610 ->set_was_ignored_by_handler(false); 543 ->set_was_ignored_by_handler(false);
611 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); 544 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK);
612 545
613 base::TimeTicks now1 = base::TimeTicks::Now(); 546 base::TimeTicks now1 = base::TimeTicks::Now();
614 handler_->OnResponseCompleted(status, &defer); 547 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
548 handler_wrapper_->OnResponseCompleted(status));
615 base::TimeTicks now2 = base::TimeTicks::Now(); 549 base::TimeTicks now2 = base::TimeTicks::Now();
616 EXPECT_FALSE(defer);
617 550
618 url_loader_client_.RunUntilComplete(); 551 url_loader_client_.RunUntilComplete();
619 EXPECT_TRUE(url_loader_client_.has_received_completion()); 552 EXPECT_TRUE(url_loader_client_.has_received_completion());
620 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); 553 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
621 EXPECT_FALSE(url_loader_client_.completion_status().was_ignored_by_handler); 554 EXPECT_FALSE(url_loader_client_.completion_status().was_ignored_by_handler);
622 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); 555 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time);
623 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); 556 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2);
624 EXPECT_EQ(request_->GetTotalReceivedBytes(), 557 EXPECT_EQ(request_->GetTotalReceivedBytes(),
625 url_loader_client_.completion_status().encoded_data_length); 558 url_loader_client_.completion_status().encoded_data_length);
626 } 559 }
627 560
628 // This test case sets different status values from OnResponseCompleted. 561 // This test case sets different status values from OnResponseCompleted.
629 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted2) { 562 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted2) {
630 rdh_.SetDelegate(nullptr); 563 rdh_.SetDelegate(nullptr);
631 bool defer = false;
632 // Don't use CallOnWillStartAndOnResponseStarted as this test case manually 564 // Don't use CallOnWillStartAndOnResponseStarted as this test case manually
633 // sets the null delegate. 565 // sets the null delegate.
634 ASSERT_TRUE(CallOnWillStart()); 566 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
567 handler_wrapper_->OnWillStart(request_->url()));
635 scoped_refptr<ResourceResponse> response = new ResourceResponse(); 568 scoped_refptr<ResourceResponse> response = new ResourceResponse();
636 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); 569 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
637 ASSERT_FALSE(defer); 570 handler_wrapper_->OnResponseStarted(response.get()));
638 ASSERT_FALSE(url_loader_client_.has_received_response()); 571 ASSERT_FALSE(url_loader_client_.has_received_response());
639 url_loader_client_.RunUntilResponseReceived(); 572 url_loader_client_.RunUntilResponseReceived();
640 573
641 ResourceRequestInfoImpl::ForRequest(request_.get()) 574 ResourceRequestInfoImpl::ForRequest(request_.get())
642 ->set_was_ignored_by_handler(true); 575 ->set_was_ignored_by_handler(true);
643 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, 576 net::URLRequestStatus status(net::URLRequestStatus::CANCELED,
644 net::ERR_ABORTED); 577 net::ERR_ABORTED);
645 578
646 base::TimeTicks now1 = base::TimeTicks::Now(); 579 base::TimeTicks now1 = base::TimeTicks::Now();
647 handler_->OnResponseCompleted(status, &defer); 580 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
581 handler_wrapper_->OnResponseCompleted(status));
648 base::TimeTicks now2 = base::TimeTicks::Now(); 582 base::TimeTicks now2 = base::TimeTicks::Now();
649 EXPECT_FALSE(defer);
650 583
651 url_loader_client_.RunUntilComplete(); 584 url_loader_client_.RunUntilComplete();
652 EXPECT_TRUE(url_loader_client_.has_received_completion()); 585 EXPECT_TRUE(url_loader_client_.has_received_completion());
653 EXPECT_EQ(net::ERR_ABORTED, 586 EXPECT_EQ(net::ERR_ABORTED,
654 url_loader_client_.completion_status().error_code); 587 url_loader_client_.completion_status().error_code);
655 EXPECT_TRUE(url_loader_client_.completion_status().was_ignored_by_handler); 588 EXPECT_TRUE(url_loader_client_.completion_status().was_ignored_by_handler);
656 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); 589 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time);
657 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); 590 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2);
658 EXPECT_EQ(request_->GetTotalReceivedBytes(), 591 EXPECT_EQ(request_->GetTotalReceivedBytes(),
659 url_loader_client_.completion_status().encoded_data_length); 592 url_loader_client_.completion_status().encoded_data_length);
660 } 593 }
661 594
662 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithCanceledTimedOut) { 595 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithCanceledTimedOut) {
663 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, 596 net::URLRequestStatus status(net::URLRequestStatus::CANCELED,
664 net::ERR_TIMED_OUT); 597 net::ERR_TIMED_OUT);
665 bool defer = false;
666 598
667 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 599 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
668 handler_->OnResponseCompleted(status, &defer); 600 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
669 EXPECT_FALSE(defer); 601 handler_wrapper_->OnResponseCompleted(status));
670 602
671 url_loader_client_.RunUntilComplete(); 603 url_loader_client_.RunUntilComplete();
672 EXPECT_TRUE(url_loader_client_.has_received_completion()); 604 EXPECT_TRUE(url_loader_client_.has_received_completion());
673 EXPECT_EQ(net::ERR_TIMED_OUT, 605 EXPECT_EQ(net::ERR_TIMED_OUT,
674 url_loader_client_.completion_status().error_code); 606 url_loader_client_.completion_status().error_code);
675 } 607 }
676 608
677 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithFailedTimedOut) { 609 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithFailedTimedOut) {
678 net::URLRequestStatus status(net::URLRequestStatus::FAILED, 610 net::URLRequestStatus status(net::URLRequestStatus::FAILED,
679 net::ERR_TIMED_OUT); 611 net::ERR_TIMED_OUT);
680 bool defer = false;
681 612
682 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 613 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
683 handler_->OnResponseCompleted(status, &defer); 614 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
684 EXPECT_FALSE(defer); 615 handler_wrapper_->OnResponseCompleted(status));
685 616
686 url_loader_client_.RunUntilComplete(); 617 url_loader_client_.RunUntilComplete();
687 EXPECT_TRUE(url_loader_client_.has_received_completion()); 618 EXPECT_TRUE(url_loader_client_.has_received_completion());
688 EXPECT_EQ(net::ERR_TIMED_OUT, 619 EXPECT_EQ(net::ERR_TIMED_OUT,
689 url_loader_client_.completion_status().error_code); 620 url_loader_client_.completion_status().error_code);
690 } 621 }
691 622
692 TEST_F(MojoAsyncResourceHandlerTest, ResponseCompletionShouldCloseDataPipe) { 623 TEST_F(MojoAsyncResourceHandlerTest, ResponseCompletionShouldCloseDataPipe) {
693 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 624 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
694 625
695 scoped_refptr<net::IOBuffer> io_buffer; 626 scoped_refptr<net::IOBuffer> io_buffer;
696 int io_buffer_size = 0; 627 int io_buffer_size = 0;
697 bool defer = false;
698 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 628 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
699 url_loader_client_.RunUntilResponseBodyArrived(); 629 url_loader_client_.RunUntilResponseBodyArrived();
700 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 630 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
701 ASSERT_TRUE(handler_->OnReadCompleted(0, &defer)); 631 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
702 EXPECT_FALSE(defer); 632 handler_wrapper_->OnReadCompleted(0));
703 633
704 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); 634 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK);
705 handler_->OnResponseCompleted(status, &defer); 635 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
706 EXPECT_FALSE(defer); 636 handler_wrapper_->OnResponseCompleted(status));
707 637
708 url_loader_client_.RunUntilComplete(); 638 url_loader_client_.RunUntilComplete();
709 EXPECT_TRUE(url_loader_client_.has_received_completion()); 639 EXPECT_TRUE(url_loader_client_.has_received_completion());
710 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); 640 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
711 641
712 // This is needed because |*io_buffer| may keep the data producer alive. 642 // This is needed because |*io_buffer| may keep the data producer alive.
713 io_buffer = nullptr; 643 io_buffer = nullptr;
714 644
715 while (true) { 645 while (true) {
716 char buffer[16]; 646 char buffer[16];
(...skipping 10 matching lines...) Expand all
727 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission) { 657 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission) {
728 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 658 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
729 659
730 scoped_refptr<net::IOBuffer> io_buffer; 660 scoped_refptr<net::IOBuffer> io_buffer;
731 int io_buffer_size = 0; 661 int io_buffer_size = 0;
732 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 662 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
733 url_loader_client_.RunUntilResponseBodyArrived(); 663 url_loader_client_.RunUntilResponseBodyArrived();
734 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 664 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
735 ASSERT_GT(io_buffer_size, 0); 665 ASSERT_GT(io_buffer_size, 0);
736 memset(io_buffer->data(), 'a', io_buffer_size); 666 memset(io_buffer->data(), 'a', io_buffer_size);
737 bool defer = false; 667 ASSERT_EQ(TestResourceHandlerWrapper::Result::CALLBACK_PENDING,
738 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); 668 handler_wrapper_->OnReadCompleted(io_buffer_size));
739 // We don't care |defer|'s value here.
740 669
741 defer = false; 670 // Out of band cancel.
742 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); 671 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED);
743 handler_->OnResponseCompleted(status, &defer); 672 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
744 EXPECT_FALSE(defer); 673 handler_wrapper_->OnResponseCompletedForOutOfBandCancel(status));
745 674
746 url_loader_client_.RunUntilComplete(); 675 url_loader_client_.RunUntilComplete();
747 EXPECT_TRUE(url_loader_client_.has_received_completion()); 676 EXPECT_TRUE(url_loader_client_.has_received_completion());
748 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); 677 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code);
749 678
750 // This is needed because |*io_buffer| may keep the data producer alive. 679 // This is needed because |*io_buffer| may keep the data producer alive.
751 io_buffer = nullptr; 680 io_buffer = nullptr;
752 681
753 std::string actual; 682 std::string actual;
754 while (true) { 683 while (true) {
(...skipping 16 matching lines...) Expand all
771 700
772 // In this case, an error is notified after OnWillRead, before OnReadCompleted. 701 // In this case, an error is notified after OnWillRead, before OnReadCompleted.
773 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission2) { 702 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission2) {
774 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 703 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
775 704
776 scoped_refptr<net::IOBuffer> io_buffer; 705 scoped_refptr<net::IOBuffer> io_buffer;
777 int io_buffer_size = 0; 706 int io_buffer_size = 0;
778 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 707 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
779 url_loader_client_.RunUntilResponseBodyArrived(); 708 url_loader_client_.RunUntilResponseBodyArrived();
780 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 709 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
781 bool defer = false;
782 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); 710 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED);
783 handler_->OnResponseCompleted(status, &defer); 711 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
784 EXPECT_FALSE(defer); 712 handler_wrapper_->OnResponseCompleted(status));
785 713
786 url_loader_client_.RunUntilComplete(); 714 url_loader_client_.RunUntilComplete();
787 EXPECT_TRUE(url_loader_client_.has_received_completion()); 715 EXPECT_TRUE(url_loader_client_.has_received_completion());
788 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); 716 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code);
789 717
790 // This is needed because |*io_buffer| may keep the data producer alive. 718 // This is needed because |*io_buffer| may keep the data producer alive.
791 io_buffer = nullptr; 719 io_buffer = nullptr;
792 720
793 while (true) { 721 while (true) {
794 char buf[16]; 722 char buf[16];
795 uint32_t read_size = sizeof(buf); 723 uint32_t read_size = sizeof(buf);
796 MojoResult result = 724 MojoResult result =
797 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, 725 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size,
798 MOJO_READ_DATA_FLAG_NONE); 726 MOJO_READ_DATA_FLAG_NONE);
799 if (result == MOJO_RESULT_FAILED_PRECONDITION) 727 if (result == MOJO_RESULT_FAILED_PRECONDITION)
800 break; 728 break;
801 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, result); 729 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, result);
802 base::RunLoop().RunUntilIdle(); 730 base::RunLoop().RunUntilIdle();
803 } 731 }
804 } 732 }
805 733
806 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteFailsOnWillRead) { 734 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteFailsOnWillRead) {
807 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); 735 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN);
808 scoped_refptr<net::IOBuffer> io_buffer; 736 scoped_refptr<net::IOBuffer> io_buffer;
809 int io_buffer_size = 0; 737 int io_buffer_size = 0;
810 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 738 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
811 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 739 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
812 EXPECT_FALSE(resource_controller_.is_cancel_with_error_called());
813 } 740 }
814 741
815 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteReturnsShouldWaitOnWillRead) { 742 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteReturnsShouldWaitOnWillRead) {
816 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); 743 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT);
817 scoped_refptr<net::IOBuffer> io_buffer; 744 scoped_refptr<net::IOBuffer> io_buffer;
818 int io_buffer_size = 0; 745 int io_buffer_size = 0;
819 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 746 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
820 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 747 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
821 EXPECT_TRUE(io_buffer); 748 EXPECT_TRUE(io_buffer);
822 EXPECT_GT(io_buffer_size, 0); 749 EXPECT_GT(io_buffer_size, 0);
823 } 750 }
824 751
825 TEST_F(MojoAsyncResourceHandlerTest, 752 TEST_F(MojoAsyncResourceHandlerTest,
826 BeginWriteReturnsShouldWaitOnWillReadAndThenReturnsOK) { 753 BeginWriteReturnsShouldWaitOnWillReadAndThenReturnsOK) {
827 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); 754 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT);
828 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 755 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
829 size_t written = 0; 756 size_t written = 0;
830 while (true) { 757 while (true) {
831 scoped_refptr<net::IOBuffer> io_buffer; 758 scoped_refptr<net::IOBuffer> io_buffer;
832 int io_buffer_size = 0; 759 int io_buffer_size = 0;
833 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 760 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
834 EXPECT_TRUE(io_buffer); 761 EXPECT_TRUE(io_buffer);
835 EXPECT_GT(io_buffer_size, 0); 762 EXPECT_GT(io_buffer_size, 0);
836 memset(io_buffer->data(), 'X', io_buffer_size); 763 memset(io_buffer->data(), 'X', io_buffer_size);
837 written += io_buffer_size; 764 written += io_buffer_size;
838 bool defer = false; 765 TestResourceHandlerWrapper::Result result =
839 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); 766 handler_wrapper_->OnReadCompleted(io_buffer_size);
840 if (defer) 767 if (result == TestResourceHandlerWrapper::Result::CALLBACK_PENDING)
841 break; 768 break;
769 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME, result);
842 } 770 }
843 771
844 url_loader_client_.RunUntilResponseBodyArrived(); 772 url_loader_client_.RunUntilResponseBodyArrived();
845 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 773 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
846 handler_->ResetBeginWriteExpectation(); 774 handler_->ResetBeginWriteExpectation();
847 handler_->OnWritableForTesting(); 775 handler_->OnWritableForTesting();
848 776
849 std::string actual; 777 std::string actual;
850 while (actual.size() < written) { 778 while (actual.size() < written) {
851 char buf[16]; 779 char buf[16];
852 uint32_t read_size = sizeof(buf); 780 uint32_t read_size = sizeof(buf);
853 MojoResult result = 781 MojoResult result =
854 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, 782 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size,
855 MOJO_READ_DATA_FLAG_NONE); 783 MOJO_READ_DATA_FLAG_NONE);
856 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); 784 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT);
857 if (result == MOJO_RESULT_OK) 785 if (result == MOJO_RESULT_OK)
858 actual.append(buf, read_size); 786 actual.append(buf, read_size);
859 base::RunLoop().RunUntilIdle(); 787 base::RunLoop().RunUntilIdle();
860 } 788 }
861 789
862 EXPECT_EQ(std::string(written, 'X'), actual); 790 EXPECT_EQ(std::string(written, 'X'), actual);
863 EXPECT_EQ(1, resource_controller_.num_resume_calls()); 791 EXPECT_EQ(TestResourceHandlerWrapper::Result::RESUME,
792 handler_wrapper_->last_result());
864 } 793 }
865 794
866 TEST_F(MojoAsyncResourceHandlerTest, 795 TEST_F(MojoAsyncResourceHandlerTest,
867 EndWriteFailsOnWillReadWithInsufficientInitialCapacity) { 796 EndWriteFailsOnWillReadWithInsufficientInitialCapacity) {
868 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); 797 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2);
869 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 798 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
870 handler_->set_end_write_expectation(MOJO_RESULT_UNKNOWN); 799 handler_->set_end_write_expectation(MOJO_RESULT_UNKNOWN);
871 scoped_refptr<net::IOBuffer> io_buffer; 800 scoped_refptr<net::IOBuffer> io_buffer;
872 int io_buffer_size = 0; 801 int io_buffer_size = 0;
873 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 802 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
874 } 803 }
875 804
876 TEST_F(MojoAsyncResourceHandlerTest, EndWriteFailsOnReadCompleted) { 805 TEST_F(MojoAsyncResourceHandlerTest, EndWriteFailsOnReadCompleted) {
877 scoped_refptr<net::IOBuffer> io_buffer; 806 scoped_refptr<net::IOBuffer> io_buffer;
878 int io_buffer_size = 0; 807 int io_buffer_size = 0;
879 bool defer = false;
880 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 808 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
881 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 809 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
882 810
883 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); 811 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT);
884 ASSERT_FALSE(handler_->OnReadCompleted(io_buffer_size, &defer)); 812 ASSERT_EQ(TestResourceHandlerWrapper::Result::CANCEL,
813 handler_wrapper_->OnReadCompleted(io_buffer_size));
885 } 814 }
886 815
887 TEST_F(MojoAsyncResourceHandlerTest, 816 TEST_F(MojoAsyncResourceHandlerTest,
888 EndWriteFailsOnReadCompletedWithInsufficientInitialCapacity) { 817 EndWriteFailsOnReadCompletedWithInsufficientInitialCapacity) {
889 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); 818 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2);
890 scoped_refptr<net::IOBuffer> io_buffer; 819 scoped_refptr<net::IOBuffer> io_buffer;
891 int io_buffer_size = 0; 820 int io_buffer_size = 0;
892 bool defer = false;
893 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 821 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
894 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 822 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
895 823
896 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); 824 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT);
897 ASSERT_FALSE(handler_->OnReadCompleted(io_buffer_size, &defer)); 825 ASSERT_EQ(TestResourceHandlerWrapper::Result::CANCEL,
826 handler_wrapper_->OnReadCompleted(io_buffer_size));
898 } 827 }
899 828
900 TEST_F(MojoAsyncResourceHandlerTest, 829 TEST_F(MojoAsyncResourceHandlerTest,
901 EndWriteFailsOnResumeWithInsufficientInitialCapacity) { 830 EndWriteFailsOnResumeWithInsufficientInitialCapacity) {
902 MojoAsyncResourceHandler::SetAllocationSizeForTesting(8); 831 MojoAsyncResourceHandler::SetAllocationSizeForTesting(8);
903 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 832 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
904 scoped_refptr<net::IOBuffer> io_buffer; 833 scoped_refptr<net::IOBuffer> io_buffer;
905 int io_buffer_size = 0; 834 int io_buffer_size = 0;
906 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 835 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
907 url_loader_client_.RunUntilResponseBodyArrived(); 836 url_loader_client_.RunUntilResponseBodyArrived();
908 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 837 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
909 838
910 while (true) { 839 while (true) {
911 bool defer = false;
912 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer));
913 ASSERT_GE(io_buffer_size, 0); 840 ASSERT_GE(io_buffer_size, 0);
914 if (defer) 841 TestResourceHandlerWrapper::Result result =
842 handler_wrapper_->OnReadCompleted(io_buffer_size);
843 if (result == TestResourceHandlerWrapper::Result::CALLBACK_PENDING)
915 break; 844 break;
845 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME, result);
846
916 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 847 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
917 } 848 }
918 849
919 while (true) { 850 while (true) {
920 char buf[16]; 851 char buf[16];
921 uint32_t read_size = sizeof(buf); 852 uint32_t read_size = sizeof(buf);
922 MojoResult result = 853 MojoResult result =
923 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, 854 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size,
924 MOJO_READ_DATA_FLAG_NONE); 855 MOJO_READ_DATA_FLAG_NONE);
925 if (result == MOJO_RESULT_SHOULD_WAIT) 856 if (result == MOJO_RESULT_SHOULD_WAIT)
926 break; 857 break;
927 ASSERT_EQ(MOJO_RESULT_OK, result); 858 ASSERT_EQ(MOJO_RESULT_OK, result);
928 } 859 }
929 860
930 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); 861 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT);
931 resource_controller_.RunUntilCancelWithErrorCalled(); 862 handler_wrapper_->RunUntilCanceled();
932 EXPECT_FALSE(url_loader_client_.has_received_completion()); 863 EXPECT_FALSE(url_loader_client_.has_received_completion());
933 EXPECT_TRUE(resource_controller_.is_cancel_with_error_called()); 864 EXPECT_EQ(TestResourceHandlerWrapper::Result::CANCEL,
934 EXPECT_EQ(net::ERR_FAILED, resource_controller_.error()); 865 handler_wrapper_->last_result());
866 EXPECT_EQ(net::ERR_FAILED, handler_wrapper_->net_error());
935 } 867 }
936 868
937 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, 869 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest,
938 OnWillReadWithLongContents) { 870 OnWillReadWithLongContents) {
939 bool defer = false;
940 scoped_refptr<net::IOBuffer> io_buffer; 871 scoped_refptr<net::IOBuffer> io_buffer;
941 int io_buffer_size = 0; 872 int io_buffer_size = 0;
942 873
943 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 874 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
944 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 875 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
945 ASSERT_TRUE(io_buffer); 876 ASSERT_TRUE(io_buffer);
946 // The io_buffer size that the mime sniffer requires implicitly. 877 // The io_buffer size that the mime sniffer requires implicitly.
947 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); 878 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead);
948 std::string expected; 879 std::string expected;
949 for (int i = 0; i < 3 * io_buffer_size + 2; ++i) 880 for (int i = 0; i < 3 * io_buffer_size + 2; ++i)
950 expected += ('A' + i % 26); 881 expected += ('A' + i % 26);
951 882
952 ASSERT_TRUE(handler_->OnReadCompleted(0, &defer)); 883 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
953 ASSERT_FALSE(defer); 884 handler_wrapper_->OnReadCompleted(0));
954 885
955 url_loader_client_.RunUntilResponseBodyArrived(); 886 url_loader_client_.RunUntilResponseBodyArrived();
956 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 887 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
957 888
958 size_t written = 0; 889 size_t written = 0;
959 std::string actual; 890 std::string actual;
960 while (actual.size() < expected.size()) { 891 while (actual.size() < expected.size()) {
961 while (written < expected.size() && !defer) { 892 while (written < expected.size() &&
893 handler_wrapper_->last_result() ==
894 TestResourceHandlerWrapper::Result::RESUME) {
962 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 895 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
963 const size_t to_be_written = std::min(static_cast<size_t>(io_buffer_size), 896 const size_t to_be_written = std::min(static_cast<size_t>(io_buffer_size),
964 expected.size() - written); 897 expected.size() - written);
965 memcpy(io_buffer->data(), &expected[written], to_be_written); 898 memcpy(io_buffer->data(), &expected[written], to_be_written);
966 ASSERT_TRUE(handler_->OnReadCompleted(to_be_written, &defer)); 899
900 // Request should be resumed or paused.
901 ASSERT_NE(TestResourceHandlerWrapper::Result::CANCEL,
902 handler_wrapper_->OnReadCompleted(to_be_written));
903
967 written += to_be_written; 904 written += to_be_written;
968 } 905 }
969 906
970 char buf[16]; 907 char buf[16];
971 uint32_t read_size = sizeof(buf); 908 uint32_t read_size = sizeof(buf);
972 MojoResult result = 909 MojoResult result =
973 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, 910 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size,
974 MOJO_READ_DATA_FLAG_NONE); 911 MOJO_READ_DATA_FLAG_NONE);
975 if (result != MOJO_RESULT_SHOULD_WAIT) { 912 if (result != MOJO_RESULT_SHOULD_WAIT) {
976 ASSERT_EQ(MOJO_RESULT_OK, result); 913 ASSERT_EQ(MOJO_RESULT_OK, result);
977 actual.append(buf, read_size); 914 actual.append(buf, read_size);
978 } 915 }
979 int resume_count = resource_controller_.num_resume_calls(); 916
917 // Give mojo a chance pass data back and forth, and to request more data
918 // from the handler.
980 base::RunLoop().RunUntilIdle(); 919 base::RunLoop().RunUntilIdle();
981 // Continue writing if controller->Resume() is called.
982 defer = (resume_count == resource_controller_.num_resume_calls());
983 } 920 }
984 EXPECT_EQ(expected, actual); 921 EXPECT_EQ(expected, actual);
985 } 922 }
986 923
987 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, 924 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest,
988 BeginWriteFailsOnReadCompleted) { 925 BeginWriteFailsOnReadCompleted) {
989 scoped_refptr<net::IOBuffer> io_buffer; 926 scoped_refptr<net::IOBuffer> io_buffer;
990 int io_buffer_size = 0; 927 int io_buffer_size = 0;
991 bool defer = false;
992 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 928 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
993 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 929 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
994 930
995 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); 931 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN);
996 ASSERT_FALSE(handler_->OnReadCompleted(io_buffer_size, &defer)); 932 ASSERT_EQ(TestResourceHandlerWrapper::Result::CANCEL,
933 handler_wrapper_->OnReadCompleted(io_buffer_size));
997 } 934 }
998 935
999 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, 936 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest,
1000 BeginWriteReturnsShouldWaitOnReadCompleted) { 937 BeginWriteReturnsShouldWaitOnReadCompleted) {
1001 scoped_refptr<net::IOBuffer> io_buffer; 938 scoped_refptr<net::IOBuffer> io_buffer;
1002 int io_buffer_size = 0; 939 int io_buffer_size = 0;
1003 bool defer = false;
1004 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 940 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
1005 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 941 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
1006 942
1007 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); 943 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT);
1008 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); 944 ASSERT_EQ(TestResourceHandlerWrapper::Result::CALLBACK_PENDING,
1009 EXPECT_TRUE(defer); 945 handler_wrapper_->OnReadCompleted(io_buffer_size));
1010 } 946 }
1011 947
1012 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, 948 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest,
1013 BeginWriteFailsOnResume) { 949 BeginWriteFailsOnResume) {
1014 bool defer = false;
1015 int io_buffer_size = 0; 950 int io_buffer_size = 0;
1016 scoped_refptr<net::IOBuffer> io_buffer; 951 scoped_refptr<net::IOBuffer> io_buffer;
1017 952
1018 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 953 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
1019 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 954 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
1020 ASSERT_TRUE(handler_->OnReadCompleted(0, &defer)); 955 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1021 ASSERT_FALSE(defer); 956 handler_wrapper_->OnReadCompleted(0));
1022 url_loader_client_.RunUntilResponseBodyArrived(); 957 url_loader_client_.RunUntilResponseBodyArrived();
1023 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 958 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
1024 959
1025 while (!defer) { 960 while (true) {
1026 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 961 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
1027 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); 962 TestResourceHandlerWrapper::Result result =
963 handler_wrapper_->OnReadCompleted(io_buffer_size);
964 if (result == TestResourceHandlerWrapper::Result::CALLBACK_PENDING)
965 break;
966 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME, result);
1028 } 967 }
1029 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); 968 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN);
1030 969
1031 while (!resource_controller_.is_cancel_with_error_called()) { 970 while (handler_wrapper_->last_result() !=
971 TestResourceHandlerWrapper::Result::CANCEL) {
1032 char buf[256]; 972 char buf[256];
1033 uint32_t read_size = sizeof(buf); 973 uint32_t read_size = sizeof(buf);
1034 MojoResult result = 974 MojoResult result =
1035 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, 975 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size,
1036 MOJO_READ_DATA_FLAG_NONE); 976 MOJO_READ_DATA_FLAG_NONE);
1037 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); 977 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT);
1038 base::RunLoop().RunUntilIdle(); 978 base::RunLoop().RunUntilIdle();
1039 } 979 }
1040 980
1041 EXPECT_FALSE(url_loader_client_.has_received_completion()); 981 EXPECT_FALSE(url_loader_client_.has_received_completion());
1042 EXPECT_EQ(net::ERR_FAILED, resource_controller_.error()); 982 EXPECT_EQ(net::ERR_FAILED, handler_wrapper_->net_error());
1043 EXPECT_EQ(0, resource_controller_.num_resume_calls());
1044 } 983 }
1045 984
1046 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, CancelWhileWaiting) { 985 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, CancelWhileWaiting) {
1047 bool defer = false;
1048 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); 986 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
1049 987
1050 while (!defer) { 988 while (true) {
1051 scoped_refptr<net::IOBuffer> io_buffer; 989 scoped_refptr<net::IOBuffer> io_buffer;
1052 int io_buffer_size = 0; 990 int io_buffer_size = 0;
1053 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 991 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
1054 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); 992 TestResourceHandlerWrapper::Result result =
993 handler_wrapper_->OnReadCompleted(io_buffer_size);
994 if (result == TestResourceHandlerWrapper::Result::CALLBACK_PENDING)
995 break;
996 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME, result);
1055 } 997 }
1056 998
1057 url_loader_client_.RunUntilResponseBodyArrived(); 999 url_loader_client_.RunUntilResponseBodyArrived();
1058 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 1000 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
1059 1001
1060 defer = false;
1061 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, 1002 net::URLRequestStatus status(net::URLRequestStatus::CANCELED,
1062 net::ERR_ABORTED); 1003 net::ERR_ABORTED);
1063 handler_->OnResponseCompleted(status, &defer); 1004 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1005 handler_wrapper_->OnResponseCompletedForOutOfBandCancel(status));
1064 1006
1065 ASSERT_FALSE(url_loader_client_.has_received_completion()); 1007 ASSERT_FALSE(url_loader_client_.has_received_completion());
1066 url_loader_client_.RunUntilComplete(); 1008 url_loader_client_.RunUntilComplete();
1067 EXPECT_EQ(net::ERR_ABORTED, 1009 EXPECT_EQ(net::ERR_ABORTED,
1068 url_loader_client_.completion_status().error_code); 1010 url_loader_client_.completion_status().error_code);
1069 1011
1070 while (true) { 1012 while (true) {
1071 char buffer[16]; 1013 char buffer[16];
1072 uint32_t read_size = sizeof(buffer); 1014 uint32_t read_size = sizeof(buffer);
1073 MojoResult result = 1015 MojoResult result =
1074 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, 1016 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer,
1075 &read_size, MOJO_READ_DATA_FLAG_NONE); 1017 &read_size, MOJO_READ_DATA_FLAG_NONE);
1076 if (result == MOJO_RESULT_FAILED_PRECONDITION) 1018 if (result == MOJO_RESULT_FAILED_PRECONDITION)
1077 break; 1019 break;
1078 base::RunLoop().RunUntilIdle(); 1020 base::RunLoop().RunUntilIdle();
1079 DCHECK(result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_OK); 1021 DCHECK(result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_OK);
1080 } 1022 }
1081 1023
1082 base::RunLoop().RunUntilIdle(); 1024 base::RunLoop().RunUntilIdle();
1083 EXPECT_EQ(0, resource_controller_.num_resume_calls());
1084 } 1025 }
1085 1026
1086 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, RedirectHandling) { 1027 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, RedirectHandling) {
1087 rdh_delegate_.set_num_on_response_started_calls_expectation(1); 1028 rdh_delegate_.set_num_on_response_started_calls_expectation(1);
1088 bool defer = false;
1089 1029
1090 ASSERT_TRUE(handler_->OnWillStart(request_->url(), &defer)); 1030 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1091 ASSERT_FALSE(defer); 1031 handler_wrapper_->OnWillStart(request_->url()));
1032
1092 scoped_refptr<ResourceResponse> response = new ResourceResponse(); 1033 scoped_refptr<ResourceResponse> response = new ResourceResponse();
1093 net::RedirectInfo redirect_info; 1034 net::RedirectInfo redirect_info;
1094 redirect_info.status_code = 301; 1035 redirect_info.status_code = 301;
1095 ASSERT_TRUE( 1036 ASSERT_EQ(
1096 handler_->OnRequestRedirected(redirect_info, response.get(), &defer)); 1037 TestResourceHandlerWrapper::Result::CALLBACK_PENDING,
1097 ASSERT_TRUE(defer); 1038 handler_wrapper_->OnRequestRedirected(redirect_info, response.get()));
1098 1039
1099 ASSERT_FALSE(url_loader_client_.has_received_response()); 1040 ASSERT_FALSE(url_loader_client_.has_received_response());
1100 ASSERT_FALSE(url_loader_client_.has_received_redirect()); 1041 ASSERT_FALSE(url_loader_client_.has_received_redirect());
1101 url_loader_client_.RunUntilRedirectReceived(); 1042 url_loader_client_.RunUntilRedirectReceived();
1102 1043
1103 ASSERT_FALSE(url_loader_client_.has_received_response()); 1044 ASSERT_FALSE(url_loader_client_.has_received_response());
1104 ASSERT_TRUE(url_loader_client_.has_received_redirect()); 1045 ASSERT_TRUE(url_loader_client_.has_received_redirect());
1105 EXPECT_EQ(301, url_loader_client_.redirect_info().status_code); 1046 EXPECT_EQ(301, url_loader_client_.redirect_info().status_code);
1106 1047
1107 EXPECT_EQ(0, resource_controller_.num_resume_calls()); 1048 ASSERT_EQ(TestResourceHandlerWrapper::Result::CALLBACK_PENDING,
1049 handler_wrapper_->last_result());
1108 handler_->FollowRedirect(); 1050 handler_->FollowRedirect();
1109 EXPECT_EQ(1, resource_controller_.num_resume_calls()); 1051 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1052 handler_wrapper_->last_result());
1110 1053
1111 url_loader_client_.ClearHasReceivedRedirect(); 1054 url_loader_client_.ClearHasReceivedRedirect();
1112 // Redirect once more. 1055 // Redirect once more.
1113 defer = false;
1114 redirect_info.status_code = 302; 1056 redirect_info.status_code = 302;
1115 ASSERT_TRUE( 1057 ASSERT_EQ(
1116 handler_->OnRequestRedirected(redirect_info, response.get(), &defer)); 1058 TestResourceHandlerWrapper::Result::CALLBACK_PENDING,
1117 ASSERT_TRUE(defer); 1059 handler_wrapper_->OnRequestRedirected(redirect_info, response.get()));
1118 1060
1119 ASSERT_FALSE(url_loader_client_.has_received_response()); 1061 ASSERT_FALSE(url_loader_client_.has_received_response());
1120 ASSERT_FALSE(url_loader_client_.has_received_redirect()); 1062 ASSERT_FALSE(url_loader_client_.has_received_redirect());
1121 url_loader_client_.RunUntilRedirectReceived(); 1063 url_loader_client_.RunUntilRedirectReceived();
1122 1064
1123 ASSERT_FALSE(url_loader_client_.has_received_response()); 1065 ASSERT_FALSE(url_loader_client_.has_received_response());
1124 ASSERT_TRUE(url_loader_client_.has_received_redirect()); 1066 ASSERT_TRUE(url_loader_client_.has_received_redirect());
1125 EXPECT_EQ(302, url_loader_client_.redirect_info().status_code); 1067 EXPECT_EQ(302, url_loader_client_.redirect_info().status_code);
1126 1068
1127 EXPECT_EQ(1, resource_controller_.num_resume_calls()); 1069 ASSERT_EQ(TestResourceHandlerWrapper::Result::CALLBACK_PENDING,
1070 handler_wrapper_->last_result());
1128 handler_->FollowRedirect(); 1071 handler_->FollowRedirect();
1129 EXPECT_EQ(2, resource_controller_.num_resume_calls()); 1072 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1073 handler_wrapper_->last_result());
1130 1074
1131 // Give the final response. 1075 // Give the final response.
1132 defer = false; 1076 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1133 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); 1077 handler_wrapper_->OnResponseStarted(response.get()));
1134 ASSERT_FALSE(defer);
1135 1078
1136 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); 1079 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK);
1137 handler_->OnResponseCompleted(status, &defer); 1080 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1138 ASSERT_FALSE(defer); 1081 handler_wrapper_->OnResponseCompleted(status));
1139 1082
1140 ASSERT_FALSE(url_loader_client_.has_received_completion()); 1083 ASSERT_FALSE(url_loader_client_.has_received_completion());
1141 url_loader_client_.RunUntilComplete(); 1084 url_loader_client_.RunUntilComplete();
1142 1085
1143 ASSERT_TRUE(url_loader_client_.has_received_response()); 1086 ASSERT_TRUE(url_loader_client_.has_received_response());
1144 ASSERT_TRUE(url_loader_client_.has_received_completion()); 1087 ASSERT_TRUE(url_loader_client_.has_received_completion());
1145 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); 1088 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
1146 } 1089 }
1147 1090
1091 // Test the case where th other process tells the ResourceHandler to follow a
1092 // redirect, despite the fact that no redirect has been received yet.
1148 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, 1093 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest,
1149 MalformedFollowRedirectRequest) { 1094 MalformedFollowRedirectRequest) {
1150 handler_->FollowRedirect(); 1095 handler_->FollowRedirect();
1151 1096
1152 EXPECT_TRUE(handler_->has_received_bad_message()); 1097 EXPECT_TRUE(handler_->has_received_bad_message());
1153 EXPECT_EQ(0, resource_controller_.num_resume_calls());
1154 } 1098 }
1155 1099
1156 // Typically ResourceHandler methods are called in this order. 1100 // Typically ResourceHandler methods are called in this order.
1157 TEST_P( 1101 TEST_P(
1158 MojoAsyncResourceHandlerWithAllocationSizeTest, 1102 MojoAsyncResourceHandlerWithAllocationSizeTest,
1159 OnWillStartThenOnResponseStartedThenOnWillReadThenOnReadCompletedThenOnRespo nseCompleted) { 1103 OnWillStartThenOnResponseStartedThenOnWillReadThenOnReadCompletedThenOnRespo nseCompleted) {
1160 rdh_delegate_.set_num_on_response_started_calls_expectation(1); 1104 rdh_delegate_.set_num_on_response_started_calls_expectation(1);
1161 bool defer = false;
1162 1105
1163 ASSERT_TRUE(handler_->OnWillStart(request_->url(), &defer)); 1106 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1164 ASSERT_FALSE(defer); 1107 handler_wrapper_->OnWillStart(request_->url()));
1165 scoped_refptr<ResourceResponse> response = new ResourceResponse(); 1108 scoped_refptr<ResourceResponse> response = new ResourceResponse();
1166 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); 1109 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1167 ASSERT_FALSE(defer); 1110 handler_wrapper_->OnResponseStarted(response.get()));
1168 1111
1169 ASSERT_FALSE(url_loader_client_.has_received_response()); 1112 ASSERT_FALSE(url_loader_client_.has_received_response());
1170 url_loader_client_.RunUntilResponseReceived(); 1113 url_loader_client_.RunUntilResponseReceived();
1171 1114
1172 int io_buffer_size = 0; 1115 int io_buffer_size = 0;
1173 scoped_refptr<net::IOBuffer> io_buffer; 1116 scoped_refptr<net::IOBuffer> io_buffer;
1174 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 1117 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
1175 ASSERT_TRUE(io_buffer); 1118 ASSERT_TRUE(io_buffer);
1176 ASSERT_GT(io_buffer_size, 0); 1119 ASSERT_GT(io_buffer_size, 0);
1177 io_buffer->data()[0] = 'A'; 1120 io_buffer->data()[0] = 'A';
1178 1121
1179 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); 1122 ASSERT_FALSE(url_loader_client_.response_body().is_valid());
1180 url_loader_client_.RunUntilResponseBodyArrived(); 1123 url_loader_client_.RunUntilResponseBodyArrived();
1181 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 1124 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
1182 1125
1183 ASSERT_TRUE(handler_->OnReadCompleted(1, &defer)); 1126 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1184 ASSERT_FALSE(defer); 1127 handler_wrapper_->OnReadCompleted(1));
1185 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); 1128 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK);
1186 handler_->OnResponseCompleted(status, &defer); 1129 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1187 ASSERT_FALSE(defer); 1130 handler_wrapper_->OnResponseCompleted(status));
1188 1131
1189 ASSERT_FALSE(url_loader_client_.has_received_completion()); 1132 ASSERT_FALSE(url_loader_client_.has_received_completion());
1190 url_loader_client_.RunUntilComplete(); 1133 url_loader_client_.RunUntilComplete();
1191 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); 1134 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
1192 1135
1193 // This is needed because |*io_buffer| may keep the data producer alive. 1136 // This is needed because |*io_buffer| may keep the data producer alive.
1194 io_buffer = nullptr; 1137 io_buffer = nullptr;
1195 1138
1196 std::string body; 1139 std::string body;
1197 while (true) { 1140 while (true) {
(...skipping 12 matching lines...) Expand all
1210 } 1153 }
1211 } 1154 }
1212 EXPECT_EQ("A", body); 1155 EXPECT_EQ("A", body);
1213 } 1156 }
1214 1157
1215 // MimeResourceHandler calls delegated ResourceHandler's methods in this order. 1158 // MimeResourceHandler calls delegated ResourceHandler's methods in this order.
1216 TEST_P( 1159 TEST_P(
1217 MojoAsyncResourceHandlerWithAllocationSizeTest, 1160 MojoAsyncResourceHandlerWithAllocationSizeTest,
1218 OnWillStartThenOnWillReadThenOnResponseStartedThenOnReadCompletedThenOnRespo nseCompleted) { 1161 OnWillStartThenOnWillReadThenOnResponseStartedThenOnReadCompletedThenOnRespo nseCompleted) {
1219 rdh_delegate_.set_num_on_response_started_calls_expectation(1); 1162 rdh_delegate_.set_num_on_response_started_calls_expectation(1);
1220 bool defer = false;
1221 1163
1222 ASSERT_TRUE(handler_->OnWillStart(request_->url(), &defer)); 1164 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1223 ASSERT_FALSE(defer); 1165 handler_wrapper_->OnWillStart(request_->url()));
1224 1166
1225 int io_buffer_size = 0; 1167 int io_buffer_size = 0;
1226 scoped_refptr<net::IOBuffer> io_buffer; 1168 scoped_refptr<net::IOBuffer> io_buffer;
1227 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); 1169 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1));
1228 ASSERT_TRUE(io_buffer); 1170 ASSERT_TRUE(io_buffer);
1229 ASSERT_GT(io_buffer_size, 0); 1171 ASSERT_GT(io_buffer_size, 0);
1230 io_buffer->data()[0] = 'B'; 1172 io_buffer->data()[0] = 'B';
1231 1173
1232 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); 1174 ASSERT_FALSE(url_loader_client_.response_body().is_valid());
1233 url_loader_client_.RunUntilResponseBodyArrived(); 1175 url_loader_client_.RunUntilResponseBodyArrived();
1234 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); 1176 ASSERT_TRUE(url_loader_client_.response_body().is_valid());
1235 1177
1236 scoped_refptr<ResourceResponse> response = new ResourceResponse(); 1178 scoped_refptr<ResourceResponse> response = new ResourceResponse();
1237 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); 1179 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1238 ASSERT_FALSE(defer); 1180 handler_wrapper_->OnResponseStarted(response.get()));
1239 1181
1240 ASSERT_FALSE(url_loader_client_.has_received_response()); 1182 ASSERT_FALSE(url_loader_client_.has_received_response());
1241 url_loader_client_.RunUntilResponseReceived(); 1183 url_loader_client_.RunUntilResponseReceived();
1242 1184
1243 ASSERT_TRUE(handler_->OnReadCompleted(1, &defer)); 1185 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1244 ASSERT_FALSE(defer); 1186 handler_wrapper_->OnReadCompleted(1));
1245 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); 1187 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK);
1246 handler_->OnResponseCompleted(status, &defer); 1188 ASSERT_EQ(TestResourceHandlerWrapper::Result::RESUME,
1247 ASSERT_FALSE(defer); 1189 handler_wrapper_->OnResponseCompleted(status));
1248 1190
1249 ASSERT_FALSE(url_loader_client_.has_received_completion()); 1191 ASSERT_FALSE(url_loader_client_.has_received_completion());
1250 url_loader_client_.RunUntilComplete(); 1192 url_loader_client_.RunUntilComplete();
1251 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); 1193 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
1252 1194
1253 // This is needed because |*io_buffer| may keep the data producer alive. 1195 // This is needed because |*io_buffer| may keep the data producer alive.
1254 io_buffer = nullptr; 1196 io_buffer = nullptr;
1255 1197
1256 std::string body; 1198 std::string body;
1257 while (true) { 1199 while (true) {
(...skipping 12 matching lines...) Expand all
1270 } 1212 }
1271 } 1213 }
1272 EXPECT_EQ("B", body); 1214 EXPECT_EQ("B", body);
1273 } 1215 }
1274 1216
1275 INSTANTIATE_TEST_CASE_P(MojoAsyncResourceHandlerWithAllocationSizeTest, 1217 INSTANTIATE_TEST_CASE_P(MojoAsyncResourceHandlerWithAllocationSizeTest,
1276 MojoAsyncResourceHandlerWithAllocationSizeTest, 1218 MojoAsyncResourceHandlerWithAllocationSizeTest,
1277 ::testing::Values(8, 32 * 2014)); 1219 ::testing::Values(8, 32 * 2014));
1278 } // namespace 1220 } // namespace
1279 } // namespace content 1221 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698