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

Side by Side Diff: net/url_request/url_fetcher_impl_unittest.cc

Issue 11464028: Introduce ERR_NETWORK_CHANGED and allow URLFetcher to automatically retry on that error. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased, post first try if online, more tests Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/url_request/url_fetcher_impl.h" 5 #include "net/url_request/url_fetcher_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
11 #include "base/files/scoped_temp_dir.h" 11 #include "base/files/scoped_temp_dir.h"
12 #include "base/message_loop_proxy.h" 12 #include "base/message_loop_proxy.h"
13 #include "base/stringprintf.h"
13 #include "base/synchronization/waitable_event.h" 14 #include "base/synchronization/waitable_event.h"
14 #include "base/threading/thread.h" 15 #include "base/threading/thread.h"
15 #include "build/build_config.h" 16 #include "build/build_config.h"
16 #include "crypto/nss_util.h" 17 #include "crypto/nss_util.h"
18 #include "net/base/mock_host_resolver.h"
19 #include "net/base/network_change_notifier.h"
17 #include "net/http/http_response_headers.h" 20 #include "net/http/http_response_headers.h"
18 #include "net/test/test_server.h" 21 #include "net/test/test_server.h"
19 #include "net/url_request/url_fetcher_delegate.h" 22 #include "net/url_request/url_fetcher_delegate.h"
20 #include "net/url_request/url_request_context_getter.h" 23 #include "net/url_request/url_request_context_getter.h"
21 #include "net/url_request/url_request_test_util.h" 24 #include "net/url_request/url_request_test_util.h"
22 #include "net/url_request/url_request_throttler_manager.h" 25 #include "net/url_request/url_request_throttler_manager.h"
26 #include "testing/gmock/include/gmock/gmock.h"
szym 2012/12/10 18:36:31 Not necessary.
Joao da Silva 2012/12/11 13:36:43 Done.
23 #include "testing/gtest/include/gtest/gtest.h" 27 #include "testing/gtest/include/gtest/gtest.h"
24 28
25 #if defined(USE_NSS) || defined(OS_IOS) 29 #if defined(USE_NSS) || defined(OS_IOS)
26 #include "net/ocsp/nss_ocsp.h" 30 #include "net/ocsp/nss_ocsp.h"
27 #endif 31 #endif
28 32
29 namespace net { 33 namespace net {
30 34
31 using base::Time; 35 using base::Time;
32 using base::TimeDelta; 36 using base::TimeDelta;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 virtual TestURLRequestContext* GetURLRequestContext() OVERRIDE { 69 virtual TestURLRequestContext* GetURLRequestContext() OVERRIDE {
66 return context_; 70 return context_;
67 } 71 }
68 72
69 protected: 73 protected:
70 virtual ~ThrottlingTestURLRequestContextGetter() {} 74 virtual ~ThrottlingTestURLRequestContextGetter() {}
71 75
72 TestURLRequestContext* const context_; 76 TestURLRequestContext* const context_;
73 }; 77 };
74 78
79 class TestNetworkChangeNotifier : public NetworkChangeNotifier {
80 public:
81 TestNetworkChangeNotifier() : connection_type_(CONNECTION_UNKNOWN) {}
82
83 // Implementation of NetworkChangeNotifier:
84 virtual ConnectionType GetCurrentConnectionType() const OVERRIDE {
85 return connection_type_;
86 }
87
88 void SetCurrentConnectionType(ConnectionType type) {
89 connection_type_ = type;
90 NotifyObserversOfConnectionTypeChange();
91 }
92
93 private:
94 ConnectionType connection_type_;
95 };
96
75 } // namespace 97 } // namespace
76 98
77 class URLFetcherTest : public testing::Test, 99 class URLFetcherTest : public testing::Test,
78 public URLFetcherDelegate { 100 public URLFetcherDelegate {
79 public: 101 public:
80 URLFetcherTest() 102 URLFetcherTest()
81 : fetcher_(NULL), 103 : fetcher_(NULL),
82 context_(new ThrottlingTestURLRequestContext()) { 104 context_(NULL) {
83 } 105 }
84 106
85 static int GetNumFetcherCores() { 107 static int GetNumFetcherCores() {
86 return URLFetcherImpl::GetNumFetcherCores(); 108 return URLFetcherImpl::GetNumFetcherCores();
87 } 109 }
88 110
89 // Creates a URLFetcher, using the program's main thread to do IO. 111 // Creates a URLFetcher, using the program's main thread to do IO.
90 virtual void CreateFetcher(const GURL& url); 112 virtual void CreateFetcher(const GURL& url);
91 113
92 // URLFetcherDelegate: 114 // URLFetcherDelegate:
(...skipping 11 matching lines...) Expand all
104 126
105 TestURLRequestContext* request_context() { 127 TestURLRequestContext* request_context() {
106 return context_.get(); 128 return context_.get();
107 } 129 }
108 130
109 protected: 131 protected:
110 // testing::Test: 132 // testing::Test:
111 virtual void SetUp() OVERRIDE { 133 virtual void SetUp() OVERRIDE {
112 testing::Test::SetUp(); 134 testing::Test::SetUp();
113 135
136 context_.reset(new ThrottlingTestURLRequestContext());
114 io_message_loop_proxy_ = base::MessageLoopProxy::current(); 137 io_message_loop_proxy_ = base::MessageLoopProxy::current();
115 138
116 #if defined(USE_NSS) || defined(OS_IOS) 139 #if defined(USE_NSS) || defined(OS_IOS)
117 crypto::EnsureNSSInit(); 140 crypto::EnsureNSSInit();
118 EnsureNSSHttpIOInit(); 141 EnsureNSSHttpIOInit();
119 #endif 142 #endif
120 } 143 }
121 144
122 virtual void TearDown() OVERRIDE { 145 virtual void TearDown() OVERRIDE {
123 #if defined(USE_NSS) || defined(OS_IOS) 146 #if defined(USE_NSS) || defined(OS_IOS)
124 ShutdownNSSHttpIO(); 147 ShutdownNSSHttpIO();
125 #endif 148 #endif
126 } 149 }
127 150
128 // URLFetcher is designed to run on the main UI thread, but in our tests 151 // URLFetcher is designed to run on the main UI thread, but in our tests
129 // we assume that the current thread is the IO thread where the URLFetcher 152 // we assume that the current thread is the IO thread where the URLFetcher
130 // dispatches its requests to. When we wish to simulate being used from 153 // dispatches its requests to. When we wish to simulate being used from
131 // a UI thread, we dispatch a worker thread to do so. 154 // a UI thread, we dispatch a worker thread to do so.
132 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; 155 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
133 156
134 URLFetcherImpl* fetcher_; 157 URLFetcherImpl* fetcher_;
135 const scoped_ptr<TestURLRequestContext> context_; 158 scoped_ptr<TestURLRequestContext> context_;
159 };
160
161 // A test fixture that uses a MockHostResolver, so that name resolutions can
162 // be manipulated by the tests to keep connections in the resolving state.
163 class URLFetcherMockDNSTest : public URLFetcherTest {
164 public:
165 // testing::Test:
166 virtual void SetUp() OVERRIDE;
167
168 // URLFetcherTest:
169 virtual void CreateFetcher(const GURL& url) OVERRIDE;
170
171 // URLFetcherDelegate:
172 virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
173
174 protected:
175 GURL test_url_;
176 scoped_ptr<TestServer> test_server_;
177 MockHostResolver resolver_;
178 scoped_ptr<URLFetcher> completed_fetcher_;
179 NetworkChangeNotifier::DisableForTest disable_default_notifier_;
180 TestNetworkChangeNotifier network_change_notifier_;
136 }; 181 };
137 182
138 void URLFetcherTest::CreateFetcher(const GURL& url) { 183 void URLFetcherTest::CreateFetcher(const GURL& url) {
139 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this); 184 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
140 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter( 185 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
141 io_message_loop_proxy(), request_context())); 186 io_message_loop_proxy(), request_context()));
142 fetcher_->Start(); 187 fetcher_->Start();
143 } 188 }
144 189
145 void URLFetcherTest::OnURLFetchComplete(const URLFetcher* source) { 190 void URLFetcherTest::OnURLFetchComplete(const URLFetcher* source) {
(...skipping 10 matching lines...) Expand all
156 void URLFetcherTest::CleanupAfterFetchComplete() { 201 void URLFetcherTest::CleanupAfterFetchComplete() {
157 delete fetcher_; // Have to delete this here and not in the destructor, 202 delete fetcher_; // Have to delete this here and not in the destructor,
158 // because the destructor won't necessarily run on the 203 // because the destructor won't necessarily run on the
159 // same thread that CreateFetcher() did. 204 // same thread that CreateFetcher() did.
160 205
161 io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 206 io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
162 // If the current message loop is not the IO loop, it will be shut down when 207 // If the current message loop is not the IO loop, it will be shut down when
163 // the main loop returns and this thread subsequently goes out of scope. 208 // the main loop returns and this thread subsequently goes out of scope.
164 } 209 }
165 210
211 void URLFetcherMockDNSTest::SetUp() {
212 URLFetcherTest::SetUp();
213
214 resolver_.set_synchronous_mode(false);
215 resolver_.set_resolve_automatically(false);
216 resolver_.rules()->AddRule("example.com", "127.0.0.1");
217
218 context_.reset(new TestURLRequestContext(true));
219 context_->set_host_resolver(&resolver_);
220 context_->Init();
221
222 test_server_.reset(new TestServer(TestServer::TYPE_HTTP,
223 TestServer::kLocalhost,
224 FilePath(kDocRoot)));
225 ASSERT_TRUE(test_server_->Start());
226
227 // test_server_.GetURL() returns a URL with 127.0.0.1 (kLocalhost), that is
228 // immediately resolved by the MockHostResolver. Use a hostname instead to
229 // trigger an async resolve.
230 test_url_ = GURL(
231 base::StringPrintf("http://example.com:%d/defaultresponse",
232 test_server_->host_port_pair().port()));
233 ASSERT_TRUE(test_url_.is_valid());
234 }
235
236 void URLFetcherMockDNSTest::CreateFetcher(const GURL& url) {
237 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
238 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
239 io_message_loop_proxy(), request_context()));
240 }
241
242 void URLFetcherMockDNSTest::OnURLFetchComplete(const URLFetcher* source) {
243 io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
244 ASSERT_EQ(fetcher_, source);
245 EXPECT_EQ(test_url_, source->GetOriginalURL());
246 completed_fetcher_.reset(fetcher_);
247 }
248
166 namespace { 249 namespace {
167 250
168 // Version of URLFetcherTest that does a POST instead 251 // Version of URLFetcherTest that does a POST instead
169 class URLFetcherPostTest : public URLFetcherTest { 252 class URLFetcherPostTest : public URLFetcherTest {
170 public: 253 public:
171 // URLFetcherTest: 254 // URLFetcherTest:
172 virtual void CreateFetcher(const GURL& url) OVERRIDE; 255 virtual void CreateFetcher(const GURL& url) OVERRIDE;
173 256
174 // URLFetcherDelegate: 257 // URLFetcherDelegate:
175 virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE; 258 virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 EXPECT_EQ(ERR_ABORTED, source->GetStatus().error()); 660 EXPECT_EQ(ERR_ABORTED, source->GetStatus().error());
578 EXPECT_EQ(301, source->GetResponseCode()); 661 EXPECT_EQ(301, source->GetResponseCode());
579 CleanupAfterFetchComplete(); 662 CleanupAfterFetchComplete();
580 } 663 }
581 664
582 void URLFetcherProtectTest::CreateFetcher(const GURL& url) { 665 void URLFetcherProtectTest::CreateFetcher(const GURL& url) {
583 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this); 666 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
584 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter( 667 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
585 io_message_loop_proxy(), request_context())); 668 io_message_loop_proxy(), request_context()));
586 start_time_ = Time::Now(); 669 start_time_ = Time::Now();
587 fetcher_->SetMaxRetries(11); 670 fetcher_->SetMaxRetriesOn5xx(11);
588 fetcher_->Start(); 671 fetcher_->Start();
589 } 672 }
590 673
591 void URLFetcherProtectTest::OnURLFetchComplete(const URLFetcher* source) { 674 void URLFetcherProtectTest::OnURLFetchComplete(const URLFetcher* source) {
592 const TimeDelta one_second = TimeDelta::FromMilliseconds(1000); 675 const TimeDelta one_second = TimeDelta::FromMilliseconds(1000);
593 if (source->GetResponseCode() >= 500) { 676 if (source->GetResponseCode() >= 500) {
594 // Now running ServerUnavailable test. 677 // Now running ServerUnavailable test.
595 // It takes more than 1 second to finish all 11 requests. 678 // It takes more than 1 second to finish all 11 requests.
596 EXPECT_TRUE(Time::Now() - start_time_ >= one_second); 679 EXPECT_TRUE(Time::Now() - start_time_ >= one_second);
597 EXPECT_TRUE(source->GetStatus().is_success()); 680 EXPECT_TRUE(source->GetStatus().is_success());
(...skipping 18 matching lines...) Expand all
616 } 699 }
617 } 700 }
618 } 701 }
619 702
620 void URLFetcherProtectTestPassedThrough::CreateFetcher(const GURL& url) { 703 void URLFetcherProtectTestPassedThrough::CreateFetcher(const GURL& url) {
621 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this); 704 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
622 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter( 705 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
623 io_message_loop_proxy(), request_context())); 706 io_message_loop_proxy(), request_context()));
624 fetcher_->SetAutomaticallyRetryOn5xx(false); 707 fetcher_->SetAutomaticallyRetryOn5xx(false);
625 start_time_ = Time::Now(); 708 start_time_ = Time::Now();
626 fetcher_->SetMaxRetries(11); 709 fetcher_->SetMaxRetriesOn5xx(11);
627 fetcher_->Start(); 710 fetcher_->Start();
628 } 711 }
629 712
630 void URLFetcherProtectTestPassedThrough::OnURLFetchComplete( 713 void URLFetcherProtectTestPassedThrough::OnURLFetchComplete(
631 const URLFetcher* source) { 714 const URLFetcher* source) {
632 const TimeDelta one_minute = TimeDelta::FromMilliseconds(60000); 715 const TimeDelta one_minute = TimeDelta::FromMilliseconds(60000);
633 if (source->GetResponseCode() >= 500) { 716 if (source->GetResponseCode() >= 500) {
634 // Now running ServerUnavailable test. 717 // Now running ServerUnavailable test.
635 // It should get here on the first attempt, so almost immediately and 718 // It should get here on the first attempt, so almost immediately and
636 // *not* to attempt to execute all 11 requests (2.5 minutes). 719 // *not* to attempt to execute all 11 requests (2.5 minutes).
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 EXPECT_TRUE(data.empty()); 758 EXPECT_TRUE(data.empty());
676 CleanupAfterFetchComplete(); 759 CleanupAfterFetchComplete();
677 } 760 }
678 761
679 void URLFetcherCancelTest::CreateFetcher(const GURL& url) { 762 void URLFetcherCancelTest::CreateFetcher(const GURL& url) {
680 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this); 763 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
681 CancelTestURLRequestContextGetter* context_getter = 764 CancelTestURLRequestContextGetter* context_getter =
682 new CancelTestURLRequestContextGetter(io_message_loop_proxy(), 765 new CancelTestURLRequestContextGetter(io_message_loop_proxy(),
683 url); 766 url);
684 fetcher_->SetRequestContext(context_getter); 767 fetcher_->SetRequestContext(context_getter);
685 fetcher_->SetMaxRetries(2); 768 fetcher_->SetMaxRetriesOn5xx(2);
686 fetcher_->Start(); 769 fetcher_->Start();
687 // We need to wait for the creation of the URLRequestContext, since we 770 // We need to wait for the creation of the URLRequestContext, since we
688 // rely on it being destroyed as a signal to end the test. 771 // rely on it being destroyed as a signal to end the test.
689 context_getter->WaitForContextCreation(); 772 context_getter->WaitForContextCreation();
690 CancelRequest(); 773 CancelRequest();
691 } 774 }
692 775
693 void URLFetcherCancelTest::OnURLFetchComplete( 776 void URLFetcherCancelTest::OnURLFetchComplete(
694 const URLFetcher* source) { 777 const URLFetcher* source) {
695 // We should have cancelled the request before completion. 778 // We should have cancelled the request before completion.
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 CreateFetcher(test_server.GetURL("defaultresponse")); 904 CreateFetcher(test_server.GetURL("defaultresponse"));
822 io_message_loop_proxy()->PostTaskAndReply( 905 io_message_loop_proxy()->PostTaskAndReply(
823 FROM_HERE, 906 FROM_HERE,
824 base::Bind(&CancelAllOnIO), 907 base::Bind(&CancelAllOnIO),
825 MessageLoop::QuitClosure()); 908 MessageLoop::QuitClosure());
826 MessageLoop::current()->Run(); 909 MessageLoop::current()->Run();
827 EXPECT_EQ(0, GetNumFetcherCores()); 910 EXPECT_EQ(0, GetNumFetcherCores());
828 delete fetcher_; 911 delete fetcher_;
829 } 912 }
830 913
914 TEST_F(URLFetcherMockDNSTest, DontRetryOnNetworkChangedByDefault) {
915 EXPECT_EQ(0, GetNumFetcherCores());
916 EXPECT_FALSE(resolver_.has_pending_requests());
917
918 // This posts a task to start the fetcher.
919 CreateFetcher(test_url_);
920 fetcher_->Start();
921 EXPECT_EQ(0, GetNumFetcherCores());
922 MessageLoop::current()->RunUntilIdle();
923
924 // The fetcher is now running, but is pending the host resolve.
925 EXPECT_EQ(1, GetNumFetcherCores());
926 EXPECT_TRUE(resolver_.has_pending_requests());
927 ASSERT_FALSE(completed_fetcher_);
928
929 // A network change notification aborts the connect job.
930 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
931 MessageLoop::current()->RunUntilIdle();
932 EXPECT_EQ(0, GetNumFetcherCores());
933 EXPECT_FALSE(resolver_.has_pending_requests());
934 ASSERT_TRUE(completed_fetcher_);
935
936 // And the owner of the fetcher gets the ERR_NETWORK_CHANGED error.
937 EXPECT_EQ(ERR_NETWORK_CHANGED, completed_fetcher_->GetStatus().error());
938 }
939
940 TEST_F(URLFetcherMockDNSTest, RetryOnNetworkChangedAndFail) {
941 EXPECT_EQ(0, GetNumFetcherCores());
942 EXPECT_FALSE(resolver_.has_pending_requests());
943
944 // This posts a task to start the fetcher.
945 CreateFetcher(test_url_);
946 fetcher_->SetAutomaticallyRetryOnNetworkChanges(3);
947 fetcher_->Start();
948 EXPECT_EQ(0, GetNumFetcherCores());
949 MessageLoop::current()->RunUntilIdle();
950
951 // The fetcher is now running, but is pending the host resolve.
952 EXPECT_EQ(1, GetNumFetcherCores());
953 EXPECT_TRUE(resolver_.has_pending_requests());
954 ASSERT_FALSE(completed_fetcher_);
955
956 // Make it fail 3 times.
957 for (int i = 0; i < 3; ++i) {
958 // A network change notification aborts the connect job.
959 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
960 MessageLoop::current()->RunUntilIdle();
961
962 // But the fetcher retries automatically.
963 EXPECT_EQ(1, GetNumFetcherCores());
964 EXPECT_TRUE(resolver_.has_pending_requests());
965 ASSERT_FALSE(completed_fetcher_);
966 }
967
968 // A 4th failure doesn't trigger another retry, and propagates the error
969 // to the owner of the fetcher.
970 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
971 MessageLoop::current()->RunUntilIdle();
972 EXPECT_EQ(0, GetNumFetcherCores());
973 EXPECT_FALSE(resolver_.has_pending_requests());
974 ASSERT_TRUE(completed_fetcher_);
975
976 // And the owner of the fetcher gets the ERR_NETWORK_CHANGED error.
977 EXPECT_EQ(ERR_NETWORK_CHANGED, completed_fetcher_->GetStatus().error());
978 }
979
980 TEST_F(URLFetcherMockDNSTest, RetryOnNetworkChangedAndSucceed) {
981 EXPECT_EQ(0, GetNumFetcherCores());
982 EXPECT_FALSE(resolver_.has_pending_requests());
983
984 // This posts a task to start the fetcher.
985 CreateFetcher(test_url_);
986 fetcher_->SetAutomaticallyRetryOnNetworkChanges(3);
987 fetcher_->Start();
988 EXPECT_EQ(0, GetNumFetcherCores());
989 MessageLoop::current()->RunUntilIdle();
990
991 // The fetcher is now running, but is pending the host resolve.
992 EXPECT_EQ(1, GetNumFetcherCores());
993 EXPECT_TRUE(resolver_.has_pending_requests());
994 ASSERT_FALSE(completed_fetcher_);
995
996 // Make it fail 3 times.
997 for (int i = 0; i < 3; ++i) {
998 // A network change notification aborts the connect job.
999 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
1000 MessageLoop::current()->RunUntilIdle();
1001
1002 // But the fetcher retries automatically.
1003 EXPECT_EQ(1, GetNumFetcherCores());
1004 EXPECT_TRUE(resolver_.has_pending_requests());
1005 ASSERT_FALSE(completed_fetcher_);
1006 }
1007
1008 // Now let it succeed by resolving the pending request.
1009 resolver_.ResolveAllPending();
1010 MessageLoop::current()->Run();
1011
1012 // URLFetcherMockDNSTest::OnURLFetchComplete() will quit the loop.
1013 EXPECT_EQ(0, GetNumFetcherCores());
1014 EXPECT_FALSE(resolver_.has_pending_requests());
1015 ASSERT_TRUE(completed_fetcher_);
1016
1017 // This time the request succeeded.
1018 EXPECT_EQ(OK, completed_fetcher_->GetStatus().error());
1019 EXPECT_EQ(200, completed_fetcher_->GetResponseCode());
1020 }
1021
1022 TEST_F(URLFetcherMockDNSTest, RetryAfterComingBackOnline) {
1023 EXPECT_EQ(0, GetNumFetcherCores());
1024 EXPECT_FALSE(resolver_.has_pending_requests());
1025
1026 // This posts a task to start the fetcher.
1027 CreateFetcher(test_url_);
1028 fetcher_->SetAutomaticallyRetryOnNetworkChanges(1);
1029 fetcher_->Start();
1030 EXPECT_EQ(0, GetNumFetcherCores());
1031 MessageLoop::current()->RunUntilIdle();
1032
1033 // The fetcher is now running, but is pending the host resolve.
1034 EXPECT_EQ(1, GetNumFetcherCores());
1035 EXPECT_TRUE(resolver_.has_pending_requests());
1036 ASSERT_FALSE(completed_fetcher_);
1037
1038 // Make it fail by changing the connection type to offline.
1039 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN,
1040 NetworkChangeNotifier::GetConnectionType());
1041 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
1042 network_change_notifier_.SetCurrentConnectionType(
1043 NetworkChangeNotifier::CONNECTION_NONE);
1044 // This makes the connect job fail:
1045 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
1046 resolver_.ResolveAllPending();
1047 MessageLoop::current()->RunUntilIdle();
1048
1049 // The fetcher is now waiting for the connection to become online again.
1050 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE,
1051 NetworkChangeNotifier::GetConnectionType());
1052 EXPECT_TRUE(NetworkChangeNotifier::IsOffline());
1053 EXPECT_FALSE(resolver_.has_pending_requests());
1054 ASSERT_FALSE(completed_fetcher_);
1055 // The core is still alive, but it dropped its request.
1056 EXPECT_EQ(0, GetNumFetcherCores());
1057
1058 // It should retry once the connection is back.
1059 network_change_notifier_.SetCurrentConnectionType(
1060 NetworkChangeNotifier::CONNECTION_WIFI);
1061 MessageLoop::current()->RunUntilIdle();
1062 EXPECT_EQ(1, GetNumFetcherCores());
1063 ASSERT_FALSE(completed_fetcher_);
1064 EXPECT_TRUE(resolver_.has_pending_requests());
1065
1066 // Resolve the pending request; the fetcher should complete now.
1067 resolver_.ResolveAllPending();
1068 MessageLoop::current()->Run();
1069
1070 EXPECT_EQ(0, GetNumFetcherCores());
1071 EXPECT_FALSE(resolver_.has_pending_requests());
1072 ASSERT_TRUE(completed_fetcher_);
1073 EXPECT_EQ(OK, completed_fetcher_->GetStatus().error());
1074 EXPECT_EQ(200, completed_fetcher_->GetResponseCode());
1075 }
1076
1077 TEST_F(URLFetcherMockDNSTest, StartOnlyWhenOnline) {
1078 // Start offline.
1079 network_change_notifier_.SetCurrentConnectionType(
1080 NetworkChangeNotifier::CONNECTION_NONE);
1081 EXPECT_TRUE(NetworkChangeNotifier::IsOffline());
1082 EXPECT_EQ(0, GetNumFetcherCores());
1083 EXPECT_FALSE(resolver_.has_pending_requests());
1084
1085 // Create a fetcher that retries on network changes. It will try to connect
1086 // only once the network is back online.
1087 CreateFetcher(test_url_);
1088 fetcher_->SetAutomaticallyRetryOnNetworkChanges(1);
1089 fetcher_->Start();
1090 MessageLoop::current()->RunUntilIdle();
1091 EXPECT_EQ(0, GetNumFetcherCores());
1092 EXPECT_FALSE(resolver_.has_pending_requests());
1093
1094 // It should retry once the connection is back.
1095 network_change_notifier_.SetCurrentConnectionType(
1096 NetworkChangeNotifier::CONNECTION_WIFI);
1097 MessageLoop::current()->RunUntilIdle();
1098 EXPECT_EQ(1, GetNumFetcherCores());
1099 ASSERT_FALSE(completed_fetcher_);
1100 EXPECT_TRUE(resolver_.has_pending_requests());
1101
1102 // Resolve the pending request; the fetcher should complete now.
1103 resolver_.ResolveAllPending();
1104 MessageLoop::current()->Run();
1105
1106 EXPECT_EQ(0, GetNumFetcherCores());
1107 EXPECT_FALSE(resolver_.has_pending_requests());
1108 ASSERT_TRUE(completed_fetcher_);
1109 EXPECT_EQ(OK, completed_fetcher_->GetStatus().error());
1110 EXPECT_EQ(200, completed_fetcher_->GetResponseCode());
1111 }
1112
831 #if defined(OS_MACOSX) 1113 #if defined(OS_MACOSX)
832 // SIGSEGV on Mac: http://crbug.com/60426 1114 // SIGSEGV on Mac: http://crbug.com/60426
833 TEST_F(URLFetcherPostTest, DISABLED_Basic) { 1115 TEST_F(URLFetcherPostTest, DISABLED_Basic) {
834 #else 1116 #else
835 TEST_F(URLFetcherPostTest, Basic) { 1117 TEST_F(URLFetcherPostTest, Basic) {
836 #endif 1118 #endif
837 TestServer test_server(TestServer::TYPE_HTTP, 1119 TestServer test_server(TestServer::TYPE_HTTP,
838 TestServer::kLocalhost, 1120 TestServer::kLocalhost,
839 FilePath(kDocRoot)); 1121 FilePath(kDocRoot));
840 ASSERT_TRUE(test_server.Start()); 1122 ASSERT_TRUE(test_server.Start());
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
1271 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1553 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1272 1554
1273 MessageLoop::current()->RunUntilIdle(); 1555 MessageLoop::current()->RunUntilIdle();
1274 ASSERT_FALSE(file_util::PathExists(file_path_)) 1556 ASSERT_FALSE(file_util::PathExists(file_path_))
1275 << file_path_.value() << " not removed."; 1557 << file_path_.value() << " not removed.";
1276 } 1558 }
1277 1559
1278 } // namespace 1560 } // namespace
1279 1561
1280 } // namespace net 1562 } // namespace net
OLDNEW
« net/url_request/url_fetcher_core.cc ('K') | « net/url_request/url_fetcher_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698