Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: net/spdy/spdy_proxy_client_socket_unittest.cc

Issue 305823003: Re-land: Defer SpdySession destruction to support closing writes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Regression tests and fix for crbug.com/379469 Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_proxy_client_socket.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_proxy_client_socket.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698