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

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

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

Powered by Google App Engine
This is Rietveld 408576698