OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "net/proxy/proxy_resolver_mojo.h" | 5 #include "net/proxy/proxy_resolver_mojo.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <map> | 8 #include <map> |
9 #include <queue> | 9 #include <queue> |
10 #include <string> | 10 #include <string> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
14 #include "base/memory/scoped_vector.h" | 14 #include "base/memory/scoped_vector.h" |
15 #include "base/run_loop.h" | 15 #include "base/run_loop.h" |
16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
17 #include "mojo/common/common_type_converters.h" | 17 #include "mojo/common/common_type_converters.h" |
18 #include "net/base/net_errors.h" | 18 #include "net/base/net_errors.h" |
19 #include "net/base/test_completion_callback.h" | 19 #include "net/base/test_completion_callback.h" |
20 #include "net/log/net_log.h" | 20 #include "net/log/net_log.h" |
| 21 #include "net/proxy/mojo_proxy_resolver_factory.h" |
21 #include "net/proxy/mojo_proxy_type_converters.h" | 22 #include "net/proxy/mojo_proxy_type_converters.h" |
22 #include "net/proxy/proxy_info.h" | 23 #include "net/proxy/proxy_info.h" |
23 #include "net/proxy/proxy_resolver_script_data.h" | 24 #include "net/proxy/proxy_resolver_script_data.h" |
24 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
25 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" | 26 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" |
26 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" | 27 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" |
27 #include "url/gurl.h" | 28 #include "url/gurl.h" |
28 | 29 |
29 namespace net { | 30 namespace net { |
30 | 31 |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 break; | 396 break; |
396 case CreateProxyResolverAction::WAIT_FOR_CLIENT_DISCONNECT: | 397 case CreateProxyResolverAction::WAIT_FOR_CLIENT_DISCONNECT: |
397 ASSERT_FALSE(client.WaitForIncomingMethodCall()); | 398 ASSERT_FALSE(client.WaitForIncomingMethodCall()); |
398 break; | 399 break; |
399 } | 400 } |
400 WakeWaiter(); | 401 WakeWaiter(); |
401 } | 402 } |
402 | 403 |
403 } // namespace | 404 } // namespace |
404 | 405 |
405 class ProxyResolverMojoTest : public testing::Test { | 406 class ProxyResolverMojoTest : public testing::Test, |
| 407 public MojoProxyResolverFactory { |
406 public: | 408 public: |
407 void SetUp() override { | 409 void SetUp() override { |
408 mock_proxy_resolver_factory_.reset(new MockMojoProxyResolverFactory( | 410 mock_proxy_resolver_factory_.reset(new MockMojoProxyResolverFactory( |
409 &mock_proxy_resolver_, mojo::GetProxy(&factory_ptr_))); | 411 &mock_proxy_resolver_, mojo::GetProxy(&factory_ptr_))); |
410 proxy_resolver_factory_mojo_.reset( | 412 proxy_resolver_factory_mojo_.reset( |
411 new ProxyResolverFactoryMojo(factory_ptr_.get(), nullptr)); | 413 new ProxyResolverFactoryMojo(this, nullptr)); |
412 } | 414 } |
413 | 415 |
414 scoped_ptr<Request> MakeRequest(const GURL& url) { | 416 scoped_ptr<Request> MakeRequest(const GURL& url) { |
415 return make_scoped_ptr(new Request(proxy_resolver_mojo_.get(), url)); | 417 return make_scoped_ptr(new Request(proxy_resolver_mojo_.get(), url)); |
416 } | 418 } |
417 | 419 |
| 420 scoped_ptr<base::ScopedClosureRunner> CreateResolver( |
| 421 const mojo::String& pac_script, |
| 422 mojo::InterfaceRequest<interfaces::ProxyResolver> req, |
| 423 interfaces::HostResolverPtr host_resolver, |
| 424 interfaces::ProxyResolverFactoryRequestClientPtr client) override { |
| 425 factory_ptr_->CreateResolver(pac_script, req.Pass(), host_resolver.Pass(), |
| 426 client.Pass()); |
| 427 return make_scoped_ptr( |
| 428 new base::ScopedClosureRunner(on_delete_callback_.closure())); |
| 429 } |
| 430 |
418 mojo::Array<interfaces::ProxyServerPtr> ProxyServersFromPacString( | 431 mojo::Array<interfaces::ProxyServerPtr> ProxyServersFromPacString( |
419 const std::string& pac_string) { | 432 const std::string& pac_string) { |
420 ProxyInfo proxy_info; | 433 ProxyInfo proxy_info; |
421 proxy_info.UsePacString(pac_string); | 434 proxy_info.UsePacString(pac_string); |
422 | 435 |
423 return mojo::Array<interfaces::ProxyServerPtr>::From( | 436 return mojo::Array<interfaces::ProxyServerPtr>::From( |
424 proxy_info.proxy_list().GetAll()); | 437 proxy_info.proxy_list().GetAll()); |
425 } | 438 } |
426 | 439 |
427 void CreateProxyResolver() { | 440 void CreateProxyResolver() { |
428 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( | 441 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( |
429 CreateProxyResolverAction::ReturnResult(kScriptData, OK)); | 442 CreateProxyResolverAction::ReturnResult(kScriptData, OK)); |
430 TestCompletionCallback callback; | 443 TestCompletionCallback callback; |
431 scoped_refptr<ProxyResolverScriptData> pac_script( | 444 scoped_refptr<ProxyResolverScriptData> pac_script( |
432 ProxyResolverScriptData::FromUTF8(kScriptData)); | 445 ProxyResolverScriptData::FromUTF8(kScriptData)); |
433 scoped_ptr<ProxyResolverFactory::Request> request; | 446 scoped_ptr<ProxyResolverFactory::Request> request; |
434 ASSERT_EQ( | 447 ASSERT_EQ( |
435 OK, | 448 OK, |
436 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( | 449 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( |
437 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); | 450 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); |
438 EXPECT_TRUE(request); | 451 EXPECT_TRUE(request); |
439 ASSERT_TRUE(proxy_resolver_mojo_); | 452 ASSERT_TRUE(proxy_resolver_mojo_); |
440 } | 453 } |
441 | 454 |
| 455 void DeleteProxyResolverCallback(const CompletionCallback& callback, |
| 456 int result) { |
| 457 proxy_resolver_mojo_.reset(); |
| 458 callback.Run(result); |
| 459 } |
| 460 |
442 scoped_ptr<MockMojoProxyResolverFactory> mock_proxy_resolver_factory_; | 461 scoped_ptr<MockMojoProxyResolverFactory> mock_proxy_resolver_factory_; |
443 interfaces::ProxyResolverFactoryPtr factory_ptr_; | 462 interfaces::ProxyResolverFactoryPtr factory_ptr_; |
444 scoped_ptr<ProxyResolverFactory> proxy_resolver_factory_mojo_; | 463 scoped_ptr<ProxyResolverFactory> proxy_resolver_factory_mojo_; |
445 | 464 |
446 MockMojoProxyResolver mock_proxy_resolver_; | 465 MockMojoProxyResolver mock_proxy_resolver_; |
447 scoped_ptr<ProxyResolver> proxy_resolver_mojo_; | 466 scoped_ptr<ProxyResolver> proxy_resolver_mojo_; |
| 467 TestClosure on_delete_callback_; |
448 }; | 468 }; |
449 | 469 |
450 TEST_F(ProxyResolverMojoTest, CreateProxyResolver) { | 470 TEST_F(ProxyResolverMojoTest, CreateProxyResolver) { |
451 CreateProxyResolver(); | 471 CreateProxyResolver(); |
452 } | 472 } |
453 | 473 |
454 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_Empty) { | 474 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_Empty) { |
455 TestCompletionCallback callback; | 475 TestCompletionCallback callback; |
456 scoped_refptr<ProxyResolverScriptData> pac_script( | 476 scoped_refptr<ProxyResolverScriptData> pac_script( |
457 ProxyResolverScriptData::FromUTF8("")); | 477 ProxyResolverScriptData::FromUTF8("")); |
(...skipping 24 matching lines...) Expand all Loading... |
482 | 502 |
483 TestCompletionCallback callback; | 503 TestCompletionCallback callback; |
484 scoped_refptr<ProxyResolverScriptData> pac_script( | 504 scoped_refptr<ProxyResolverScriptData> pac_script( |
485 ProxyResolverScriptData::FromUTF8(kScriptData)); | 505 ProxyResolverScriptData::FromUTF8(kScriptData)); |
486 scoped_ptr<ProxyResolverFactory::Request> request; | 506 scoped_ptr<ProxyResolverFactory::Request> request; |
487 EXPECT_EQ( | 507 EXPECT_EQ( |
488 ERR_PAC_STATUS_NOT_OK, | 508 ERR_PAC_STATUS_NOT_OK, |
489 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( | 509 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( |
490 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); | 510 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); |
491 EXPECT_TRUE(request); | 511 EXPECT_TRUE(request); |
| 512 on_delete_callback_.WaitForResult(); |
492 | 513 |
493 // A second attempt succeeds. | 514 // A second attempt succeeds. |
494 CreateProxyResolver(); | 515 CreateProxyResolver(); |
495 } | 516 } |
496 | 517 |
497 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_BothDisconnected) { | 518 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_BothDisconnected) { |
498 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( | 519 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( |
499 CreateProxyResolverAction::DropBoth(kScriptData)); | 520 CreateProxyResolverAction::DropBoth(kScriptData)); |
500 | 521 |
501 scoped_refptr<ProxyResolverScriptData> pac_script( | 522 scoped_refptr<ProxyResolverScriptData> pac_script( |
(...skipping 28 matching lines...) Expand all Loading... |
530 | 551 |
531 scoped_refptr<ProxyResolverScriptData> pac_script( | 552 scoped_refptr<ProxyResolverScriptData> pac_script( |
532 ProxyResolverScriptData::FromUTF8(kScriptData)); | 553 ProxyResolverScriptData::FromUTF8(kScriptData)); |
533 scoped_ptr<ProxyResolverFactory::Request> request; | 554 scoped_ptr<ProxyResolverFactory::Request> request; |
534 TestCompletionCallback callback; | 555 TestCompletionCallback callback; |
535 EXPECT_EQ( | 556 EXPECT_EQ( |
536 ERR_PAC_SCRIPT_TERMINATED, | 557 ERR_PAC_SCRIPT_TERMINATED, |
537 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( | 558 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( |
538 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); | 559 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); |
539 EXPECT_TRUE(request); | 560 EXPECT_TRUE(request); |
| 561 on_delete_callback_.WaitForResult(); |
540 } | 562 } |
541 | 563 |
542 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_Cancel) { | 564 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_Cancel) { |
543 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( | 565 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( |
544 CreateProxyResolverAction::WaitForClientDisconnect(kScriptData)); | 566 CreateProxyResolverAction::WaitForClientDisconnect(kScriptData)); |
545 | 567 |
546 scoped_refptr<ProxyResolverScriptData> pac_script( | 568 scoped_refptr<ProxyResolverScriptData> pac_script( |
547 ProxyResolverScriptData::FromUTF8(kScriptData)); | 569 ProxyResolverScriptData::FromUTF8(kScriptData)); |
548 scoped_ptr<ProxyResolverFactory::Request> request; | 570 scoped_ptr<ProxyResolverFactory::Request> request; |
549 TestCompletionCallback callback; | 571 TestCompletionCallback callback; |
550 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_factory_mojo_->CreateProxyResolver( | 572 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_factory_mojo_->CreateProxyResolver( |
551 pac_script, &proxy_resolver_mojo_, | 573 pac_script, &proxy_resolver_mojo_, |
552 callback.callback(), &request)); | 574 callback.callback(), &request)); |
553 ASSERT_TRUE(request); | 575 ASSERT_TRUE(request); |
554 request.reset(); | 576 request.reset(); |
555 | 577 |
556 // The Mojo request is still made. | 578 // The Mojo request is still made. |
557 mock_proxy_resolver_factory_->WaitForNextRequest(); | 579 mock_proxy_resolver_factory_->WaitForNextRequest(); |
| 580 on_delete_callback_.WaitForResult(); |
558 } | 581 } |
559 | 582 |
560 TEST_F(ProxyResolverMojoTest, GetProxyForURL) { | 583 TEST_F(ProxyResolverMojoTest, GetProxyForURL) { |
561 mock_proxy_resolver_.AddGetProxyAction(GetProxyForUrlAction::ReturnServers( | 584 mock_proxy_resolver_.AddGetProxyAction(GetProxyForUrlAction::ReturnServers( |
562 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); | 585 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); |
563 CreateProxyResolver(); | 586 CreateProxyResolver(); |
564 | 587 |
565 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | 588 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); |
566 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | 589 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); |
567 EXPECT_EQ(OK, request->WaitForResult()); | 590 EXPECT_EQ(OK, request->WaitForResult()); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 mock_proxy_resolver_.AddGetProxyAction( | 689 mock_proxy_resolver_.AddGetProxyAction( |
667 GetProxyForUrlAction::DropRequest(GURL(kExampleUrl))); | 690 GetProxyForUrlAction::DropRequest(GURL(kExampleUrl))); |
668 CreateProxyResolver(); | 691 CreateProxyResolver(); |
669 | 692 |
670 scoped_ptr<Request> request1(MakeRequest(GURL(kExampleUrl))); | 693 scoped_ptr<Request> request1(MakeRequest(GURL(kExampleUrl))); |
671 EXPECT_EQ(ERR_IO_PENDING, request1->Resolve()); | 694 EXPECT_EQ(ERR_IO_PENDING, request1->Resolve()); |
672 | 695 |
673 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request1->WaitForResult()); | 696 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request1->WaitForResult()); |
674 } | 697 } |
675 | 698 |
| 699 TEST_F(ProxyResolverMojoTest, GetProxyForURL_DeleteInCallback) { |
| 700 mock_proxy_resolver_.AddGetProxyAction(GetProxyForUrlAction::ReturnServers( |
| 701 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); |
| 702 CreateProxyResolver(); |
| 703 |
| 704 ProxyInfo results; |
| 705 TestCompletionCallback callback; |
| 706 ProxyResolver::RequestHandle handle; |
| 707 BoundNetLog net_log; |
| 708 EXPECT_EQ(OK, |
| 709 callback.GetResult(proxy_resolver_mojo_->GetProxyForURL( |
| 710 GURL(kExampleUrl), &results, |
| 711 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, |
| 712 base::Unretained(this), callback.callback()), |
| 713 &handle, net_log))); |
| 714 on_delete_callback_.WaitForResult(); |
| 715 } |
| 716 |
| 717 TEST_F(ProxyResolverMojoTest, GetProxyForURL_DeleteInCallbackFromDisconnect) { |
| 718 mock_proxy_resolver_.AddGetProxyAction( |
| 719 GetProxyForUrlAction::Disconnect(GURL(kExampleUrl))); |
| 720 CreateProxyResolver(); |
| 721 |
| 722 ProxyInfo results; |
| 723 TestCompletionCallback callback; |
| 724 ProxyResolver::RequestHandle handle; |
| 725 BoundNetLog net_log; |
| 726 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, |
| 727 callback.GetResult(proxy_resolver_mojo_->GetProxyForURL( |
| 728 GURL(kExampleUrl), &results, |
| 729 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, |
| 730 base::Unretained(this), callback.callback()), |
| 731 &handle, net_log))); |
| 732 on_delete_callback_.WaitForResult(); |
| 733 } |
| 734 |
| 735 TEST_F(ProxyResolverMojoTest, DeleteResolver) { |
| 736 CreateProxyResolver(); |
| 737 proxy_resolver_mojo_.reset(); |
| 738 on_delete_callback_.WaitForResult(); |
| 739 } |
676 } // namespace net | 740 } // namespace net |
OLD | NEW |