| OLD | NEW |
| 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/spdy/spdy_proxy_client_socket.h" | 5 #include "net/spdy/spdy_proxy_client_socket.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "net/base/address_list.h" | 10 #include "net/base/address_list.h" |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 proxy_host_port_(kProxyHost, kProxyPort), | 157 proxy_host_port_(kProxyHost, kProxyPort), |
| 158 endpoint_host_port_pair_(kOriginHost, kOriginPort), | 158 endpoint_host_port_pair_(kOriginHost, kOriginPort), |
| 159 proxy_(ProxyServer::SCHEME_HTTPS, proxy_host_port_), | 159 proxy_(ProxyServer::SCHEME_HTTPS, proxy_host_port_), |
| 160 endpoint_spdy_session_key_(endpoint_host_port_pair_, | 160 endpoint_spdy_session_key_(endpoint_host_port_pair_, |
| 161 proxy_, | 161 proxy_, |
| 162 PRIVACY_MODE_DISABLED) { | 162 PRIVACY_MODE_DISABLED) { |
| 163 session_deps_.net_log = net_log_.bound().net_log(); | 163 session_deps_.net_log = net_log_.bound().net_log(); |
| 164 } | 164 } |
| 165 | 165 |
| 166 void SpdyProxyClientSocketTest::TearDown() { | 166 void SpdyProxyClientSocketTest::TearDown() { |
| 167 sock_.reset(NULL); |
| 167 if (session_.get() != NULL) | 168 if (session_.get() != NULL) |
| 168 session_->spdy_session_pool()->CloseAllSessions(); | 169 session_->spdy_session_pool()->CloseAllSessions(); |
| 169 | 170 |
| 170 // Empty the current queue. | 171 // Empty the current queue. |
| 171 base::MessageLoop::current()->RunUntilIdle(); | 172 base::MessageLoop::current()->RunUntilIdle(); |
| 172 PlatformTest::TearDown(); | 173 PlatformTest::TearDown(); |
| 173 } | 174 } |
| 174 | 175 |
| 175 void SpdyProxyClientSocketTest::Initialize(MockRead* reads, | 176 void SpdyProxyClientSocketTest::Initialize(MockRead* reads, |
| 176 size_t reads_count, | 177 size_t reads_count, |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 441 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 441 AddAuthToCache(); | 442 AddAuthToCache(); |
| 442 | 443 |
| 443 AssertConnectSucceeds(); | 444 AssertConnectSucceeds(); |
| 444 | 445 |
| 445 AssertConnectionEstablished(); | 446 AssertConnectionEstablished(); |
| 446 } | 447 } |
| 447 | 448 |
| 448 TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) { | 449 TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) { |
| 449 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 450 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 450 scoped_ptr<SpdyFrame> rst( | |
| 451 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | |
| 452 MockWrite writes[] = { | 451 MockWrite writes[] = { |
| 453 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 2), | 452 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 454 }; | 453 }; |
| 455 | 454 |
| 456 scoped_ptr<SpdyFrame> resp(ConstructConnectRedirectReplyFrame()); | 455 scoped_ptr<SpdyFrame> resp(ConstructConnectRedirectReplyFrame()); |
| 457 MockRead reads[] = { | 456 MockRead reads[] = { |
| 458 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), // EOF | 457 CreateMockRead(*resp, 1, ASYNC), |
| 458 MockRead(ASYNC, 0, 2), // EOF |
| 459 }; | 459 }; |
| 460 | 460 |
| 461 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 461 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 462 | 462 |
| 463 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); | 463 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); |
| 464 | 464 |
| 465 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 465 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
| 466 ASSERT_TRUE(response != NULL); | 466 ASSERT_TRUE(response != NULL); |
| 467 | 467 |
| 468 const HttpResponseHeaders* headers = response->headers.get(); | 468 const HttpResponseHeaders* headers = response->headers.get(); |
| 469 ASSERT_EQ(302, headers->response_code()); | 469 ASSERT_EQ(302, headers->response_code()); |
| 470 ASSERT_FALSE(headers->HasHeader("set-cookie")); | 470 ASSERT_FALSE(headers->HasHeader("set-cookie")); |
| 471 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); | 471 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); |
| 472 | 472 |
| 473 std::string location; | 473 std::string location; |
| 474 ASSERT_TRUE(headers->IsRedirect(&location)); | 474 ASSERT_TRUE(headers->IsRedirect(&location)); |
| 475 ASSERT_EQ(location, kRedirectUrl); | 475 ASSERT_EQ(location, kRedirectUrl); |
| 476 | |
| 477 // Let the RST_STREAM write while |rst| is in-scope. | |
| 478 base::MessageLoop::current()->RunUntilIdle(); | |
| 479 } | 476 } |
| 480 | 477 |
| 481 TEST_P(SpdyProxyClientSocketTest, ConnectFails) { | 478 TEST_P(SpdyProxyClientSocketTest, ConnectFails) { |
| 482 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 479 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 483 MockWrite writes[] = { | 480 MockWrite writes[] = { |
| 484 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 481 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 485 }; | 482 }; |
| 486 | 483 |
| 487 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 484 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 488 MockRead reads[] = { | 485 MockRead reads[] = { |
| 489 MockRead(ASYNC, 0, 1), // EOF | 486 MockRead(ASYNC, 0, 1), // EOF |
| 490 }; | 487 }; |
| 491 | 488 |
| 492 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 489 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 493 | 490 |
| 494 ASSERT_FALSE(sock_->IsConnected()); | 491 ASSERT_FALSE(sock_->IsConnected()); |
| 495 | 492 |
| 496 AssertConnectFails(ERR_CONNECTION_CLOSED); | 493 AssertConnectFails(ERR_CONNECTION_CLOSED); |
| 497 | 494 |
| 498 ASSERT_FALSE(sock_->IsConnected()); | 495 ASSERT_FALSE(sock_->IsConnected()); |
| 499 } | 496 } |
| 500 | 497 |
| 501 // ----------- WasEverUsed | 498 // ----------- WasEverUsed |
| 502 | 499 |
| 503 TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) { | 500 TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) { |
| 504 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 501 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 505 scoped_ptr<SpdyFrame> rst( | |
| 506 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | |
| 507 MockWrite writes[] = { | 502 MockWrite writes[] = { |
| 508 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 2), | 503 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 509 }; | 504 }; |
| 510 | 505 |
| 511 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 506 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 512 MockRead reads[] = { | 507 MockRead reads[] = { |
| 513 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), // EOF | 508 CreateMockRead(*resp, 1, ASYNC), |
| 509 MockRead(ASYNC, 0, 2), // EOF |
| 514 }; | 510 }; |
| 515 | 511 |
| 516 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 512 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 517 | 513 |
| 518 EXPECT_FALSE(sock_->WasEverUsed()); | 514 EXPECT_FALSE(sock_->WasEverUsed()); |
| 519 AssertConnectSucceeds(); | 515 AssertConnectSucceeds(); |
| 520 EXPECT_TRUE(sock_->WasEverUsed()); | 516 EXPECT_TRUE(sock_->WasEverUsed()); |
| 521 sock_->Disconnect(); | 517 sock_->Disconnect(); |
| 522 EXPECT_TRUE(sock_->WasEverUsed()); | 518 EXPECT_TRUE(sock_->WasEverUsed()); |
| 523 | |
| 524 // Let the RST_STREAM write while |rst| is in-scope. | |
| 525 base::MessageLoop::current()->RunUntilIdle(); | |
| 526 } | 519 } |
| 527 | 520 |
| 528 // ----------- GetPeerAddress | 521 // ----------- GetPeerAddress |
| 529 | 522 |
| 530 TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) { | 523 TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) { |
| 531 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 524 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 532 MockWrite writes[] = { | 525 MockWrite writes[] = { |
| 533 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 526 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 534 }; | 527 }; |
| 535 | 528 |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 987 | 980 |
| 988 Run(1); | 981 Run(1); |
| 989 | 982 |
| 990 ASSERT_EQ(0, read_callback_.WaitForResult()); | 983 ASSERT_EQ(0, read_callback_.WaitForResult()); |
| 991 } | 984 } |
| 992 | 985 |
| 993 // Reading from a disconnected socket is an error | 986 // Reading from a disconnected socket is an error |
| 994 TEST_P(SpdyProxyClientSocketTest, | 987 TEST_P(SpdyProxyClientSocketTest, |
| 995 ReadOnDisconnectSocketReturnsNotConnected) { | 988 ReadOnDisconnectSocketReturnsNotConnected) { |
| 996 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 989 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 997 scoped_ptr<SpdyFrame> rst( | |
| 998 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | |
| 999 MockWrite writes[] = { | 990 MockWrite writes[] = { |
| 1000 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 2), | 991 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1001 }; | 992 }; |
| 1002 | 993 |
| 1003 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 994 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1004 MockRead reads[] = { | 995 MockRead reads[] = { |
| 1005 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), // EOF | 996 CreateMockRead(*resp, 1, ASYNC), |
| 997 MockRead(ASYNC, 0, 2), // EOF |
| 1006 }; | 998 }; |
| 1007 | 999 |
| 1008 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1000 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1009 | 1001 |
| 1010 AssertConnectSucceeds(); | 1002 AssertConnectSucceeds(); |
| 1011 | 1003 |
| 1012 sock_->Disconnect(); | 1004 sock_->Disconnect(); |
| 1013 | 1005 |
| 1014 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1006 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1015 sock_->Read(NULL, 1, CompletionCallback())); | 1007 sock_->Read(NULL, 1, CompletionCallback())); |
| 1016 | |
| 1017 // Let the RST_STREAM write while |rst| is in-scope. | |
| 1018 base::MessageLoop::current()->RunUntilIdle(); | |
| 1019 } | 1008 } |
| 1020 | 1009 |
| 1021 // Reading buffered data from an already closed socket should return | 1010 // Reading buffered data from an already closed socket should return |
| 1022 // buffered data, then 0. | 1011 // buffered data, then 0. |
| 1023 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { | 1012 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { |
| 1024 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1013 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1025 MockWrite writes[] = { | 1014 MockWrite writes[] = { |
| 1026 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1015 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1027 }; | 1016 }; |
| 1028 | 1017 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1072 | 1061 |
| 1073 Run(1); // Read EOF which will close the stream | 1062 Run(1); // Read EOF which will close the stream |
| 1074 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1063 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1075 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1064 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1076 sock_->Write(buf.get(), buf->size(), CompletionCallback())); | 1065 sock_->Write(buf.get(), buf->size(), CompletionCallback())); |
| 1077 } | 1066 } |
| 1078 | 1067 |
| 1079 // Calling Write() on a disconnected socket is an error | 1068 // Calling Write() on a disconnected socket is an error |
| 1080 TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { | 1069 TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { |
| 1081 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1070 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1082 scoped_ptr<SpdyFrame> rst( | |
| 1083 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | |
| 1084 MockWrite writes[] = { | 1071 MockWrite writes[] = { |
| 1085 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 2), | 1072 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1086 }; | 1073 }; |
| 1087 | 1074 |
| 1088 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1075 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1089 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1076 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1090 MockRead reads[] = { | 1077 MockRead reads[] = { |
| 1091 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), // EOF | 1078 CreateMockRead(*resp, 1, ASYNC), |
| 1079 MockRead(ASYNC, 0, 2), // EOF |
| 1092 }; | 1080 }; |
| 1093 | 1081 |
| 1094 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1082 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1095 | 1083 |
| 1096 AssertConnectSucceeds(); | 1084 AssertConnectSucceeds(); |
| 1097 | 1085 |
| 1098 sock_->Disconnect(); | 1086 sock_->Disconnect(); |
| 1099 | 1087 |
| 1100 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1088 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1101 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1089 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1102 sock_->Write(buf.get(), buf->size(), CompletionCallback())); | 1090 sock_->Write(buf.get(), buf->size(), CompletionCallback())); |
| 1103 | |
| 1104 // Let the RST_STREAM write while |rst| is in-scope. | |
| 1105 base::MessageLoop::current()->RunUntilIdle(); | |
| 1106 } | 1091 } |
| 1107 | 1092 |
| 1108 // If the socket is closed with a pending Write(), the callback | 1093 // If the socket is closed with a pending Write(), the callback |
| 1109 // should be called with ERR_CONNECTION_CLOSED. | 1094 // should be called with ERR_CONNECTION_CLOSED. |
| 1110 TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) { | 1095 TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) { |
| 1111 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1096 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1112 MockWrite writes[] = { | 1097 MockWrite writes[] = { |
| 1113 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1098 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1114 MockWrite(ASYNC, ERR_ABORTED, 2), | 1099 MockWrite(ASYNC, ERR_ABORTED, 2), |
| 1115 }; | 1100 }; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1132 | 1117 |
| 1133 CloseSpdySession(ERR_ABORTED, std::string()); | 1118 CloseSpdySession(ERR_ABORTED, std::string()); |
| 1134 | 1119 |
| 1135 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); | 1120 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); |
| 1136 } | 1121 } |
| 1137 | 1122 |
| 1138 // If the socket is Disconnected with a pending Write(), the callback | 1123 // If the socket is Disconnected with a pending Write(), the callback |
| 1139 // should not be called. | 1124 // should not be called. |
| 1140 TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) { | 1125 TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) { |
| 1141 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1126 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1142 scoped_ptr<SpdyFrame> rst( | |
| 1143 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | |
| 1144 MockWrite writes[] = { | 1127 MockWrite writes[] = { |
| 1145 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 2), | 1128 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1146 MockWrite(SYNCHRONOUS, 0, 3), // EOF | 1129 MockWrite(SYNCHRONOUS, 0, 2), // EOF |
| 1147 }; | 1130 }; |
| 1148 | 1131 |
| 1149 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1132 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1150 MockRead reads[] = { | 1133 MockRead reads[] = { |
| 1151 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 4), // EOF | 1134 CreateMockRead(*resp, 1, ASYNC), |
| 1135 MockRead(ASYNC, 0, 3), // EOF |
| 1152 }; | 1136 }; |
| 1153 | 1137 |
| 1154 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1138 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1155 | 1139 |
| 1156 AssertConnectSucceeds(); | 1140 AssertConnectSucceeds(); |
| 1157 | 1141 |
| 1158 EXPECT_TRUE(sock_->IsConnected()); | 1142 EXPECT_TRUE(sock_->IsConnected()); |
| 1159 | 1143 |
| 1160 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1144 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1161 EXPECT_EQ(ERR_IO_PENDING, | 1145 EXPECT_EQ(ERR_IO_PENDING, |
| 1162 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 1146 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
| 1163 | 1147 |
| 1164 sock_->Disconnect(); | 1148 sock_->Disconnect(); |
| 1165 | 1149 |
| 1166 EXPECT_FALSE(sock_->IsConnected()); | 1150 EXPECT_FALSE(sock_->IsConnected()); |
| 1167 EXPECT_FALSE(write_callback_.have_result()); | 1151 EXPECT_FALSE(write_callback_.have_result()); |
| 1168 | |
| 1169 // Let the RST_STREAM write while |rst| is in-scope. | |
| 1170 base::MessageLoop::current()->RunUntilIdle(); | |
| 1171 } | 1152 } |
| 1172 | 1153 |
| 1173 // If the socket is Disconnected with a pending Read(), the callback | 1154 // If the socket is Disconnected with a pending Read(), the callback |
| 1174 // should not be called. | 1155 // should not be called. |
| 1175 TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) { | 1156 TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) { |
| 1176 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1157 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1177 scoped_ptr<SpdyFrame> rst( | |
| 1178 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | |
| 1179 MockWrite writes[] = { | 1158 MockWrite writes[] = { |
| 1180 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 2), | 1159 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1181 }; | 1160 }; |
| 1182 | 1161 |
| 1183 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1162 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1184 MockRead reads[] = { | 1163 MockRead reads[] = { |
| 1185 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), // EOF | 1164 CreateMockRead(*resp, 1, ASYNC), |
| 1165 MockRead(ASYNC, 0, 2), // EOF |
| 1186 }; | 1166 }; |
| 1187 | 1167 |
| 1188 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1168 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1189 | 1169 |
| 1190 AssertConnectSucceeds(); | 1170 AssertConnectSucceeds(); |
| 1191 | 1171 |
| 1192 EXPECT_TRUE(sock_->IsConnected()); | 1172 EXPECT_TRUE(sock_->IsConnected()); |
| 1193 | 1173 |
| 1194 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1174 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
| 1195 ASSERT_EQ(ERR_IO_PENDING, | 1175 ASSERT_EQ(ERR_IO_PENDING, |
| 1196 sock_->Read(buf.get(), kLen1, read_callback_.callback())); | 1176 sock_->Read(buf.get(), kLen1, read_callback_.callback())); |
| 1197 | 1177 |
| 1198 sock_->Disconnect(); | 1178 sock_->Disconnect(); |
| 1199 | 1179 |
| 1200 EXPECT_FALSE(sock_->IsConnected()); | 1180 EXPECT_FALSE(sock_->IsConnected()); |
| 1201 EXPECT_FALSE(read_callback_.have_result()); | 1181 EXPECT_FALSE(read_callback_.have_result()); |
| 1202 | |
| 1203 // Let the RST_STREAM write while |rst| is in-scope. | |
| 1204 base::MessageLoop::current()->RunUntilIdle(); | |
| 1205 } | 1182 } |
| 1206 | 1183 |
| 1207 // If the socket is Reset when both a read and write are pending, | 1184 // If the socket is Reset when both a read and write are pending, |
| 1208 // both should be called back. | 1185 // both should be called back. |
| 1209 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { | 1186 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { |
| 1210 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1187 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1211 MockWrite writes[] = { | 1188 MockWrite writes[] = { |
| 1212 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1189 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1213 MockWrite(ASYNC, ERR_ABORTED, 3), | 1190 MockWrite(ASYNC, ERR_ABORTED, 3), |
| 1214 }; | 1191 }; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1236 EXPECT_EQ( | 1213 EXPECT_EQ( |
| 1237 ERR_IO_PENDING, | 1214 ERR_IO_PENDING, |
| 1238 sock_->Write( | 1215 sock_->Write( |
| 1239 write_buf.get(), write_buf->size(), write_callback_.callback())); | 1216 write_buf.get(), write_buf->size(), write_callback_.callback())); |
| 1240 | 1217 |
| 1241 Run(2); | 1218 Run(2); |
| 1242 | 1219 |
| 1243 EXPECT_TRUE(sock_.get()); | 1220 EXPECT_TRUE(sock_.get()); |
| 1244 EXPECT_TRUE(read_callback_.have_result()); | 1221 EXPECT_TRUE(read_callback_.have_result()); |
| 1245 EXPECT_TRUE(write_callback_.have_result()); | 1222 EXPECT_TRUE(write_callback_.have_result()); |
| 1246 | |
| 1247 // Let the RST_STREAM write while |rst| is in-scope. | |
| 1248 base::MessageLoop::current()->RunUntilIdle(); | |
| 1249 } | 1223 } |
| 1250 | 1224 |
| 1251 // Makes sure the proxy client socket's source gets the expected NetLog events | 1225 // Makes sure the proxy client socket's source gets the expected NetLog events |
| 1252 // and only the expected NetLog events (No SpdySession events). | 1226 // and only the expected NetLog events (No SpdySession events). |
| 1253 TEST_P(SpdyProxyClientSocketTest, NetLog) { | 1227 TEST_P(SpdyProxyClientSocketTest, NetLog) { |
| 1254 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1228 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1255 scoped_ptr<SpdyFrame> rst( | |
| 1256 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | |
| 1257 MockWrite writes[] = { | 1229 MockWrite writes[] = { |
| 1258 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3), | 1230 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1259 }; | 1231 }; |
| 1260 | 1232 |
| 1261 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1233 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1262 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1234 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1263 MockRead reads[] = { | 1235 MockRead reads[] = { |
| 1264 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), | 1236 CreateMockRead(*resp, 1, ASYNC), |
| 1265 MockRead(ASYNC, 0, 4), // EOF | 1237 CreateMockRead(*msg1, 2, ASYNC), |
| 1238 MockRead(ASYNC, 0, 3), // EOF |
| 1266 }; | 1239 }; |
| 1267 | 1240 |
| 1268 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1241 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1269 | 1242 |
| 1270 AssertConnectSucceeds(); | 1243 AssertConnectSucceeds(); |
| 1271 | 1244 |
| 1272 Run(1); // SpdySession consumes the next read and sends it to | 1245 Run(1); // SpdySession consumes the next read and sends it to |
| 1273 // sock_ to be buffered. | 1246 // sock_ to be buffered. |
| 1274 AssertSyncReadEquals(kMsg1, kLen1); | 1247 AssertSyncReadEquals(kMsg1, kLen1); |
| 1275 | 1248 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1295 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); | 1268 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); |
| 1296 EXPECT_TRUE(LogContainsEvent(entry_list, 6, | 1269 EXPECT_TRUE(LogContainsEvent(entry_list, 6, |
| 1297 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 1270 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
| 1298 NetLog::PHASE_NONE)); | 1271 NetLog::PHASE_NONE)); |
| 1299 EXPECT_TRUE(LogContainsEndEvent(entry_list, 7, | 1272 EXPECT_TRUE(LogContainsEndEvent(entry_list, 7, |
| 1300 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); | 1273 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); |
| 1301 EXPECT_TRUE(LogContainsEvent(entry_list, 8, | 1274 EXPECT_TRUE(LogContainsEvent(entry_list, 8, |
| 1302 NetLog::TYPE_SOCKET_BYTES_RECEIVED, | 1275 NetLog::TYPE_SOCKET_BYTES_RECEIVED, |
| 1303 NetLog::PHASE_NONE)); | 1276 NetLog::PHASE_NONE)); |
| 1304 EXPECT_TRUE(LogContainsEndEvent(entry_list, 9, NetLog::TYPE_SOCKET_ALIVE)); | 1277 EXPECT_TRUE(LogContainsEndEvent(entry_list, 9, NetLog::TYPE_SOCKET_ALIVE)); |
| 1305 | |
| 1306 // Let the RST_STREAM write while |rst| is in-scope. | |
| 1307 base::MessageLoop::current()->RunUntilIdle(); | |
| 1308 } | 1278 } |
| 1309 | 1279 |
| 1310 // CompletionCallback that causes the SpdyProxyClientSocket to be | 1280 // CompletionCallback that causes the SpdyProxyClientSocket to be |
| 1311 // deleted when Run is invoked. | 1281 // deleted when Run is invoked. |
| 1312 class DeleteSockCallback : public TestCompletionCallbackBase { | 1282 class DeleteSockCallback : public TestCompletionCallbackBase { |
| 1313 public: | 1283 public: |
| 1314 explicit DeleteSockCallback(scoped_ptr<SpdyProxyClientSocket>* sock) | 1284 explicit DeleteSockCallback(scoped_ptr<SpdyProxyClientSocket>* sock) |
| 1315 : sock_(sock), | 1285 : sock_(sock), |
| 1316 callback_(base::Bind(&DeleteSockCallback::OnComplete, | 1286 callback_(base::Bind(&DeleteSockCallback::OnComplete, |
| 1317 base::Unretained(this))) { | 1287 base::Unretained(this))) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1369 EXPECT_EQ( | 1339 EXPECT_EQ( |
| 1370 ERR_IO_PENDING, | 1340 ERR_IO_PENDING, |
| 1371 sock_->Write( | 1341 sock_->Write( |
| 1372 write_buf.get(), write_buf->size(), write_callback_.callback())); | 1342 write_buf.get(), write_buf->size(), write_callback_.callback())); |
| 1373 | 1343 |
| 1374 Run(1); | 1344 Run(1); |
| 1375 | 1345 |
| 1376 EXPECT_FALSE(sock_.get()); | 1346 EXPECT_FALSE(sock_.get()); |
| 1377 EXPECT_TRUE(read_callback.have_result()); | 1347 EXPECT_TRUE(read_callback.have_result()); |
| 1378 EXPECT_FALSE(write_callback_.have_result()); | 1348 EXPECT_FALSE(write_callback_.have_result()); |
| 1379 | |
| 1380 // Let the RST_STREAM write while |rst| is in-scope. | |
| 1381 base::MessageLoop::current()->RunUntilIdle(); | |
| 1382 } | 1349 } |
| 1383 | 1350 |
| 1384 } // namespace net | 1351 } // namespace net |
| OLD | NEW |