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