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 |