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

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: 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"
23 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
24 27
25 #if defined(USE_NSS) || defined(OS_IOS) 28 #if defined(USE_NSS) || defined(OS_IOS)
26 #include "net/ocsp/nss_ocsp.h" 29 #include "net/ocsp/nss_ocsp.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 virtual TestURLRequestContext* GetURLRequestContext() OVERRIDE { 68 virtual TestURLRequestContext* GetURLRequestContext() OVERRIDE {
66 return context_; 69 return context_;
67 } 70 }
68 71
69 protected: 72 protected:
70 virtual ~ThrottlingTestURLRequestContextGetter() {} 73 virtual ~ThrottlingTestURLRequestContextGetter() {}
71 74
72 TestURLRequestContext* const context_; 75 TestURLRequestContext* const context_;
73 }; 76 };
74 77
78 class TestNetworkChangeNotifier : public NetworkChangeNotifier {
pauljensen 2012/12/07 23:00:05 Using GMOCK for this might be a few lines shorter,
Joao da Silva 2012/12/10 15:32:42 These tests still need to invoke NotifyObserversOf
79 public:
80 TestNetworkChangeNotifier() : connection_type_(CONNECTION_UNKNOWN) {}
81
82 // Implementation of NetworkChangeNotifier:
83 virtual ConnectionType GetCurrentConnectionType() const OVERRIDE {
84 return connection_type_;
85 }
86
87 void SetCurrentConnectionType(ConnectionType type) {
88 connection_type_ = type;
89 NotifyObserversOfConnectionTypeChange();
90 }
91
92 private:
93 ConnectionType connection_type_;
94 };
95
75 } // namespace 96 } // namespace
76 97
77 class URLFetcherTest : public testing::Test, 98 class URLFetcherTest : public testing::Test,
78 public URLFetcherDelegate { 99 public URLFetcherDelegate {
79 public: 100 public:
80 URLFetcherTest() 101 URLFetcherTest()
81 : fetcher_(NULL), 102 : fetcher_(NULL),
82 context_(new ThrottlingTestURLRequestContext()) { 103 context_(new ThrottlingTestURLRequestContext()) {
83 } 104 }
84 105
(...skipping 14 matching lines...) Expand all
99 void CleanupAfterFetchComplete(); 120 void CleanupAfterFetchComplete();
100 121
101 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy() { 122 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy() {
102 return io_message_loop_proxy_; 123 return io_message_loop_proxy_;
103 } 124 }
104 125
105 TestURLRequestContext* request_context() { 126 TestURLRequestContext* request_context() {
106 return context_.get(); 127 return context_.get();
107 } 128 }
108 129
130 void UseTestNetworkChangeNotifier() {
131 disable_default_notifier_.reset(new NetworkChangeNotifier::DisableForTest);
132 network_change_notifier_.reset(new TestNetworkChangeNotifier);
pauljensen 2012/12/07 23:00:05 Could |disable_default_notifier_| and |network_cha
Joao da Silva 2012/12/10 15:32:42 Done.
Joao da Silva 2012/12/10 15:32:42 Done.
133 }
134
109 protected: 135 protected:
110 // testing::Test: 136 // testing::Test:
111 virtual void SetUp() OVERRIDE { 137 virtual void SetUp() OVERRIDE {
112 testing::Test::SetUp(); 138 testing::Test::SetUp();
113 139
114 io_message_loop_proxy_ = base::MessageLoopProxy::current(); 140 io_message_loop_proxy_ = base::MessageLoopProxy::current();
115 141
116 #if defined(USE_NSS) || defined(OS_IOS) 142 #if defined(USE_NSS) || defined(OS_IOS)
117 crypto::EnsureNSSInit(); 143 crypto::EnsureNSSInit();
118 EnsureNSSHttpIOInit(); 144 EnsureNSSHttpIOInit();
119 #endif 145 #endif
120 } 146 }
121 147
122 virtual void TearDown() OVERRIDE { 148 virtual void TearDown() OVERRIDE {
123 #if defined(USE_NSS) || defined(OS_IOS) 149 #if defined(USE_NSS) || defined(OS_IOS)
124 ShutdownNSSHttpIO(); 150 ShutdownNSSHttpIO();
125 #endif 151 #endif
126 } 152 }
127 153
128 // URLFetcher is designed to run on the main UI thread, but in our tests 154 // 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 155 // 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 156 // dispatches its requests to. When we wish to simulate being used from
131 // a UI thread, we dispatch a worker thread to do so. 157 // a UI thread, we dispatch a worker thread to do so.
132 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; 158 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
133 159
134 URLFetcherImpl* fetcher_; 160 URLFetcherImpl* fetcher_;
135 const scoped_ptr<TestURLRequestContext> context_; 161 scoped_ptr<TestURLRequestContext> context_;
162
163 scoped_ptr<NetworkChangeNotifier::DisableForTest> disable_default_notifier_;
164 scoped_ptr<TestNetworkChangeNotifier> network_change_notifier_;
136 }; 165 };
137 166
138 void URLFetcherTest::CreateFetcher(const GURL& url) { 167 void URLFetcherTest::CreateFetcher(const GURL& url) {
139 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this); 168 fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
140 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter( 169 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
141 io_message_loop_proxy(), request_context())); 170 io_message_loop_proxy(), request_context()));
142 fetcher_->Start();
143 } 171 }
144 172
145 void URLFetcherTest::OnURLFetchComplete(const URLFetcher* source) { 173 void URLFetcherTest::OnURLFetchComplete(const URLFetcher* source) {
146 EXPECT_TRUE(source->GetStatus().is_success()); 174 EXPECT_TRUE(source->GetStatus().is_success());
147 EXPECT_EQ(200, source->GetResponseCode()); // HTTP OK 175 EXPECT_EQ(200, source->GetResponseCode()); // HTTP OK
148 176
149 std::string data; 177 std::string data;
150 EXPECT_TRUE(source->GetResponseAsString(&data)); 178 EXPECT_TRUE(source->GetResponseAsString(&data));
151 EXPECT_FALSE(data.empty()); 179 EXPECT_FALSE(data.empty());
152 180
153 CleanupAfterFetchComplete(); 181 CleanupAfterFetchComplete();
154 } 182 }
155 183
156 void URLFetcherTest::CleanupAfterFetchComplete() { 184 void URLFetcherTest::CleanupAfterFetchComplete() {
157 delete fetcher_; // Have to delete this here and not in the destructor, 185 delete fetcher_; // Have to delete this here and not in the destructor,
158 // because the destructor won't necessarily run on the 186 // because the destructor won't necessarily run on the
159 // same thread that CreateFetcher() did. 187 // same thread that CreateFetcher() did.
160 188
161 io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 189 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 190 // 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. 191 // the main loop returns and this thread subsequently goes out of scope.
164 } 192 }
165 193
166 namespace { 194 namespace {
167 195
196 class URLFetcherMockDNSTest : public URLFetcherTest {
197 public:
198 // testing::Test:
199 virtual void SetUp() OVERRIDE;
200
201 // URLFetcherDelegate:
202 virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
203
204 protected:
205 GURL test_url_;
206 scoped_ptr<TestServer> test_server_;
207 MockHostResolver resolver_;
208 scoped_ptr<URLFetcher> completed_fetcher_;
209 };
210
168 // Version of URLFetcherTest that does a POST instead 211 // Version of URLFetcherTest that does a POST instead
169 class URLFetcherPostTest : public URLFetcherTest { 212 class URLFetcherPostTest : public URLFetcherTest {
170 public: 213 public:
171 // URLFetcherTest: 214 // URLFetcherTest:
172 virtual void CreateFetcher(const GURL& url) OVERRIDE; 215 virtual void CreateFetcher(const GURL& url) OVERRIDE;
173 216
174 // URLFetcherDelegate: 217 // URLFetcherDelegate:
175 virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE; 218 virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
176 }; 219 };
177 220
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 // Set by the test. Used in OnURLFetchComplete() to decide if 462 // Set by the test. Used in OnURLFetchComplete() to decide if
420 // the URLFetcher should own the temp file, so that we can test 463 // the URLFetcher should own the temp file, so that we can test
421 // disowning prevents the file from being deleted. 464 // disowning prevents the file from being deleted.
422 bool take_ownership_of_file_; 465 bool take_ownership_of_file_;
423 466
424 // Expected file error code for the test. 467 // Expected file error code for the test.
425 // PLATFORM_FILE_OK when expecting success. 468 // PLATFORM_FILE_OK when expecting success.
426 base::PlatformFileError expected_file_error_; 469 base::PlatformFileError expected_file_error_;
427 }; 470 };
428 471
472 void URLFetcherMockDNSTest::SetUp() {
473 URLFetcherTest::SetUp();
474
475 context_.reset();
476 UseTestNetworkChangeNotifier();
477 ASSERT_TRUE(network_change_notifier_);
478
479 resolver_.set_synchronous_mode(false);
480 resolver_.set_resolve_automatically(false);
481 resolver_.rules()->AddRule("example.com", "127.0.0.1");
482
483 context_.reset(new TestURLRequestContext(true));
484 context_->set_host_resolver(&resolver_);
485 context_->Init();
486
487 test_server_.reset(new TestServer(TestServer::TYPE_HTTP,
488 TestServer::kLocalhost,
489 FilePath(kDocRoot)));
490 ASSERT_TRUE(test_server_->Start());
491
492 // test_server_.GetURL() returns a URL with 127.0.0.1 (kLocalhost), that is
493 // immediately resolved by the MockHostResolver. Use a hostname instead to
494 // trigger an async resolve.
495 test_url_ = GURL(
496 base::StringPrintf("http://example.com:%d/defaultresponse",
497 test_server_->host_port_pair().port()));
498 ASSERT_TRUE(test_url_.is_valid());
499 }
500
501 void URLFetcherMockDNSTest::OnURLFetchComplete(const URLFetcher* source) {
502 io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
503 ASSERT_EQ(fetcher_, source);
504 EXPECT_EQ(test_url_, source->GetOriginalURL());
505 completed_fetcher_.reset(fetcher_);
506 }
507
429 void URLFetcherPostTest::CreateFetcher(const GURL& url) { 508 void URLFetcherPostTest::CreateFetcher(const GURL& url) {
430 fetcher_ = new URLFetcherImpl(url, URLFetcher::POST, this); 509 fetcher_ = new URLFetcherImpl(url, URLFetcher::POST, this);
431 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter( 510 fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
432 io_message_loop_proxy(), request_context())); 511 io_message_loop_proxy(), request_context()));
433 fetcher_->SetUploadData("application/x-www-form-urlencoded", 512 fetcher_->SetUploadData("application/x-www-form-urlencoded",
434 "bobsyeruncle"); 513 "bobsyeruncle");
435 fetcher_->Start(); 514 fetcher_->Start();
436 } 515 }
437 516
438 void URLFetcherPostTest::OnURLFetchComplete(const URLFetcher* source) { 517 void URLFetcherPostTest::OnURLFetchComplete(const URLFetcher* source) {
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 CreateFetcher(test_server.GetURL("defaultresponse")); 900 CreateFetcher(test_server.GetURL("defaultresponse"));
822 io_message_loop_proxy()->PostTaskAndReply( 901 io_message_loop_proxy()->PostTaskAndReply(
823 FROM_HERE, 902 FROM_HERE,
824 base::Bind(&CancelAllOnIO), 903 base::Bind(&CancelAllOnIO),
825 MessageLoop::QuitClosure()); 904 MessageLoop::QuitClosure());
826 MessageLoop::current()->Run(); 905 MessageLoop::current()->Run();
827 EXPECT_EQ(0, GetNumFetcherCores()); 906 EXPECT_EQ(0, GetNumFetcherCores());
828 delete fetcher_; 907 delete fetcher_;
829 } 908 }
830 909
910 TEST_F(URLFetcherMockDNSTest, DontRetryOnNetworkChangedByDefault) {
911 EXPECT_EQ(0, GetNumFetcherCores());
912 EXPECT_FALSE(resolver_.has_pending_requests());
913
914 // This posts a task to start the fetcher.
915 CreateFetcher(test_url_);
916 fetcher_->Start();
917 EXPECT_EQ(0, GetNumFetcherCores());
918 MessageLoop::current()->RunUntilIdle();
919
920 // The fetcher is now running, but is pending the host resolve.
921 EXPECT_EQ(1, GetNumFetcherCores());
922 EXPECT_TRUE(resolver_.has_pending_requests());
923 ASSERT_FALSE(completed_fetcher_);
924
925 // A network change notification aborts the connect job.
926 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
927 MessageLoop::current()->RunUntilIdle();
928 EXPECT_EQ(0, GetNumFetcherCores());
929 EXPECT_FALSE(resolver_.has_pending_requests());
930 ASSERT_TRUE(completed_fetcher_);
931
932 // And the owner of the fetcher gets the ERR_NETWORK_CHANGED error.
933 EXPECT_EQ(ERR_NETWORK_CHANGED, completed_fetcher_->GetStatus().error());
934 }
935
936 TEST_F(URLFetcherMockDNSTest, RetryOnNetworkChangedAndFail) {
937 EXPECT_EQ(0, GetNumFetcherCores());
938 EXPECT_FALSE(resolver_.has_pending_requests());
939
940 // This posts a task to start the fetcher.
941 CreateFetcher(test_url_);
942 fetcher_->SetAutomaticallyRetryOnNetworkChanges(3);
943 fetcher_->Start();
944 EXPECT_EQ(0, GetNumFetcherCores());
945 MessageLoop::current()->RunUntilIdle();
946
947 // The fetcher is now running, but is pending the host resolve.
948 EXPECT_EQ(1, GetNumFetcherCores());
949 EXPECT_TRUE(resolver_.has_pending_requests());
950 ASSERT_FALSE(completed_fetcher_);
951
952 // Make it fail 3 times.
953 for (int i = 0; i < 3; ++i) {
954 // A network change notification aborts the connect job.
955 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
956 MessageLoop::current()->RunUntilIdle();
957
958 // But the fetcher retries automatically.
959 EXPECT_EQ(1, GetNumFetcherCores());
960 EXPECT_TRUE(resolver_.has_pending_requests());
961 ASSERT_FALSE(completed_fetcher_);
962 }
963
964 // A 4th failure doesn't trigger another retry, and propagates the error
965 // to the owner of the fetcher.
966 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
967 MessageLoop::current()->RunUntilIdle();
968 EXPECT_EQ(0, GetNumFetcherCores());
969 EXPECT_FALSE(resolver_.has_pending_requests());
970 ASSERT_TRUE(completed_fetcher_);
971
972 // And the owner of the fetcher gets the ERR_NETWORK_CHANGED error.
973 EXPECT_EQ(ERR_NETWORK_CHANGED, completed_fetcher_->GetStatus().error());
974 }
975
976 TEST_F(URLFetcherMockDNSTest, RetryOnNetworkChangedAndSucceed) {
977 EXPECT_EQ(0, GetNumFetcherCores());
978 EXPECT_FALSE(resolver_.has_pending_requests());
979
980 // This posts a task to start the fetcher.
981 CreateFetcher(test_url_);
982 fetcher_->SetAutomaticallyRetryOnNetworkChanges(3);
983 fetcher_->Start();
984 EXPECT_EQ(0, GetNumFetcherCores());
985 MessageLoop::current()->RunUntilIdle();
986
987 // The fetcher is now running, but is pending the host resolve.
988 EXPECT_EQ(1, GetNumFetcherCores());
989 EXPECT_TRUE(resolver_.has_pending_requests());
990 ASSERT_FALSE(completed_fetcher_);
991
992 // Make it fail 3 times.
993 for (int i = 0; i < 3; ++i) {
994 // A network change notification aborts the connect job.
995 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
996 MessageLoop::current()->RunUntilIdle();
997
998 // But the fetcher retries automatically.
999 EXPECT_EQ(1, GetNumFetcherCores());
1000 EXPECT_TRUE(resolver_.has_pending_requests());
1001 ASSERT_FALSE(completed_fetcher_);
1002 }
1003
1004 // Now let it succeed by resolving the pending request.
1005 resolver_.ResolveAllPending();
1006 MessageLoop::current()->Run();
1007
1008 // URLFetcherMockDNSTest::OnURLFetchComplete() will quit the loop.
1009 EXPECT_EQ(0, GetNumFetcherCores());
1010 EXPECT_FALSE(resolver_.has_pending_requests());
1011 ASSERT_TRUE(completed_fetcher_);
1012
1013 // This time the request succeeded.
1014 EXPECT_EQ(OK, completed_fetcher_->GetStatus().error());
1015 EXPECT_EQ(200, completed_fetcher_->GetResponseCode());
1016 }
1017
1018 TEST_F(URLFetcherMockDNSTest, RetryAfterComingBackOnline) {
1019 EXPECT_EQ(0, GetNumFetcherCores());
1020 EXPECT_FALSE(resolver_.has_pending_requests());
1021
1022 // This posts a task to start the fetcher.
1023 CreateFetcher(test_url_);
1024 fetcher_->SetAutomaticallyRetryOnNetworkChanges(1);
1025 fetcher_->Start();
1026 EXPECT_EQ(0, GetNumFetcherCores());
1027 MessageLoop::current()->RunUntilIdle();
1028
1029 // The fetcher is now running, but is pending the host resolve.
1030 EXPECT_EQ(1, GetNumFetcherCores());
1031 EXPECT_TRUE(resolver_.has_pending_requests());
1032 ASSERT_FALSE(completed_fetcher_);
1033
1034 // Make it fail by changing the connection type to offline.
1035 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN,
1036 NetworkChangeNotifier::GetConnectionType());
1037 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
1038 network_change_notifier_->SetCurrentConnectionType(
1039 NetworkChangeNotifier::CONNECTION_NONE);
1040 // This makes the connect job fail:
1041 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
1042 resolver_.ResolveAllPending();
1043 MessageLoop::current()->RunUntilIdle();
1044
1045 // The fetcher is now waiting for the connection to become online again.
1046 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE,
1047 NetworkChangeNotifier::GetConnectionType());
1048 EXPECT_TRUE(NetworkChangeNotifier::IsOffline());
1049 EXPECT_FALSE(resolver_.has_pending_requests());
1050 ASSERT_FALSE(completed_fetcher_);
1051 // The core is still alive, but it dropped its request.
1052 EXPECT_EQ(0, GetNumFetcherCores());
1053
1054 // It should retry once the connection is back.
1055 network_change_notifier_->SetCurrentConnectionType(
1056 NetworkChangeNotifier::CONNECTION_WIFI);
1057 MessageLoop::current()->RunUntilIdle();
1058 EXPECT_EQ(1, GetNumFetcherCores());
1059 ASSERT_FALSE(completed_fetcher_);
1060 EXPECT_TRUE(resolver_.has_pending_requests());
1061
1062 // Resolve the pending request; the fetcher should complete now.
1063 resolver_.ResolveAllPending();
1064 MessageLoop::current()->Run();
1065
1066 EXPECT_EQ(0, GetNumFetcherCores());
1067 EXPECT_FALSE(resolver_.has_pending_requests());
1068 ASSERT_TRUE(completed_fetcher_);
1069 EXPECT_EQ(OK, completed_fetcher_->GetStatus().error());
1070 EXPECT_EQ(200, completed_fetcher_->GetResponseCode());
1071 }
1072
831 #if defined(OS_MACOSX) 1073 #if defined(OS_MACOSX)
832 // SIGSEGV on Mac: http://crbug.com/60426 1074 // SIGSEGV on Mac: http://crbug.com/60426
833 TEST_F(URLFetcherPostTest, DISABLED_Basic) { 1075 TEST_F(URLFetcherPostTest, DISABLED_Basic) {
834 #else 1076 #else
835 TEST_F(URLFetcherPostTest, Basic) { 1077 TEST_F(URLFetcherPostTest, Basic) {
836 #endif 1078 #endif
837 TestServer test_server(TestServer::TYPE_HTTP, 1079 TestServer test_server(TestServer::TYPE_HTTP,
838 TestServer::kLocalhost, 1080 TestServer::kLocalhost,
839 FilePath(kDocRoot)); 1081 FilePath(kDocRoot));
840 ASSERT_TRUE(test_server.Start()); 1082 ASSERT_TRUE(test_server.Start());
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
1271 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1513 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1272 1514
1273 MessageLoop::current()->RunUntilIdle(); 1515 MessageLoop::current()->RunUntilIdle();
1274 ASSERT_FALSE(file_util::PathExists(file_path_)) 1516 ASSERT_FALSE(file_util::PathExists(file_path_))
1275 << file_path_.value() << " not removed."; 1517 << file_path_.value() << " not removed.";
1276 } 1518 }
1277 1519
1278 } // namespace 1520 } // namespace
1279 1521
1280 } // namespace net 1522 } // 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