Index: net/http/http_network_transaction_unittest.cc |
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc |
index 9cb8ea905367b8a61b3658c44d02ea9ec179f29c..8d4e7cfb0377ec366c690a17705d66cbedfe8e31 100644 |
--- a/net/http/http_network_transaction_unittest.cc |
+++ b/net/http/http_network_transaction_unittest.cc |
@@ -9328,6 +9328,75 @@ TEST_P(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { |
EXPECT_EQ("hello!", response_data); |
} |
+// A request to a server with an alternative service fires two Jobs: one to the |
+// origin, and an alternate one to the alternative server. If the former |
+// succeeds but the latter fails, the request should succeed. |
+TEST_P(HttpNetworkTransactionTest, FailedAlternativeServiceIsNotUserVisible) { |
+ HostPortPair origin("origin.example.org", 443); |
+ HostPortPair alternative("alternative.example.org", 443); |
+ |
+ // Connection to alternative server fails. |
+ StaticSocketDataProvider refused_data; |
+ refused_data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED)); |
Ryan Hamilton
2015/05/08 21:20:26
I was thinking that this would be testing the "don
Bence
2015/05/11 16:11:29
Oh okay. Sorry it wasn't clear to me from https:/
|
+ session_deps_.socket_factory->AddSocketDataProvider(&refused_data); |
+ |
+ // Connection to origin server succeeds. |
+ SSLSocketDataProvider ssl(ASYNC, OK); |
+ ssl.SetNextProto(kProtoHTTP11); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ |
+ MockWrite http_writes[] = { |
+ MockWrite( |
+ "GET / HTTP/1.1\r\n" |
+ "Host: origin.example.org\r\n" |
+ "Connection: keep-alive\r\n\r\n"), |
+ }; |
+ |
+ MockRead http_reads[] = { |
+ MockRead("HTTP/1.1 200 OK\r\n"), |
+ MockRead("Content-Type: text/html\r\n"), |
+ MockRead("Content-Length: 6\r\n\r\n"), |
+ MockRead("foobar"), |
+ }; |
+ StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
+ http_writes, arraysize(http_writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&http_data); |
+ |
+ // Set up alternative service for origin. |
+ session_deps_.use_alternate_protocols = true; |
+ scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
+ base::WeakPtr<HttpServerProperties> http_server_properties = |
+ session->http_server_properties(); |
+ AlternativeService alternative_service( |
+ AlternateProtocolFromNextProto(GetParam()), alternative); |
+ http_server_properties->SetAlternativeService(origin, alternative_service, |
+ 1.0); |
+ |
+ HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("https://origin.example.org:443"); |
+ request.load_flags = 0; |
+ TestCompletionCallback callback; |
+ |
+ int rv = trans.Start(&request, callback.callback(), BoundNetLog()); |
+ rv = callback.GetResult(rv); |
+ EXPECT_EQ(OK, rv); |
+ |
+ const HttpResponseInfo* response = trans.GetResponseInfo(); |
+ ASSERT_TRUE(response != nullptr); |
+ ASSERT_TRUE(response->headers.get() != nullptr); |
+ EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
+ |
+ std::string response_data; |
+ ASSERT_EQ(OK, ReadTransaction(&trans, &response_data)); |
+ EXPECT_EQ("foobar", response_data); |
+ |
+ // Failure to alternative server should be recorded in HttpServerProperties. |
+ EXPECT_TRUE( |
+ http_server_properties->IsAlternativeServiceBroken(alternative_service)); |
+} |
Ryan Hamilton
2015/05/08 21:20:26
Looks great. Can you add a second transaction and
Bence
2015/05/11 16:11:29
Done.
|
+ |
TEST_P(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { |
session_deps_.use_alternate_protocols = true; |
session_deps_.next_protos = SpdyNextProtos(); |