| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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_v8_tracing_wrapper.h" | 5 #include "net/proxy/proxy_resolver_v8_tracing_wrapper.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 MockCachingHostResolver host_resolver; | 660 MockCachingHostResolver host_resolver; |
| 661 MockErrorObserver* error_observer = new MockErrorObserver; | 661 MockErrorObserver* error_observer = new MockErrorObserver; |
| 662 | 662 |
| 663 host_resolver.rules()->AddSimulatedFailure("*"); | 663 host_resolver.rules()->AddSimulatedFailure("*"); |
| 664 | 664 |
| 665 scoped_ptr<ProxyResolver> resolver = CreateResolver( | 665 scoped_ptr<ProxyResolver> resolver = CreateResolver( |
| 666 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); | 666 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); |
| 667 | 667 |
| 668 const size_t kNumRequests = 5; | 668 const size_t kNumRequests = 5; |
| 669 ProxyInfo proxy_info[kNumRequests]; | 669 ProxyInfo proxy_info[kNumRequests]; |
| 670 ProxyResolver::RequestHandle request[kNumRequests]; | 670 scoped_ptr<ProxyResolver::Request> request[kNumRequests]; |
| 671 | 671 |
| 672 for (size_t i = 0; i < kNumRequests; ++i) { | 672 for (size_t i = 0; i < kNumRequests; ++i) { |
| 673 int rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info[i], | 673 int rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info[i], |
| 674 base::Bind(&CrashCallback), &request[i], | 674 base::Bind(&CrashCallback), &request[i], |
| 675 BoundNetLog()); | 675 BoundNetLog()); |
| 676 EXPECT_EQ(ERR_IO_PENDING, rv); | 676 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 677 } | 677 } |
| 678 | 678 |
| 679 for (size_t i = 0; i < kNumRequests; ++i) { | 679 for (size_t i = 0; i < kNumRequests; ++i) { |
| 680 resolver->CancelRequest(request[i]); | 680 request[i].reset(); |
| 681 } | 681 } |
| 682 } | 682 } |
| 683 | 683 |
| 684 // Note the execution order for this test can vary. Since multiple | 684 // Note the execution order for this test can vary. Since multiple |
| 685 // threads are involved, the cancellation may be received a different | 685 // threads are involved, the cancellation may be received a different |
| 686 // times. | 686 // times. |
| 687 TEST_F(ProxyResolverV8TracingWrapperTest, CancelSome) { | 687 TEST_F(ProxyResolverV8TracingWrapperTest, CancelSome) { |
| 688 MockCachingHostResolver host_resolver; | 688 MockCachingHostResolver host_resolver; |
| 689 MockErrorObserver* error_observer = new MockErrorObserver; | 689 MockErrorObserver* error_observer = new MockErrorObserver; |
| 690 | 690 |
| 691 host_resolver.rules()->AddSimulatedFailure("*"); | 691 host_resolver.rules()->AddSimulatedFailure("*"); |
| 692 | 692 |
| 693 scoped_ptr<ProxyResolver> resolver = CreateResolver( | 693 scoped_ptr<ProxyResolver> resolver = CreateResolver( |
| 694 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); | 694 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); |
| 695 | 695 |
| 696 ProxyInfo proxy_info1; | 696 ProxyInfo proxy_info1; |
| 697 ProxyInfo proxy_info2; | 697 ProxyInfo proxy_info2; |
| 698 ProxyResolver::RequestHandle request1; | 698 scoped_ptr<ProxyResolver::Request> request1; |
| 699 ProxyResolver::RequestHandle request2; | 699 scoped_ptr<ProxyResolver::Request> request2; |
| 700 TestCompletionCallback callback; | 700 TestCompletionCallback callback; |
| 701 | 701 |
| 702 int rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info1, | 702 int rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info1, |
| 703 base::Bind(&CrashCallback), &request1, | 703 base::Bind(&CrashCallback), &request1, |
| 704 BoundNetLog()); | 704 BoundNetLog()); |
| 705 EXPECT_EQ(ERR_IO_PENDING, rv); | 705 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 706 | 706 |
| 707 rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info2, | 707 rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info2, |
| 708 callback.callback(), &request2, BoundNetLog()); | 708 callback.callback(), &request2, BoundNetLog()); |
| 709 EXPECT_EQ(ERR_IO_PENDING, rv); | 709 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 710 | 710 |
| 711 resolver->CancelRequest(request1); | 711 request1.reset(); |
| 712 | 712 |
| 713 EXPECT_EQ(OK, callback.WaitForResult()); | 713 EXPECT_EQ(OK, callback.WaitForResult()); |
| 714 } | 714 } |
| 715 | 715 |
| 716 // Cancel a request after it has finished running on the worker thread, and has | 716 // Cancel a request after it has finished running on the worker thread, and has |
| 717 // posted a task the completion task back to origin thread. | 717 // posted a task the completion task back to origin thread. |
| 718 TEST_F(ProxyResolverV8TracingWrapperTest, CancelWhilePendingCompletionTask) { | 718 TEST_F(ProxyResolverV8TracingWrapperTest, CancelWhilePendingCompletionTask) { |
| 719 MockCachingHostResolver host_resolver; | 719 MockCachingHostResolver host_resolver; |
| 720 MockErrorObserver* error_observer = new MockErrorObserver; | 720 MockErrorObserver* error_observer = new MockErrorObserver; |
| 721 | 721 |
| 722 host_resolver.rules()->AddSimulatedFailure("*"); | 722 host_resolver.rules()->AddSimulatedFailure("*"); |
| 723 | 723 |
| 724 scoped_ptr<ProxyResolver> resolver = CreateResolver( | 724 scoped_ptr<ProxyResolver> resolver = CreateResolver( |
| 725 nullptr, &host_resolver, make_scoped_ptr(error_observer), "error.js"); | 725 nullptr, &host_resolver, make_scoped_ptr(error_observer), "error.js"); |
| 726 | 726 |
| 727 ProxyInfo proxy_info1; | 727 ProxyInfo proxy_info1; |
| 728 ProxyInfo proxy_info2; | 728 ProxyInfo proxy_info2; |
| 729 ProxyResolver::RequestHandle request1; | 729 scoped_ptr<ProxyResolver::Request> request1; |
| 730 ProxyResolver::RequestHandle request2; | 730 scoped_ptr<ProxyResolver::Request> request2; |
| 731 TestCompletionCallback callback; | 731 TestCompletionCallback callback; |
| 732 | 732 |
| 733 int rv = resolver->GetProxyForURL(GURL("http://throw-an-error/"), | 733 int rv = resolver->GetProxyForURL(GURL("http://throw-an-error/"), |
| 734 &proxy_info1, base::Bind(&CrashCallback), | 734 &proxy_info1, base::Bind(&CrashCallback), |
| 735 &request1, BoundNetLog()); | 735 &request1, BoundNetLog()); |
| 736 EXPECT_EQ(ERR_IO_PENDING, rv); | 736 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 737 | 737 |
| 738 // Wait until the first request has finished running on the worker thread. | 738 // Wait until the first request has finished running on the worker thread. |
| 739 // Cancel the first request, while it has a pending completion task on | 739 // Cancel the first request, while it has a pending completion task on |
| 740 // the origin thread. | 740 // the origin thread. |
| 741 error_observer->RunOnError(base::Bind(&ProxyResolver::CancelRequest, | 741 error_observer->RunOnError( |
| 742 base::Unretained(resolver.get()), | 742 base::Bind(&scoped_ptr<ProxyResolver::Request>::reset, |
| 743 request1)); | 743 base::Unretained(&request1), nullptr)); |
| 744 | 744 |
| 745 // Start another request, to make sure it is able to complete. | 745 // Start another request, to make sure it is able to complete. |
| 746 rv = resolver->GetProxyForURL(GURL("http://i-have-no-idea-what-im-doing/"), | 746 rv = resolver->GetProxyForURL(GURL("http://i-have-no-idea-what-im-doing/"), |
| 747 &proxy_info2, callback.callback(), &request2, | 747 &proxy_info2, callback.callback(), &request2, |
| 748 BoundNetLog()); | 748 BoundNetLog()); |
| 749 EXPECT_EQ(ERR_IO_PENDING, rv); | 749 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 750 | 750 |
| 751 EXPECT_EQ(OK, callback.WaitForResult()); | 751 EXPECT_EQ(OK, callback.WaitForResult()); |
| 752 | 752 |
| 753 EXPECT_EQ("i-approve-this-message:42", proxy_info2.proxy_server().ToURI()); | 753 EXPECT_EQ("i-approve-this-message:42", proxy_info2.proxy_server().ToURI()); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 TEST_F(ProxyResolverV8TracingWrapperTest, | 821 TEST_F(ProxyResolverV8TracingWrapperTest, |
| 822 CancelWhileOutstandingNonBlockingDns) { | 822 CancelWhileOutstandingNonBlockingDns) { |
| 823 BlockableHostResolver host_resolver; | 823 BlockableHostResolver host_resolver; |
| 824 MockErrorObserver* error_observer = new MockErrorObserver; | 824 MockErrorObserver* error_observer = new MockErrorObserver; |
| 825 | 825 |
| 826 scoped_ptr<ProxyResolver> resolver = CreateResolver( | 826 scoped_ptr<ProxyResolver> resolver = CreateResolver( |
| 827 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); | 827 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); |
| 828 | 828 |
| 829 ProxyInfo proxy_info1; | 829 ProxyInfo proxy_info1; |
| 830 ProxyInfo proxy_info2; | 830 ProxyInfo proxy_info2; |
| 831 ProxyResolver::RequestHandle request1; | 831 scoped_ptr<ProxyResolver::Request> request1; |
| 832 ProxyResolver::RequestHandle request2; | 832 scoped_ptr<ProxyResolver::Request> request2; |
| 833 | 833 |
| 834 int rv = resolver->GetProxyForURL(GURL("http://foo/req1"), &proxy_info1, | 834 int rv = resolver->GetProxyForURL(GURL("http://foo/req1"), &proxy_info1, |
| 835 base::Bind(&CrashCallback), &request1, | 835 base::Bind(&CrashCallback), &request1, |
| 836 BoundNetLog()); | 836 BoundNetLog()); |
| 837 | 837 |
| 838 EXPECT_EQ(ERR_IO_PENDING, rv); | 838 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 839 | 839 |
| 840 host_resolver.WaitUntilRequestIsReceived(); | 840 host_resolver.WaitUntilRequestIsReceived(); |
| 841 | 841 |
| 842 rv = resolver->GetProxyForURL(GURL("http://foo/req2"), &proxy_info2, | 842 rv = resolver->GetProxyForURL(GURL("http://foo/req2"), &proxy_info2, |
| 843 base::Bind(&CrashCallback), &request2, | 843 base::Bind(&CrashCallback), &request2, |
| 844 BoundNetLog()); | 844 BoundNetLog()); |
| 845 | 845 |
| 846 EXPECT_EQ(ERR_IO_PENDING, rv); | 846 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 847 | 847 |
| 848 host_resolver.WaitUntilRequestIsReceived(); | 848 host_resolver.WaitUntilRequestIsReceived(); |
| 849 | 849 |
| 850 resolver->CancelRequest(request1); | 850 request1.reset(); |
| 851 resolver->CancelRequest(request2); | 851 request2.reset(); |
| 852 | 852 |
| 853 EXPECT_EQ(2, host_resolver.num_cancelled_requests()); | 853 EXPECT_EQ(2, host_resolver.num_cancelled_requests()); |
| 854 | 854 |
| 855 // After leaving this scope, the ProxyResolver is destroyed. | 855 // After leaving this scope, the ProxyResolver is destroyed. |
| 856 // This should not cause any problems, as the outstanding work | 856 // This should not cause any problems, as the outstanding work |
| 857 // should have been cancelled. | 857 // should have been cancelled. |
| 858 } | 858 } |
| 859 | 859 |
| 860 void CancelRequestAndPause(ProxyResolver* resolver, | 860 void CancelRequestAndPause(scoped_ptr<ProxyResolver::Request>* request) { |
| 861 ProxyResolver::RequestHandle request) { | 861 request->reset(); |
| 862 resolver->CancelRequest(request); | |
| 863 | 862 |
| 864 // Sleep for a little bit. This makes it more likely for the worker | 863 // Sleep for a little bit. This makes it more likely for the worker |
| 865 // thread to have returned from its call, and serves as a regression | 864 // thread to have returned from its call, and serves as a regression |
| 866 // test for http://crbug.com/173373. | 865 // test for http://crbug.com/173373. |
| 867 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(30)); | 866 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(30)); |
| 868 } | 867 } |
| 869 | 868 |
| 870 // In non-blocking mode, the worker thread actually does block for | 869 // In non-blocking mode, the worker thread actually does block for |
| 871 // a short time to see if the result is in the DNS cache. Test | 870 // a short time to see if the result is in the DNS cache. Test |
| 872 // cancellation while the worker thread is waiting on this event. | 871 // cancellation while the worker thread is waiting on this event. |
| 873 TEST_F(ProxyResolverV8TracingWrapperTest, CancelWhileBlockedInNonBlockingDns) { | 872 TEST_F(ProxyResolverV8TracingWrapperTest, CancelWhileBlockedInNonBlockingDns) { |
| 874 BlockableHostResolver host_resolver; | 873 BlockableHostResolver host_resolver; |
| 875 MockErrorObserver* error_observer = new MockErrorObserver; | 874 MockErrorObserver* error_observer = new MockErrorObserver; |
| 876 | 875 |
| 877 scoped_ptr<ProxyResolver> resolver = CreateResolver( | 876 scoped_ptr<ProxyResolver> resolver = CreateResolver( |
| 878 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); | 877 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); |
| 879 | 878 |
| 880 ProxyInfo proxy_info; | 879 ProxyInfo proxy_info; |
| 881 ProxyResolver::RequestHandle request; | 880 scoped_ptr<ProxyResolver::Request> request; |
| 882 | 881 |
| 883 int rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, | 882 int rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
| 884 base::Bind(&CrashCallback), &request, | 883 base::Bind(&CrashCallback), &request, |
| 885 BoundNetLog()); | 884 BoundNetLog()); |
| 886 | 885 |
| 887 EXPECT_EQ(ERR_IO_PENDING, rv); | 886 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 888 | 887 |
| 889 host_resolver.SetAction( | 888 host_resolver.SetAction(base::Bind(CancelRequestAndPause, &request)); |
| 890 base::Bind(CancelRequestAndPause, resolver.get(), request)); | |
| 891 | 889 |
| 892 host_resolver.WaitUntilRequestIsReceived(); | 890 host_resolver.WaitUntilRequestIsReceived(); |
| 893 } | 891 } |
| 894 | 892 |
| 895 // Cancel the request while there is a pending DNS request, however before | 893 // Cancel the request while there is a pending DNS request, however before |
| 896 // the request is sent to the host resolver. | 894 // the request is sent to the host resolver. |
| 897 TEST_F(ProxyResolverV8TracingWrapperTest, CancelWhileBlockedInNonBlockingDns2) { | 895 TEST_F(ProxyResolverV8TracingWrapperTest, CancelWhileBlockedInNonBlockingDns2) { |
| 898 MockCachingHostResolver host_resolver; | 896 MockCachingHostResolver host_resolver; |
| 899 MockErrorObserver* error_observer = new MockErrorObserver; | 897 MockErrorObserver* error_observer = new MockErrorObserver; |
| 900 | 898 |
| 901 scoped_ptr<ProxyResolver> resolver = CreateResolver( | 899 scoped_ptr<ProxyResolver> resolver = CreateResolver( |
| 902 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); | 900 nullptr, &host_resolver, make_scoped_ptr(error_observer), "dns.js"); |
| 903 | 901 |
| 904 ProxyInfo proxy_info; | 902 ProxyInfo proxy_info; |
| 905 ProxyResolver::RequestHandle request; | 903 scoped_ptr<ProxyResolver::Request> request; |
| 906 | 904 |
| 907 int rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, | 905 int rv = resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
| 908 base::Bind(&CrashCallback), &request, | 906 base::Bind(&CrashCallback), &request, |
| 909 BoundNetLog()); | 907 BoundNetLog()); |
| 910 | 908 |
| 911 EXPECT_EQ(ERR_IO_PENDING, rv); | 909 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 912 | 910 |
| 913 // Wait a bit, so the DNS task has hopefully been posted. The test will | 911 // Wait a bit, so the DNS task has hopefully been posted. The test will |
| 914 // work whatever the delay is here, but it is most useful if the delay | 912 // work whatever the delay is here, but it is most useful if the delay |
| 915 // is large enough to allow a task to be posted back. | 913 // is large enough to allow a task to be posted back. |
| 916 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); | 914 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 917 resolver->CancelRequest(request); | 915 request.reset(); |
| 918 | 916 |
| 919 EXPECT_EQ(0u, host_resolver.num_resolve()); | 917 EXPECT_EQ(0u, host_resolver.num_resolve()); |
| 920 } | 918 } |
| 921 | 919 |
| 922 TEST_F(ProxyResolverV8TracingWrapperTest, | 920 TEST_F(ProxyResolverV8TracingWrapperTest, |
| 923 CancelCreateResolverWhileOutstandingBlockingDns) { | 921 CancelCreateResolverWhileOutstandingBlockingDns) { |
| 924 BlockableHostResolver host_resolver; | 922 BlockableHostResolver host_resolver; |
| 925 MockErrorObserver* error_observer = new MockErrorObserver; | 923 MockErrorObserver* error_observer = new MockErrorObserver; |
| 926 | 924 |
| 927 ProxyResolverFactoryV8TracingWrapper factory( | 925 ProxyResolverFactoryV8TracingWrapper factory( |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1125 proxy_uri.substr(0, proxy_uri.find(':') + 1)); | 1123 proxy_uri.substr(0, proxy_uri.find(':') + 1)); |
| 1126 } else { | 1124 } else { |
| 1127 NOTREACHED(); | 1125 NOTREACHED(); |
| 1128 } | 1126 } |
| 1129 } | 1127 } |
| 1130 } | 1128 } |
| 1131 | 1129 |
| 1132 } // namespace | 1130 } // namespace |
| 1133 | 1131 |
| 1134 } // namespace net | 1132 } // namespace net |
| OLD | NEW |