OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
8 #include "net/base/address_list.h" | 8 #include "net/base/address_list.h" |
9 #include "net/base/net_log.h" | 9 #include "net/base/net_log.h" |
10 #include "net/base/net_log_unittest.h" | 10 #include "net/base/net_log_unittest.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 AuthCredentials(kFoo, kBar), | 93 AuthCredentials(kFoo, kBar), |
94 "/"); | 94 "/"); |
95 } | 95 } |
96 | 96 |
97 void Run(int steps) { | 97 void Run(int steps) { |
98 data_->StopAfter(steps); | 98 data_->StopAfter(steps); |
99 data_->Run(); | 99 data_->Run(); |
100 } | 100 } |
101 | 101 |
102 scoped_ptr<SpdyProxyClientSocket> sock_; | 102 scoped_ptr<SpdyProxyClientSocket> sock_; |
103 TestOldCompletionCallback read_callback_; | 103 TestCompletionCallback read_callback_; |
104 TestOldCompletionCallback write_callback_; | 104 TestOldCompletionCallback read_callback_old_; |
| 105 TestCompletionCallback write_callback_; |
105 scoped_refptr<DeterministicSocketData> data_; | 106 scoped_refptr<DeterministicSocketData> data_; |
106 | 107 |
107 private: | 108 private: |
108 scoped_refptr<HttpNetworkSession> session_; | 109 scoped_refptr<HttpNetworkSession> session_; |
109 scoped_refptr<IOBuffer> read_buf_; | 110 scoped_refptr<IOBuffer> read_buf_; |
110 SpdySessionDependencies session_deps_; | 111 SpdySessionDependencies session_deps_; |
111 MockConnect connect_data_; | 112 MockConnect connect_data_; |
112 scoped_refptr<SpdySession> spdy_session_; | 113 scoped_refptr<SpdySession> spdy_session_; |
113 scoped_refptr<SpdyStream> spdy_stream_; | 114 scoped_refptr<SpdyStream> spdy_stream_; |
114 spdy::SpdyFramer framer_; | 115 spdy::SpdyFramer framer_; |
115 | 116 |
116 std::string user_agent_; | 117 std::string user_agent_; |
117 GURL url_; | 118 GURL url_; |
118 HostPortPair proxy_host_port_; | 119 HostPortPair proxy_host_port_; |
119 HostPortPair endpoint_host_port_pair_; | 120 HostPortPair endpoint_host_port_pair_; |
120 ProxyServer proxy_; | 121 ProxyServer proxy_; |
121 HostPortProxyPair endpoint_host_port_proxy_pair_; | 122 HostPortProxyPair endpoint_host_port_proxy_pair_; |
122 scoped_refptr<TransportSocketParams> transport_params_; | 123 scoped_refptr<TransportSocketParams> transport_params_; |
123 | 124 |
124 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest); | 125 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest); |
125 }; | 126 }; |
126 | 127 |
127 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest() | 128 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest() |
128 : sock_(NULL), | 129 : sock_(NULL), |
129 read_callback_(), | |
130 write_callback_(), | |
131 data_(NULL), | 130 data_(NULL), |
132 session_(NULL), | 131 session_(NULL), |
133 read_buf_(NULL), | 132 read_buf_(NULL), |
134 session_deps_(), | 133 session_deps_(), |
135 connect_data_(false, OK), | 134 connect_data_(false, OK), |
136 spdy_session_(NULL), | 135 spdy_session_(NULL), |
137 spdy_stream_(NULL), | 136 spdy_stream_(NULL), |
138 framer_(), | 137 framer_(), |
139 user_agent_(kUserAgent), | 138 user_agent_(kUserAgent), |
140 url_(kUrl), | 139 url_(kUrl), |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 } | 204 } |
206 | 205 |
207 scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer( | 206 scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer( |
208 const char* data, int size) { | 207 const char* data, int size) { |
209 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size)); | 208 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size)); |
210 memcpy(buf->data(), data, size); | 209 memcpy(buf->data(), data, size); |
211 return buf; | 210 return buf; |
212 } | 211 } |
213 | 212 |
214 void SpdyProxyClientSocketTest::AssertConnectSucceeds() { | 213 void SpdyProxyClientSocketTest::AssertConnectSucceeds() { |
215 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(&read_callback_)); | 214 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback())); |
216 data_->Run(); | 215 data_->Run(); |
217 ASSERT_EQ(OK, read_callback_.WaitForResult()); | 216 ASSERT_EQ(OK, read_callback_.WaitForResult()); |
218 } | 217 } |
219 | 218 |
220 void SpdyProxyClientSocketTest::AssertConnectFails(int result) { | 219 void SpdyProxyClientSocketTest::AssertConnectFails(int result) { |
221 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(&read_callback_)); | 220 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback())); |
222 data_->Run(); | 221 data_->Run(); |
223 ASSERT_EQ(result, read_callback_.WaitForResult()); | 222 ASSERT_EQ(result, read_callback_.WaitForResult()); |
224 } | 223 } |
225 | 224 |
226 void SpdyProxyClientSocketTest::AssertConnectionEstablished() { | 225 void SpdyProxyClientSocketTest::AssertConnectionEstablished() { |
227 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 226 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
228 ASSERT_TRUE(response != NULL); | 227 ASSERT_TRUE(response != NULL); |
229 ASSERT_EQ(200, response->headers->response_code()); | 228 ASSERT_EQ(200, response->headers->response_code()); |
230 ASSERT_EQ("Connection Established", response->headers->GetStatusText()); | 229 ASSERT_EQ("Connection Established", response->headers->GetStatusText()); |
231 } | 230 } |
232 | 231 |
233 void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data, | 232 void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data, |
234 int len) { | 233 int len) { |
235 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); | 234 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); |
236 ASSERT_EQ(len, sock_->Read(buf, len, NULL)); | 235 ASSERT_EQ(len, sock_->Read(buf, len, CompletionCallback())); |
237 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); | 236 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); |
238 ASSERT_TRUE(sock_->IsConnected()); | 237 ASSERT_TRUE(sock_->IsConnected()); |
239 } | 238 } |
240 | 239 |
241 void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data, | 240 void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data, |
242 int len) { | 241 int len) { |
243 data_->StopAfter(1); | 242 data_->StopAfter(1); |
244 // Issue the read, which will be completed asynchronously | 243 // Issue the read, which will be completed asynchronously |
245 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); | 244 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); |
246 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(buf, len, &read_callback_)); | 245 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(buf, len, read_callback_.callback())); |
247 EXPECT_TRUE(sock_->IsConnected()); | 246 EXPECT_TRUE(sock_->IsConnected()); |
248 data_->Run(); | 247 data_->Run(); |
249 | 248 |
250 EXPECT_TRUE(sock_->IsConnected()); | 249 EXPECT_TRUE(sock_->IsConnected()); |
251 | 250 |
252 // Now the read will return | 251 // Now the read will return |
253 EXPECT_EQ(len, read_callback_.WaitForResult()); | 252 EXPECT_EQ(len, read_callback_.WaitForResult()); |
254 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); | 253 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); |
255 } | 254 } |
256 | 255 |
257 void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, int len) { | 256 void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, int len) { |
258 data_->StopAfter(1); | 257 data_->StopAfter(1); |
259 // Issue the read, which will be completed asynchronously | 258 // Issue the read, which will be completed asynchronously |
260 read_buf_ = new IOBuffer(len); | 259 read_buf_ = new IOBuffer(len); |
261 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(read_buf_, len, &read_callback_)); | 260 ASSERT_EQ(ERR_IO_PENDING, |
| 261 sock_->Read(read_buf_, len, read_callback_.callback())); |
262 EXPECT_TRUE(sock_->IsConnected()); | 262 EXPECT_TRUE(sock_->IsConnected()); |
263 } | 263 } |
264 | 264 |
265 void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, int len) { | 265 void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, int len) { |
266 EXPECT_TRUE(sock_->IsConnected()); | 266 EXPECT_TRUE(sock_->IsConnected()); |
267 | 267 |
268 // Now the read will return | 268 // Now the read will return |
269 EXPECT_EQ(len, read_callback_.WaitForResult()); | 269 EXPECT_EQ(len, read_callback_.WaitForResult()); |
270 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len)); | 270 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len)); |
271 } | 271 } |
272 | 272 |
273 void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data, | 273 void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data, |
274 int len) { | 274 int len) { |
275 AssertWriteReturns(data, len, ERR_IO_PENDING); | 275 AssertWriteReturns(data, len, ERR_IO_PENDING); |
276 data_->RunFor(1); | 276 data_->RunFor(1); |
277 AssertWriteLength(len); | 277 AssertWriteLength(len); |
278 } | 278 } |
279 | 279 |
280 void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data, int len, | 280 void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data, int len, |
281 int rv) { | 281 int rv) { |
282 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); | 282 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); |
283 EXPECT_EQ(rv, sock_->Write(buf, buf->size(), &write_callback_)); | 283 EXPECT_EQ(rv, sock_->Write(buf, buf->size(), write_callback_.callback())); |
284 } | 284 } |
285 | 285 |
286 void SpdyProxyClientSocketTest::AssertWriteLength(int len) { | 286 void SpdyProxyClientSocketTest::AssertWriteLength(int len) { |
287 EXPECT_EQ(len, write_callback_.WaitForResult()); | 287 EXPECT_EQ(len, write_callback_.WaitForResult()); |
288 } | 288 } |
289 | 289 |
290 void SpdyProxyClientSocketTest::AssertAsyncWriteWithReadsSucceeds( | 290 void SpdyProxyClientSocketTest::AssertAsyncWriteWithReadsSucceeds( |
291 const char* data, int len, int num_reads) { | 291 const char* data, int len, int num_reads) { |
292 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); | 292 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); |
293 | 293 |
294 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), &write_callback_)); | 294 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), |
| 295 write_callback_.callback())); |
295 | 296 |
296 for (int i = 0; i < num_reads; i++) { | 297 for (int i = 0; i < num_reads; i++) { |
297 Run(1); | 298 Run(1); |
298 AssertSyncReadEquals(kMsg2, kLen2); | 299 AssertSyncReadEquals(kMsg2, kLen2); |
299 } | 300 } |
300 | 301 |
301 write_callback_.WaitForResult(); | 302 write_callback_.WaitForResult(); |
302 } | 303 } |
303 | 304 |
304 // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request. | 305 // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request. |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); | 535 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
535 | 536 |
536 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 537 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
537 ASSERT_TRUE(response != NULL); | 538 ASSERT_TRUE(response != NULL); |
538 ASSERT_EQ(407, response->headers->response_code()); | 539 ASSERT_EQ(407, response->headers->response_code()); |
539 ASSERT_EQ("Proxy Authentication Required", | 540 ASSERT_EQ("Proxy Authentication Required", |
540 response->headers->GetStatusText()); | 541 response->headers->GetStatusText()); |
541 | 542 |
542 AddAuthToCache(); | 543 AddAuthToCache(); |
543 | 544 |
544 ASSERT_EQ(OK, sock_->RestartWithAuth(&read_callback_)); | 545 ASSERT_EQ(OK, sock_->RestartWithAuth(&read_callback_old_)); |
545 // A SpdyProxyClientSocket sits on a single SPDY stream which can | 546 // A SpdyProxyClientSocket sits on a single SPDY stream which can |
546 // only be used for a single request/response. | 547 // only be used for a single request/response. |
547 ASSERT_FALSE(sock_->IsConnectedAndIdle()); | 548 ASSERT_FALSE(sock_->IsConnectedAndIdle()); |
548 } | 549 } |
549 | 550 |
550 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { | 551 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { |
551 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 552 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
552 MockWrite writes[] = { | 553 MockWrite writes[] = { |
553 CreateMockWrite(*conn, 0, false), | 554 CreateMockWrite(*conn, 0, false), |
554 }; | 555 }; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 }; | 669 }; |
669 | 670 |
670 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 671 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
671 | 672 |
672 AssertConnectSucceeds(); | 673 AssertConnectSucceeds(); |
673 | 674 |
674 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); | 675 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); |
675 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(), | 676 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(), |
676 big_data.length())); | 677 big_data.length())); |
677 | 678 |
678 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), &write_callback_)); | 679 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), |
| 680 write_callback_.callback())); |
679 data_->RunFor(3); | 681 data_->RunFor(3); |
680 | 682 |
681 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); | 683 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); |
682 } | 684 } |
683 | 685 |
684 // ----------- Read | 686 // ----------- Read |
685 | 687 |
686 TEST_F(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) { | 688 TEST_F(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) { |
687 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 689 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
688 MockWrite writes[] = { | 690 MockWrite writes[] = { |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 AssertConnectSucceeds(); | 870 AssertConnectSucceeds(); |
869 | 871 |
870 Run(1); // SpdySession consumes the next read and sends it to | 872 Run(1); // SpdySession consumes the next read and sends it to |
871 // sock_ to be buffered. | 873 // sock_ to be buffered. |
872 // The payload from the single large data frame will be read across | 874 // The payload from the single large data frame will be read across |
873 // two different reads. | 875 // two different reads. |
874 AssertSyncReadEquals(kMsg33, kLen33); | 876 AssertSyncReadEquals(kMsg33, kLen33); |
875 | 877 |
876 // Now attempt to do a read of more data than remains buffered | 878 // Now attempt to do a read of more data than remains buffered |
877 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); | 879 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); |
878 ASSERT_EQ(kLen3, sock_->Read(buf, kLen33, &read_callback_)); | 880 ASSERT_EQ(kLen3, sock_->Read(buf, kLen33, read_callback_.callback())); |
879 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); | 881 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); |
880 ASSERT_TRUE(sock_->IsConnected()); | 882 ASSERT_TRUE(sock_->IsConnected()); |
881 } | 883 } |
882 | 884 |
883 TEST_F(SpdyProxyClientSocketTest, ReadAuthResponseBody) { | 885 TEST_F(SpdyProxyClientSocketTest, ReadAuthResponseBody) { |
884 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 886 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
885 MockWrite writes[] = { | 887 MockWrite writes[] = { |
886 CreateMockWrite(*conn, 0, false), | 888 CreateMockWrite(*conn, 0, false), |
887 }; | 889 }; |
888 | 890 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
921 CreateMockRead(*msg2, 3, true), | 923 CreateMockRead(*msg2, 3, true), |
922 MockRead(true, 0, 4), // EOF | 924 MockRead(true, 0, 4), // EOF |
923 }; | 925 }; |
924 | 926 |
925 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 927 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
926 | 928 |
927 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); | 929 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); |
928 | 930 |
929 Run(2); // SpdySession consumes the next two reads and sends then to | 931 Run(2); // SpdySession consumes the next two reads and sends then to |
930 // sock_ to be buffered. | 932 // sock_ to be buffered. |
931 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->Read(NULL, 1, NULL)); | 933 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 934 sock_->Read(NULL, 1, CompletionCallback())); |
932 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1 + kLen2)); | 935 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1 + kLen2)); |
933 scoped_ptr<HttpStream> stream(sock_->CreateConnectResponseStream()); | 936 scoped_ptr<HttpStream> stream(sock_->CreateConnectResponseStream()); |
934 stream->ReadResponseBody(buf, kLen1 + kLen2, &read_callback_); | 937 stream->ReadResponseBody(buf, kLen1 + kLen2, &read_callback_old_); |
935 } | 938 } |
936 | 939 |
937 // ----------- Reads and Writes | 940 // ----------- Reads and Writes |
938 | 941 |
939 TEST_F(SpdyProxyClientSocketTest, AsyncReadAroundWrite) { | 942 TEST_F(SpdyProxyClientSocketTest, AsyncReadAroundWrite) { |
940 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 943 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
941 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 944 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
942 MockWrite writes[] = { | 945 MockWrite writes[] = { |
943 CreateMockWrite(*conn, 0, false), | 946 CreateMockWrite(*conn, 0, false), |
944 CreateMockWrite(*msg2, 3, false), | 947 CreateMockWrite(*msg2, 3, false), |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1023 MockRead(true, 0, 2), // EOF | 1026 MockRead(true, 0, 2), // EOF |
1024 }; | 1027 }; |
1025 | 1028 |
1026 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1029 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1027 | 1030 |
1028 AssertConnectSucceeds(); | 1031 AssertConnectSucceeds(); |
1029 | 1032 |
1030 Run(1); | 1033 Run(1); |
1031 | 1034 |
1032 ASSERT_FALSE(sock_->IsConnected()); | 1035 ASSERT_FALSE(sock_->IsConnected()); |
1033 ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); | 1036 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
1034 ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); | 1037 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
1035 ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); | 1038 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
1036 ASSERT_FALSE(sock_->IsConnectedAndIdle()); | 1039 ASSERT_FALSE(sock_->IsConnectedAndIdle()); |
1037 } | 1040 } |
1038 | 1041 |
1039 // Read pending when socket is closed should return 0 | 1042 // Read pending when socket is closed should return 0 |
1040 TEST_F(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { | 1043 TEST_F(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { |
1041 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1044 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
1042 MockWrite writes[] = { | 1045 MockWrite writes[] = { |
1043 CreateMockWrite(*conn, 0, false), | 1046 CreateMockWrite(*conn, 0, false), |
1044 }; | 1047 }; |
1045 | 1048 |
(...skipping 26 matching lines...) Expand all Loading... |
1072 CreateMockRead(*resp, 1, true), | 1075 CreateMockRead(*resp, 1, true), |
1073 MockRead(true, 0, 2), // EOF | 1076 MockRead(true, 0, 2), // EOF |
1074 }; | 1077 }; |
1075 | 1078 |
1076 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1079 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1077 | 1080 |
1078 AssertConnectSucceeds(); | 1081 AssertConnectSucceeds(); |
1079 | 1082 |
1080 sock_->Disconnect(); | 1083 sock_->Disconnect(); |
1081 | 1084 |
1082 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->Read(NULL, 1, NULL)); | 1085 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1086 sock_->Read(NULL, 1, CompletionCallback())); |
1083 } | 1087 } |
1084 | 1088 |
1085 // Reading buffered data from an already closed socket should return | 1089 // Reading buffered data from an already closed socket should return |
1086 // buffered data, then 0. | 1090 // buffered data, then 0. |
1087 TEST_F(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { | 1091 TEST_F(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { |
1088 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1092 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
1089 MockWrite writes[] = { | 1093 MockWrite writes[] = { |
1090 CreateMockWrite(*conn, 0, false), | 1094 CreateMockWrite(*conn, 0, false), |
1091 }; | 1095 }; |
1092 | 1096 |
1093 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1097 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
1094 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1098 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
1095 MockRead reads[] = { | 1099 MockRead reads[] = { |
1096 CreateMockRead(*resp, 1, true), | 1100 CreateMockRead(*resp, 1, true), |
1097 CreateMockRead(*msg1, 2, true), | 1101 CreateMockRead(*msg1, 2, true), |
1098 MockRead(true, 0, 3), // EOF | 1102 MockRead(true, 0, 3), // EOF |
1099 }; | 1103 }; |
1100 | 1104 |
1101 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1105 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1102 | 1106 |
1103 AssertConnectSucceeds(); | 1107 AssertConnectSucceeds(); |
1104 | 1108 |
1105 Run(2); | 1109 Run(2); |
1106 | 1110 |
1107 ASSERT_FALSE(sock_->IsConnected()); | 1111 ASSERT_FALSE(sock_->IsConnected()); |
1108 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1112 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
1109 ASSERT_EQ(kLen1, sock_->Read(buf, kLen1, NULL)); | 1113 ASSERT_EQ(kLen1, sock_->Read(buf, kLen1, CompletionCallback())); |
1110 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); | 1114 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); |
1111 | 1115 |
1112 ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); | 1116 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
1113 ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); | 1117 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
1114 sock_->Disconnect(); | 1118 sock_->Disconnect(); |
1115 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->Read(NULL, 1, NULL)); | 1119 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1120 sock_->Read(NULL, 1, CompletionCallback())); |
1116 } | 1121 } |
1117 | 1122 |
1118 // Calling Write() on a closed socket is an error | 1123 // Calling Write() on a closed socket is an error |
1119 TEST_F(SpdyProxyClientSocketTest, WriteOnClosedStream) { | 1124 TEST_F(SpdyProxyClientSocketTest, WriteOnClosedStream) { |
1120 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1125 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
1121 MockWrite writes[] = { | 1126 MockWrite writes[] = { |
1122 CreateMockWrite(*conn, 0, false), | 1127 CreateMockWrite(*conn, 0, false), |
1123 }; | 1128 }; |
1124 | 1129 |
1125 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1130 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
1126 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1131 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
1127 MockRead reads[] = { | 1132 MockRead reads[] = { |
1128 CreateMockRead(*resp, 1, true), | 1133 CreateMockRead(*resp, 1, true), |
1129 MockRead(true, 0, 2), // EOF | 1134 MockRead(true, 0, 2), // EOF |
1130 }; | 1135 }; |
1131 | 1136 |
1132 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1137 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1133 | 1138 |
1134 AssertConnectSucceeds(); | 1139 AssertConnectSucceeds(); |
1135 | 1140 |
1136 Run(1); // Read EOF which will close the stream | 1141 Run(1); // Read EOF which will close the stream |
1137 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1142 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
1138 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->Write(buf, buf->size(), NULL)); | 1143 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1144 sock_->Write(buf, buf->size(), CompletionCallback())); |
1139 } | 1145 } |
1140 | 1146 |
1141 // Calling Write() on a disconnected socket is an error | 1147 // Calling Write() on a disconnected socket is an error |
1142 TEST_F(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { | 1148 TEST_F(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { |
1143 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1149 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
1144 MockWrite writes[] = { | 1150 MockWrite writes[] = { |
1145 CreateMockWrite(*conn, 0, false), | 1151 CreateMockWrite(*conn, 0, false), |
1146 }; | 1152 }; |
1147 | 1153 |
1148 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1154 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
1149 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1155 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
1150 MockRead reads[] = { | 1156 MockRead reads[] = { |
1151 CreateMockRead(*resp, 1, true), | 1157 CreateMockRead(*resp, 1, true), |
1152 MockRead(true, 0, 2), // EOF | 1158 MockRead(true, 0, 2), // EOF |
1153 }; | 1159 }; |
1154 | 1160 |
1155 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1161 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1156 | 1162 |
1157 AssertConnectSucceeds(); | 1163 AssertConnectSucceeds(); |
1158 | 1164 |
1159 sock_->Disconnect(); | 1165 sock_->Disconnect(); |
1160 | 1166 |
1161 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1167 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
1162 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->Write(buf, buf->size(), NULL)); | 1168 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1169 sock_->Write(buf, buf->size(), CompletionCallback())); |
1163 } | 1170 } |
1164 | 1171 |
1165 // If the socket is closed with a pending Write(), the callback | 1172 // If the socket is closed with a pending Write(), the callback |
1166 // should be called with ERR_CONNECTION_CLOSED. | 1173 // should be called with ERR_CONNECTION_CLOSED. |
1167 TEST_F(SpdyProxyClientSocketTest, WritePendingOnClose) { | 1174 TEST_F(SpdyProxyClientSocketTest, WritePendingOnClose) { |
1168 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1175 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
1169 MockWrite writes[] = { | 1176 MockWrite writes[] = { |
1170 CreateMockWrite(*conn, 0, false), | 1177 CreateMockWrite(*conn, 0, false), |
1171 MockWrite(true, ERR_IO_PENDING, 2), | 1178 MockWrite(true, ERR_IO_PENDING, 2), |
1172 }; | 1179 }; |
1173 | 1180 |
1174 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1181 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
1175 MockRead reads[] = { | 1182 MockRead reads[] = { |
1176 CreateMockRead(*resp, 1, true), | 1183 CreateMockRead(*resp, 1, true), |
1177 MockRead(true, 0, 3), // EOF | 1184 MockRead(true, 0, 3), // EOF |
1178 }; | 1185 }; |
1179 | 1186 |
1180 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1187 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1181 | 1188 |
1182 AssertConnectSucceeds(); | 1189 AssertConnectSucceeds(); |
1183 | 1190 |
1184 EXPECT_TRUE(sock_->IsConnected()); | 1191 EXPECT_TRUE(sock_->IsConnected()); |
1185 | 1192 |
1186 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1193 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
1187 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), &write_callback_)); | 1194 EXPECT_EQ(ERR_IO_PENDING, |
| 1195 sock_->Write(buf, buf->size(), write_callback_.callback())); |
1188 | 1196 |
1189 Run(1); | 1197 Run(1); |
1190 | 1198 |
1191 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); | 1199 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); |
1192 } | 1200 } |
1193 | 1201 |
1194 // If the socket is Disconnected with a pending Write(), the callback | 1202 // If the socket is Disconnected with a pending Write(), the callback |
1195 // should not be called. | 1203 // should not be called. |
1196 TEST_F(SpdyProxyClientSocketTest, DisconnectWithWritePending) { | 1204 TEST_F(SpdyProxyClientSocketTest, DisconnectWithWritePending) { |
1197 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1205 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
1198 MockWrite writes[] = { | 1206 MockWrite writes[] = { |
1199 CreateMockWrite(*conn, 0, false), | 1207 CreateMockWrite(*conn, 0, false), |
1200 MockWrite(false, 0, 2), // EOF | 1208 MockWrite(false, 0, 2), // EOF |
1201 }; | 1209 }; |
1202 | 1210 |
1203 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1211 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
1204 MockRead reads[] = { | 1212 MockRead reads[] = { |
1205 CreateMockRead(*resp, 1, true), | 1213 CreateMockRead(*resp, 1, true), |
1206 MockRead(true, 0, 3), // EOF | 1214 MockRead(true, 0, 3), // EOF |
1207 }; | 1215 }; |
1208 | 1216 |
1209 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1217 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1210 | 1218 |
1211 AssertConnectSucceeds(); | 1219 AssertConnectSucceeds(); |
1212 | 1220 |
1213 EXPECT_TRUE(sock_->IsConnected()); | 1221 EXPECT_TRUE(sock_->IsConnected()); |
1214 | 1222 |
1215 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1223 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
1216 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), &write_callback_)); | 1224 EXPECT_EQ(ERR_IO_PENDING, |
| 1225 sock_->Write(buf, buf->size(), write_callback_.callback())); |
1217 | 1226 |
1218 sock_->Disconnect(); | 1227 sock_->Disconnect(); |
1219 | 1228 |
1220 EXPECT_FALSE(sock_->IsConnected()); | 1229 EXPECT_FALSE(sock_->IsConnected()); |
1221 EXPECT_FALSE(write_callback_.have_result()); | 1230 EXPECT_FALSE(write_callback_.have_result()); |
1222 } | 1231 } |
1223 | 1232 |
1224 // If the socket is Disconnected with a pending Read(), the callback | 1233 // If the socket is Disconnected with a pending Read(), the callback |
1225 // should not be called. | 1234 // should not be called. |
1226 TEST_F(SpdyProxyClientSocketTest, DisconnectWithReadPending) { | 1235 TEST_F(SpdyProxyClientSocketTest, DisconnectWithReadPending) { |
1227 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1236 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
1228 MockWrite writes[] = { | 1237 MockWrite writes[] = { |
1229 CreateMockWrite(*conn, 0, false), | 1238 CreateMockWrite(*conn, 0, false), |
1230 }; | 1239 }; |
1231 | 1240 |
1232 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1241 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
1233 MockRead reads[] = { | 1242 MockRead reads[] = { |
1234 CreateMockRead(*resp, 1, true), | 1243 CreateMockRead(*resp, 1, true), |
1235 MockRead(true, 0, 2), // EOF | 1244 MockRead(true, 0, 2), // EOF |
1236 }; | 1245 }; |
1237 | 1246 |
1238 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1247 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1239 | 1248 |
1240 AssertConnectSucceeds(); | 1249 AssertConnectSucceeds(); |
1241 | 1250 |
1242 EXPECT_TRUE(sock_->IsConnected()); | 1251 EXPECT_TRUE(sock_->IsConnected()); |
1243 | 1252 |
1244 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1253 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
1245 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(buf, kLen1, &read_callback_)); | 1254 ASSERT_EQ(ERR_IO_PENDING, |
| 1255 sock_->Read(buf, kLen1, read_callback_.callback())); |
1246 | 1256 |
1247 sock_->Disconnect(); | 1257 sock_->Disconnect(); |
1248 | 1258 |
1249 EXPECT_FALSE(sock_->IsConnected()); | 1259 EXPECT_FALSE(sock_->IsConnected()); |
1250 EXPECT_FALSE(read_callback_.have_result()); | 1260 EXPECT_FALSE(read_callback_.have_result()); |
1251 } | 1261 } |
1252 | 1262 |
1253 // If the socket is Reset when both a read and write are pending, | 1263 // If the socket is Reset when both a read and write are pending, |
1254 // both should be called back. | 1264 // both should be called back. |
1255 TEST_F(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { | 1265 TEST_F(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { |
(...skipping 10 matching lines...) Expand all Loading... |
1266 CreateMockRead(*rst, 3, true), | 1276 CreateMockRead(*rst, 3, true), |
1267 }; | 1277 }; |
1268 | 1278 |
1269 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1279 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1270 | 1280 |
1271 AssertConnectSucceeds(); | 1281 AssertConnectSucceeds(); |
1272 | 1282 |
1273 EXPECT_TRUE(sock_->IsConnected()); | 1283 EXPECT_TRUE(sock_->IsConnected()); |
1274 | 1284 |
1275 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); | 1285 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); |
1276 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(read_buf, kLen1, &read_callback_)); | 1286 ASSERT_EQ(ERR_IO_PENDING, |
| 1287 sock_->Read(read_buf, kLen1, read_callback_.callback())); |
1277 | 1288 |
1278 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); | 1289 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); |
1279 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(write_buf, write_buf->size(), | 1290 EXPECT_EQ(ERR_IO_PENDING, |
1280 &write_callback_)); | 1291 sock_->Write(write_buf, write_buf->size(), |
| 1292 write_callback_.callback())); |
1281 | 1293 |
1282 Run(2); | 1294 Run(2); |
1283 | 1295 |
1284 EXPECT_TRUE(sock_.get()); | 1296 EXPECT_TRUE(sock_.get()); |
1285 EXPECT_TRUE(read_callback_.have_result()); | 1297 EXPECT_TRUE(read_callback_.have_result()); |
1286 EXPECT_TRUE(write_callback_.have_result()); | 1298 EXPECT_TRUE(write_callback_.have_result()); |
1287 } | 1299 } |
1288 | 1300 |
1289 // CompletionCallback that causes the SpdyProxyClientSocket to be | 1301 // CompletionCallback that causes the SpdyProxyClientSocket to be |
1290 // deleted when Run is invoked. | 1302 // deleted when Run is invoked. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1325 | 1337 |
1326 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1338 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1327 | 1339 |
1328 AssertConnectSucceeds(); | 1340 AssertConnectSucceeds(); |
1329 | 1341 |
1330 EXPECT_TRUE(sock_->IsConnected()); | 1342 EXPECT_TRUE(sock_->IsConnected()); |
1331 | 1343 |
1332 DeleteSockCallback read_callback(&sock_); | 1344 DeleteSockCallback read_callback(&sock_); |
1333 | 1345 |
1334 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); | 1346 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); |
1335 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(read_buf, kLen1, &read_callback)); | 1347 ASSERT_EQ(ERR_IO_PENDING, |
| 1348 sock_->Read(read_buf, kLen1, |
| 1349 base::Bind(&DeleteSockCallback::Run<int>, |
| 1350 base::Unretained(&read_callback)))); |
1336 | 1351 |
1337 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); | 1352 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); |
1338 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(write_buf, write_buf->size(), | 1353 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(write_buf, write_buf->size(), |
1339 &write_callback_)); | 1354 write_callback_.callback())); |
1340 | 1355 |
1341 Run(2); | 1356 Run(2); |
1342 | 1357 |
1343 EXPECT_FALSE(sock_.get()); | 1358 EXPECT_FALSE(sock_.get()); |
1344 EXPECT_TRUE(read_callback.have_result()); | 1359 EXPECT_TRUE(read_callback.have_result()); |
1345 EXPECT_FALSE(write_callback_.have_result()); | 1360 EXPECT_FALSE(write_callback_.have_result()); |
1346 } | 1361 } |
1347 | 1362 |
1348 } // namespace net | 1363 } // namespace net |
OLD | NEW |