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 |