Index: net/url_request/url_request_unittest.cc |
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc |
index 57849cd695ee7060f7dc5891537e898f521fded4..c4cc1e11aa36b982e0d2f57e8ece54d8759ff410 100644 |
--- a/net/url_request/url_request_unittest.cc |
+++ b/net/url_request/url_request_unittest.cc |
@@ -3827,6 +3827,20 @@ class AsyncDelegateLogger : public base::RefCounted<AsyncDelegateLogger> { |
return log_position + 1; |
} |
+ static size_t ExpectBeforeNetworkStartBeginAndEnd( |
mmenke
2014/01/07 19:44:05
I find this name hard to parse.
Maybe just Expect
mmenke
2014/01/07 19:44:05
Also, should have some sort of comment.
jkarlin
2014/01/07 20:10:03
Done.
jkarlin
2014/01/07 20:10:03
Done.
|
+ const CapturingNetLog::CapturedEntryList& entries, |
+ size_t log_position) { |
+ log_position = |
+ ExpectLogContainsSomewhereAfter(entries, |
+ log_position, |
+ NetLog::TYPE_URL_REQUEST_DELEGATE, |
+ NetLog::PHASE_BEGIN); |
+ EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, |
+ entries[log_position + 1].type); |
+ EXPECT_EQ(NetLog::PHASE_END, entries[log_position + 1].phase); |
+ return log_position + 1; |
+ } |
+ |
private: |
friend class base::RefCounted<AsyncDelegateLogger>; |
@@ -4141,6 +4155,11 @@ TEST_F(URLRequestTestHTTP, NetworkDelegateInfo) { |
ASSERT_LT(log_position, entries.size()); |
EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); |
EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); |
+ |
+ if (i == 1) { |
+ log_position = AsyncDelegateLogger::ExpectBeforeNetworkStartBeginAndEnd( |
+ entries, log_position + 1); |
+ } |
} |
EXPECT_FALSE(LogContainsEntryWithTypeAfter( |
@@ -4196,6 +4215,11 @@ TEST_F(URLRequestTestHTTP, NetworkDelegateInfoRedirect) { |
ASSERT_LT(log_position, entries.size()); |
EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); |
EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); |
+ |
+ if (i == 1) { |
+ log_position = AsyncDelegateLogger::ExpectBeforeNetworkStartBeginAndEnd( |
+ entries, log_position + 1); |
+ } |
} |
// The URLRequest::Delegate then gets informed about the redirect. |
@@ -4275,6 +4299,11 @@ TEST_F(URLRequestTestHTTP, NetworkDelegateInfoAuth) { |
ASSERT_LT(log_position, entries.size()); |
EXPECT_EQ(NetLog::TYPE_URL_REQUEST_DELEGATE, entries[log_position].type); |
EXPECT_EQ(NetLog::PHASE_END, entries[log_position].phase); |
+ |
+ if (i == 1) { |
+ log_position = AsyncDelegateLogger::ExpectBeforeNetworkStartBeginAndEnd( |
+ entries, log_position + 1); |
+ } |
} |
EXPECT_FALSE(LogContainsEntryWithTypeAfter( |
@@ -4296,7 +4325,7 @@ TEST_F(URLRequestTestHTTP, URLRequestDelegateInfo) { |
// A chunked response with delays between chunks is used to make sure that |
// attempts by the URLRequest delegate to log information while reading the |
// body are ignored. Since they are ignored, this test is robust against |
- // the possability of multiple reads being combined in the unlikely event |
+ // the possibility of multiple reads being combined in the unlikely event |
// that it occurs. |
URLRequest r(test_server_.GetURL("chunked?waitBetweenChunks=20"), |
DEFAULT_PRIORITY, |
@@ -4313,14 +4342,18 @@ TEST_F(URLRequestTestHTTP, URLRequestDelegateInfo) { |
CapturingNetLog::CapturedEntryList entries; |
net_log_.GetEntries(&entries); |
+ size_t log_position = 0; |
+ |
+ log_position = AsyncDelegateLogger::ExpectBeforeNetworkStartBeginAndEnd( |
+ entries, log_position); |
+ |
// The delegate info should only have been logged on header complete. Other |
// times it should silently be ignored. |
- |
- size_t log_position = ExpectLogContainsSomewhereAfter( |
- entries, |
- 0, |
- NetLog::TYPE_URL_REQUEST_DELEGATE, |
- NetLog::PHASE_BEGIN); |
+ log_position = |
+ ExpectLogContainsSomewhereAfter(entries, |
+ log_position + 1, |
+ NetLog::TYPE_URL_REQUEST_DELEGATE, |
+ NetLog::PHASE_BEGIN); |
log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, |
log_position + 1); |
@@ -4367,6 +4400,11 @@ TEST_F(URLRequestTestHTTP, URLRequestDelegateInfoOnRedirect) { |
// OnResponseStarted. |
size_t log_position = 0; |
for (int i = 0; i < 2; ++i) { |
+ if (i == 0) { |
+ log_position = AsyncDelegateLogger::ExpectBeforeNetworkStartBeginAndEnd( |
+ entries, log_position) + 1; |
+ } |
+ |
log_position = ExpectLogContainsSomewhereAfter( |
entries, |
log_position, |
@@ -4427,6 +4465,11 @@ TEST_F(URLRequestTestHTTP, URLRequestDelegateOnRedirectCancelled) { |
// still currently supported in that call. |
size_t log_position = 0; |
for (int i = 0; i < 2; ++i) { |
+ if (i == 0) { |
+ log_position = AsyncDelegateLogger::ExpectBeforeNetworkStartBeginAndEnd( |
+ entries, log_position) + 1; |
+ } |
+ |
log_position = ExpectLogContainsSomewhereAfter( |
entries, |
log_position, |
@@ -5184,6 +5227,95 @@ TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) { |
EXPECT_EQ(std::string("None"), d.data_received()); |
} |
+// Defer network start and then resume, checking that the request was a success |
+// and bytes were received. |
+TEST_F(URLRequestTestHTTP, DeferredBeforeNetworkStart) { |
+ ASSERT_TRUE(test_server_.Start()); |
+ |
+ TestDelegate d; |
+ { |
+ d.set_quit_on_network_start(true); |
+ GURL test_url(test_server_.GetURL("echo")); |
+ URLRequest req(test_url, DEFAULT_PRIORITY, &d, &default_context_); |
+ |
+ req.Start(); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_EQ(1, d.received_before_network_start_count()); |
+ EXPECT_EQ(0, d.response_started_count()); |
+ |
+ req.ResumeNetworkStart(); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_EQ(1, d.response_started_count()); |
+ EXPECT_NE(0, d.bytes_received()); |
+ EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); |
+ } |
+} |
+ |
+// Check that OnBeforeNetworkStart is only called once even if there is a |
+// redirect. |
+TEST_F(URLRequestTestHTTP, BeforeNetworkStartCalledOnce) { |
+ ASSERT_TRUE(test_server_.Start()); |
+ |
+ TestDelegate d; |
+ { |
+ d.set_quit_on_redirect(true); |
+ d.set_quit_on_network_start(true); |
+ URLRequest req(test_server_.GetURL("server-redirect?simple.html"), |
mmenke
2014/01/07 19:44:05
Why do we use simple.html here and echo in the oth
jkarlin
2014/01/07 20:10:03
Done.
|
+ DEFAULT_PRIORITY, |
+ &d, |
+ &default_context_); |
+ |
+ req.Start(); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_EQ(1, d.received_before_network_start_count()); |
+ EXPECT_EQ(0, d.response_started_count()); |
+ EXPECT_EQ(0, d.received_redirect_count()); |
+ |
+ req.ResumeNetworkStart(); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_EQ(1, d.received_redirect_count()); |
+ req.FollowDeferredRedirect(); |
+ base::RunLoop().Run(); |
+ |
+ // Check that the redirect's new network transaction does not get propagated |
+ // to a second OnBeforeNetworkStart() notification. |
+ EXPECT_EQ(1, d.received_before_network_start_count()); |
+ |
+ EXPECT_EQ(1, d.response_started_count()); |
+ EXPECT_NE(0, d.bytes_received()); |
+ EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); |
+ } |
+} |
+ |
+// Cancel the request after learning that the request would use the network. |
+TEST_F(URLRequestTestHTTP, CancelOnBeforeNetworkStart) { |
+ ASSERT_TRUE(test_server_.Start()); |
+ |
+ TestDelegate d; |
+ { |
+ d.set_quit_on_network_start(true); |
+ GURL test_url(test_server_.GetURL("echo")); |
+ URLRequest req(test_url, DEFAULT_PRIORITY, &d, &default_context_); |
+ |
+ req.Start(); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_EQ(1, d.received_before_network_start_count()); |
+ EXPECT_EQ(0, d.response_started_count()); |
+ |
+ req.Cancel(); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_EQ(1, d.response_started_count()); |
+ EXPECT_EQ(0, d.bytes_received()); |
+ EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); |
+ } |
+} |
+ |
TEST_F(URLRequestTestHTTP, CancelRedirect) { |
ASSERT_TRUE(test_server_.Start()); |