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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 | 62 |
63 class SpdyProxyClientSocketTest | 63 class SpdyProxyClientSocketTest |
64 : public PlatformTest, | 64 : public PlatformTest, |
65 public testing::WithParamInterface<NextProto> { | 65 public testing::WithParamInterface<NextProto> { |
66 public: | 66 public: |
67 SpdyProxyClientSocketTest(); | 67 SpdyProxyClientSocketTest(); |
68 | 68 |
69 virtual void TearDown(); | 69 virtual void TearDown(); |
70 | 70 |
71 protected: | 71 protected: |
72 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes, | 72 void Initialize(MockRead* reads, |
| 73 size_t reads_count, |
| 74 MockWrite* writes, |
73 size_t writes_count); | 75 size_t writes_count); |
74 void PopulateConnectRequestIR(SpdySynStreamIR* syn_ir); | 76 void PopulateConnectRequestIR(SpdySynStreamIR* syn_ir); |
75 void PopulateConnectReplyIR(SpdySynReplyIR* reply_ir, const char* status); | 77 void PopulateConnectReplyIR(SpdySynReplyIR* reply_ir, const char* status); |
76 SpdyFrame* ConstructConnectRequestFrame(); | 78 SpdyFrame* ConstructConnectRequestFrame(); |
77 SpdyFrame* ConstructConnectAuthRequestFrame(); | 79 SpdyFrame* ConstructConnectAuthRequestFrame(); |
78 SpdyFrame* ConstructConnectReplyFrame(); | 80 SpdyFrame* ConstructConnectReplyFrame(); |
79 SpdyFrame* ConstructConnectAuthReplyFrame(); | 81 SpdyFrame* ConstructConnectAuthReplyFrame(); |
80 SpdyFrame* ConstructConnectRedirectReplyFrame(); | 82 SpdyFrame* ConstructConnectRedirectReplyFrame(); |
81 SpdyFrame* ConstructConnectErrorReplyFrame(); | 83 SpdyFrame* ConstructConnectErrorReplyFrame(); |
82 SpdyFrame* ConstructBodyFrame(const char* data, int length); | 84 SpdyFrame* ConstructBodyFrame(const char* data, int length); |
83 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); | 85 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); |
84 void AssertConnectSucceeds(); | 86 void AssertConnectSucceeds(); |
85 void AssertConnectFails(int result); | 87 void AssertConnectFails(int result); |
86 void AssertConnectionEstablished(); | 88 void AssertConnectionEstablished(); |
87 void AssertSyncReadEquals(const char* data, int len); | 89 void AssertSyncReadEquals(const char* data, int len); |
88 void AssertAsyncReadEquals(const char* data, int len); | 90 void AssertAsyncReadEquals(const char* data, int len); |
89 void AssertReadStarts(const char* data, int len); | 91 void AssertReadStarts(const char* data, int len); |
90 void AssertReadReturns(const char* data, int len); | 92 void AssertReadReturns(const char* data, int len); |
91 void AssertAsyncWriteSucceeds(const char* data, int len); | 93 void AssertAsyncWriteSucceeds(const char* data, int len); |
92 void AssertWriteReturns(const char* data, int len, int rv); | 94 void AssertWriteReturns(const char* data, int len, int rv); |
93 void AssertWriteLength(int len); | 95 void AssertWriteLength(int len); |
94 void AssertAsyncWriteWithReadsSucceeds(const char* data, int len, | 96 void AssertAsyncWriteWithReadsSucceeds(const char* data, |
95 int num_reads); | 97 int len, |
| 98 int num_reads); |
96 | 99 |
97 void AddAuthToCache() { | 100 void AddAuthToCache() { |
98 const base::string16 kFoo(base::ASCIIToUTF16("foo")); | 101 const base::string16 kFoo(base::ASCIIToUTF16("foo")); |
99 const base::string16 kBar(base::ASCIIToUTF16("bar")); | 102 const base::string16 kBar(base::ASCIIToUTF16("bar")); |
100 session_->http_auth_cache()->Add(GURL(kProxyUrl), | 103 session_->http_auth_cache()->Add(GURL(kProxyUrl), |
101 "MyRealm1", | 104 "MyRealm1", |
102 HttpAuth::AUTH_SCHEME_BASIC, | 105 HttpAuth::AUTH_SCHEME_BASIC, |
103 "Basic realm=MyRealm1", | 106 "Basic realm=MyRealm1", |
104 AuthCredentials(kFoo, kBar), | 107 AuthCredentials(kFoo, kBar), |
105 "/"); | 108 "/"); |
(...skipping 26 matching lines...) Expand all Loading... |
132 std::string user_agent_; | 135 std::string user_agent_; |
133 GURL url_; | 136 GURL url_; |
134 HostPortPair proxy_host_port_; | 137 HostPortPair proxy_host_port_; |
135 HostPortPair endpoint_host_port_pair_; | 138 HostPortPair endpoint_host_port_pair_; |
136 ProxyServer proxy_; | 139 ProxyServer proxy_; |
137 SpdySessionKey endpoint_spdy_session_key_; | 140 SpdySessionKey endpoint_spdy_session_key_; |
138 | 141 |
139 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest); | 142 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest); |
140 }; | 143 }; |
141 | 144 |
142 INSTANTIATE_TEST_CASE_P( | 145 INSTANTIATE_TEST_CASE_P(NextProto, |
143 NextProto, | 146 SpdyProxyClientSocketTest, |
144 SpdyProxyClientSocketTest, | 147 testing::Values(kProtoDeprecatedSPDY2, |
145 testing::Values(kProtoDeprecatedSPDY2, | 148 kProtoSPDY3, |
146 kProtoSPDY3, kProtoSPDY31, kProtoSPDY4)); | 149 kProtoSPDY31, |
| 150 kProtoSPDY4)); |
147 | 151 |
148 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest() | 152 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest() |
149 : spdy_util_(GetParam()), | 153 : spdy_util_(GetParam()), |
150 session_(NULL), | 154 session_(NULL), |
151 read_buf_(NULL), | 155 read_buf_(NULL), |
152 session_deps_(GetParam()), | 156 session_deps_(GetParam()), |
153 connect_data_(SYNCHRONOUS, OK), | 157 connect_data_(SYNCHRONOUS, OK), |
154 framer_(spdy_util_.spdy_version(), false), | 158 framer_(spdy_util_.spdy_version(), false), |
155 user_agent_(kUserAgent), | 159 user_agent_(kUserAgent), |
156 url_(kRequestUrl), | 160 url_(kRequestUrl), |
(...skipping 10 matching lines...) Expand all Loading... |
167 sock_.reset(NULL); | 171 sock_.reset(NULL); |
168 if (session_.get() != NULL) | 172 if (session_.get() != NULL) |
169 session_->spdy_session_pool()->CloseAllSessions(); | 173 session_->spdy_session_pool()->CloseAllSessions(); |
170 | 174 |
171 // Empty the current queue. | 175 // Empty the current queue. |
172 base::MessageLoop::current()->RunUntilIdle(); | 176 base::MessageLoop::current()->RunUntilIdle(); |
173 PlatformTest::TearDown(); | 177 PlatformTest::TearDown(); |
174 } | 178 } |
175 | 179 |
176 void SpdyProxyClientSocketTest::Initialize(MockRead* reads, | 180 void SpdyProxyClientSocketTest::Initialize(MockRead* reads, |
177 size_t reads_count, | 181 size_t reads_count, |
178 MockWrite* writes, | 182 MockWrite* writes, |
179 size_t writes_count) { | 183 size_t writes_count) { |
180 data_.reset(new DeterministicSocketData(reads, reads_count, | 184 data_.reset( |
181 writes, writes_count)); | 185 new DeterministicSocketData(reads, reads_count, writes, writes_count)); |
182 data_->set_connect_data(connect_data_); | 186 data_->set_connect_data(connect_data_); |
183 data_->SetStop(2); | 187 data_->SetStop(2); |
184 | 188 |
185 session_deps_.deterministic_socket_factory->AddSocketDataProvider( | 189 session_deps_.deterministic_socket_factory->AddSocketDataProvider( |
186 data_.get()); | 190 data_.get()); |
187 session_deps_.host_resolver->set_synchronous_mode(true); | 191 session_deps_.host_resolver->set_synchronous_mode(true); |
188 | 192 |
189 session_ = SpdySessionDependencies::SpdyCreateSessionDeterministic( | 193 session_ = |
190 &session_deps_); | 194 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
191 | 195 |
192 // Creates the SPDY session and stream. | 196 // Creates the SPDY session and stream. |
193 spdy_session_ = | 197 spdy_session_ = CreateInsecureSpdySession( |
194 CreateInsecureSpdySession( | 198 session_, endpoint_spdy_session_key_, BoundNetLog()); |
195 session_, endpoint_spdy_session_key_, BoundNetLog()); | |
196 base::WeakPtr<SpdyStream> spdy_stream( | 199 base::WeakPtr<SpdyStream> spdy_stream( |
197 CreateStreamSynchronously( | 200 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, |
198 SPDY_BIDIRECTIONAL_STREAM, spdy_session_, url_, LOWEST, | 201 spdy_session_, |
199 net_log_.bound())); | 202 url_, |
| 203 LOWEST, |
| 204 net_log_.bound())); |
200 ASSERT_TRUE(spdy_stream.get() != NULL); | 205 ASSERT_TRUE(spdy_stream.get() != NULL); |
201 | 206 |
202 // Create the SpdyProxyClientSocket. | 207 // Create the SpdyProxyClientSocket. |
203 sock_.reset( | 208 sock_.reset(new SpdyProxyClientSocket(spdy_stream, |
204 new SpdyProxyClientSocket(spdy_stream, user_agent_, | 209 user_agent_, |
205 endpoint_host_port_pair_, url_, | 210 endpoint_host_port_pair_, |
206 proxy_host_port_, net_log_.bound(), | 211 url_, |
207 session_->http_auth_cache(), | 212 proxy_host_port_, |
208 session_->http_auth_handler_factory())); | 213 net_log_.bound(), |
| 214 session_->http_auth_cache(), |
| 215 session_->http_auth_handler_factory())); |
209 } | 216 } |
210 | 217 |
211 scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer( | 218 scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer( |
212 const char* data, int size) { | 219 const char* data, |
| 220 int size) { |
213 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size)); | 221 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size)); |
214 memcpy(buf->data(), data, size); | 222 memcpy(buf->data(), data, size); |
215 return buf; | 223 return buf; |
216 } | 224 } |
217 | 225 |
218 void SpdyProxyClientSocketTest::AssertConnectSucceeds() { | 226 void SpdyProxyClientSocketTest::AssertConnectSucceeds() { |
219 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback())); | 227 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback())); |
220 data_->Run(); | 228 data_->Run(); |
221 ASSERT_EQ(OK, read_callback_.WaitForResult()); | 229 ASSERT_EQ(OK, read_callback_.WaitForResult()); |
222 } | 230 } |
(...skipping 12 matching lines...) Expand all Loading... |
235 | 243 |
236 void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data, | 244 void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data, |
237 int len) { | 245 int len) { |
238 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); | 246 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); |
239 ASSERT_EQ(len, sock_->Read(buf.get(), len, CompletionCallback())); | 247 ASSERT_EQ(len, sock_->Read(buf.get(), len, CompletionCallback())); |
240 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); | 248 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); |
241 ASSERT_TRUE(sock_->IsConnected()); | 249 ASSERT_TRUE(sock_->IsConnected()); |
242 } | 250 } |
243 | 251 |
244 void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data, | 252 void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data, |
245 int len) { | 253 int len) { |
246 data_->StopAfter(1); | 254 data_->StopAfter(1); |
247 // Issue the read, which will be completed asynchronously | 255 // Issue the read, which will be completed asynchronously |
248 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); | 256 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); |
249 ASSERT_EQ(ERR_IO_PENDING, | 257 ASSERT_EQ(ERR_IO_PENDING, |
250 sock_->Read(buf.get(), len, read_callback_.callback())); | 258 sock_->Read(buf.get(), len, read_callback_.callback())); |
251 EXPECT_TRUE(sock_->IsConnected()); | 259 EXPECT_TRUE(sock_->IsConnected()); |
252 data_->Run(); | 260 data_->Run(); |
253 | 261 |
254 EXPECT_TRUE(sock_->IsConnected()); | 262 EXPECT_TRUE(sock_->IsConnected()); |
255 | 263 |
256 // Now the read will return | 264 // Now the read will return |
257 EXPECT_EQ(len, read_callback_.WaitForResult()); | 265 EXPECT_EQ(len, read_callback_.WaitForResult()); |
258 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); | 266 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); |
259 } | 267 } |
260 | 268 |
261 void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, | 269 void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, int len) { |
262 int len) { | |
263 data_->StopAfter(1); | 270 data_->StopAfter(1); |
264 // Issue the read, which will be completed asynchronously | 271 // Issue the read, which will be completed asynchronously |
265 read_buf_ = new IOBuffer(len); | 272 read_buf_ = new IOBuffer(len); |
266 ASSERT_EQ(ERR_IO_PENDING, | 273 ASSERT_EQ(ERR_IO_PENDING, |
267 sock_->Read(read_buf_.get(), len, read_callback_.callback())); | 274 sock_->Read(read_buf_.get(), len, read_callback_.callback())); |
268 EXPECT_TRUE(sock_->IsConnected()); | 275 EXPECT_TRUE(sock_->IsConnected()); |
269 } | 276 } |
270 | 277 |
271 void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, | 278 void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, int len) { |
272 int len) { | |
273 EXPECT_TRUE(sock_->IsConnected()); | 279 EXPECT_TRUE(sock_->IsConnected()); |
274 | 280 |
275 // Now the read will return | 281 // Now the read will return |
276 EXPECT_EQ(len, read_callback_.WaitForResult()); | 282 EXPECT_EQ(len, read_callback_.WaitForResult()); |
277 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len)); | 283 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len)); |
278 } | 284 } |
279 | 285 |
280 void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data, | 286 void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data, |
281 int len) { | 287 int len) { |
282 AssertWriteReturns(data, len, ERR_IO_PENDING); | 288 AssertWriteReturns(data, len, ERR_IO_PENDING); |
283 data_->RunFor(1); | 289 data_->RunFor(1); |
284 AssertWriteLength(len); | 290 AssertWriteLength(len); |
285 } | 291 } |
286 | 292 |
287 void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data, | 293 void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data, |
288 int len, | 294 int len, |
289 int rv) { | 295 int rv) { |
290 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); | 296 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); |
291 EXPECT_EQ(rv, | 297 EXPECT_EQ(rv, |
292 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 298 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
293 } | 299 } |
294 | 300 |
295 void SpdyProxyClientSocketTest::AssertWriteLength(int len) { | 301 void SpdyProxyClientSocketTest::AssertWriteLength(int len) { |
296 EXPECT_EQ(len, write_callback_.WaitForResult()); | 302 EXPECT_EQ(len, write_callback_.WaitForResult()); |
297 } | 303 } |
298 | 304 |
299 void SpdyProxyClientSocketTest::AssertAsyncWriteWithReadsSucceeds( | 305 void SpdyProxyClientSocketTest::AssertAsyncWriteWithReadsSucceeds( |
300 const char* data, int len, int num_reads) { | 306 const char* data, |
| 307 int len, |
| 308 int num_reads) { |
301 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); | 309 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); |
302 | 310 |
303 EXPECT_EQ(ERR_IO_PENDING, | 311 EXPECT_EQ(ERR_IO_PENDING, |
304 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 312 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
305 | 313 |
306 for (int i = 0; i < num_reads; i++) { | 314 for (int i = 0; i < num_reads; i++) { |
307 Run(1); | 315 Run(1); |
308 AssertSyncReadEquals(kMsg2, kLen2); | 316 AssertSyncReadEquals(kMsg2, kLen2); |
309 } | 317 } |
310 | 318 |
(...skipping 10 matching lines...) Expand all Loading... |
321 spdy_util_.MaybeAddVersionHeader(syn_ir); | 329 spdy_util_.MaybeAddVersionHeader(syn_ir); |
322 } | 330 } |
323 | 331 |
324 void SpdyProxyClientSocketTest::PopulateConnectReplyIR(SpdySynReplyIR* reply_ir, | 332 void SpdyProxyClientSocketTest::PopulateConnectReplyIR(SpdySynReplyIR* reply_ir, |
325 const char* status) { | 333 const char* status) { |
326 reply_ir->SetHeader(spdy_util_.GetStatusKey(), status); | 334 reply_ir->SetHeader(spdy_util_.GetStatusKey(), status); |
327 spdy_util_.MaybeAddVersionHeader(reply_ir); | 335 spdy_util_.MaybeAddVersionHeader(reply_ir); |
328 } | 336 } |
329 | 337 |
330 // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request. | 338 // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request. |
331 SpdyFrame* | 339 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectRequestFrame() { |
332 SpdyProxyClientSocketTest::ConstructConnectRequestFrame() { | |
333 SpdySynStreamIR syn_ir(kStreamId); | 340 SpdySynStreamIR syn_ir(kStreamId); |
334 PopulateConnectRequestIR(&syn_ir); | 341 PopulateConnectRequestIR(&syn_ir); |
335 return spdy_util_.CreateFramer(false)->SerializeFrame(syn_ir); | 342 return spdy_util_.CreateFramer(false)->SerializeFrame(syn_ir); |
336 } | 343 } |
337 | 344 |
338 // Constructs a SPDY SYN_STREAM frame for a CONNECT request which includes | 345 // Constructs a SPDY SYN_STREAM frame for a CONNECT request which includes |
339 // Proxy-Authorization headers. | 346 // Proxy-Authorization headers. |
340 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectAuthRequestFrame() { | 347 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectAuthRequestFrame() { |
341 SpdySynStreamIR syn_ir(kStreamId); | 348 SpdySynStreamIR syn_ir(kStreamId); |
342 PopulateConnectRequestIR(&syn_ir); | 349 PopulateConnectRequestIR(&syn_ir); |
(...skipping 26 matching lines...) Expand all Loading... |
369 return framer_.SerializeFrame(reply_ir); | 376 return framer_.SerializeFrame(reply_ir); |
370 } | 377 } |
371 | 378 |
372 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. | 379 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. |
373 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { | 380 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { |
374 SpdySynReplyIR reply_ir(kStreamId); | 381 SpdySynReplyIR reply_ir(kStreamId); |
375 PopulateConnectReplyIR(&reply_ir, "500"); | 382 PopulateConnectReplyIR(&reply_ir, "500"); |
376 return framer_.SerializeFrame(reply_ir); | 383 return framer_.SerializeFrame(reply_ir); |
377 } | 384 } |
378 | 385 |
379 SpdyFrame* SpdyProxyClientSocketTest::ConstructBodyFrame( | 386 SpdyFrame* SpdyProxyClientSocketTest::ConstructBodyFrame(const char* data, |
380 const char* data, | 387 int length) { |
381 int length) { | |
382 return framer_.CreateDataFrame(kStreamId, data, length, DATA_FLAG_NONE); | 388 return framer_.CreateDataFrame(kStreamId, data, length, DATA_FLAG_NONE); |
383 } | 389 } |
384 | 390 |
385 // ----------- Connect | 391 // ----------- Connect |
386 | 392 |
387 TEST_P(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) { | 393 TEST_P(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) { |
388 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 394 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
389 MockWrite writes[] = { | 395 MockWrite writes[] = { |
390 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 396 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
391 }; | 397 }; |
392 | 398 |
393 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 399 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
394 MockRead reads[] = { | 400 MockRead reads[] = { |
395 CreateMockRead(*resp, 1, ASYNC), | 401 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
396 MockRead(ASYNC, 0, 2), // EOF | |
397 }; | 402 }; |
398 | 403 |
399 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 404 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
400 | 405 |
401 ASSERT_FALSE(sock_->IsConnected()); | 406 ASSERT_FALSE(sock_->IsConnected()); |
402 | 407 |
403 AssertConnectSucceeds(); | 408 AssertConnectSucceeds(); |
404 | 409 |
405 AssertConnectionEstablished(); | 410 AssertConnectionEstablished(); |
406 } | 411 } |
407 | 412 |
408 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { | 413 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { |
409 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 414 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
410 MockWrite writes[] = { | 415 MockWrite writes[] = { |
411 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 416 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
412 }; | 417 }; |
413 | 418 |
414 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame()); | 419 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
415 MockRead reads[] = { | 420 MockRead reads[] = { |
416 CreateMockRead(*resp, 1, ASYNC), | 421 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
417 MockRead(ASYNC, 0, 2), // EOF | |
418 }; | 422 }; |
419 | 423 |
420 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 424 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
421 | 425 |
422 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); | 426 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
423 | 427 |
424 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 428 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
425 ASSERT_TRUE(response != NULL); | 429 ASSERT_TRUE(response != NULL); |
426 ASSERT_EQ(407, response->headers->response_code()); | 430 ASSERT_EQ(407, response->headers->response_code()); |
427 } | 431 } |
428 | 432 |
429 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { | 433 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { |
430 scoped_ptr<SpdyFrame> conn(ConstructConnectAuthRequestFrame()); | 434 scoped_ptr<SpdyFrame> conn(ConstructConnectAuthRequestFrame()); |
431 MockWrite writes[] = { | 435 MockWrite writes[] = { |
432 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 436 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
433 }; | 437 }; |
434 | 438 |
435 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 439 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
436 MockRead reads[] = { | 440 MockRead reads[] = { |
437 CreateMockRead(*resp, 1, ASYNC), | 441 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
438 MockRead(ASYNC, 0, 2), // EOF | |
439 }; | 442 }; |
440 | 443 |
441 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 444 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
442 AddAuthToCache(); | 445 AddAuthToCache(); |
443 | 446 |
444 AssertConnectSucceeds(); | 447 AssertConnectSucceeds(); |
445 | 448 |
446 AssertConnectionEstablished(); | 449 AssertConnectionEstablished(); |
447 } | 450 } |
448 | 451 |
449 TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) { | 452 TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) { |
450 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 453 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
451 MockWrite writes[] = { | 454 MockWrite writes[] = { |
452 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 455 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
453 }; | 456 }; |
454 | 457 |
455 scoped_ptr<SpdyFrame> resp(ConstructConnectRedirectReplyFrame()); | 458 scoped_ptr<SpdyFrame> resp(ConstructConnectRedirectReplyFrame()); |
456 MockRead reads[] = { | 459 MockRead reads[] = { |
457 CreateMockRead(*resp, 1, ASYNC), | 460 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
458 MockRead(ASYNC, 0, 2), // EOF | |
459 }; | 461 }; |
460 | 462 |
461 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 463 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
462 | 464 |
463 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); | 465 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); |
464 | 466 |
465 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 467 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
466 ASSERT_TRUE(response != NULL); | 468 ASSERT_TRUE(response != NULL); |
467 | 469 |
468 const HttpResponseHeaders* headers = response->headers.get(); | 470 const HttpResponseHeaders* headers = response->headers.get(); |
469 ASSERT_EQ(302, headers->response_code()); | 471 ASSERT_EQ(302, headers->response_code()); |
470 ASSERT_FALSE(headers->HasHeader("set-cookie")); | 472 ASSERT_FALSE(headers->HasHeader("set-cookie")); |
471 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); | 473 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); |
472 | 474 |
473 std::string location; | 475 std::string location; |
474 ASSERT_TRUE(headers->IsRedirect(&location)); | 476 ASSERT_TRUE(headers->IsRedirect(&location)); |
475 ASSERT_EQ(location, kRedirectUrl); | 477 ASSERT_EQ(location, kRedirectUrl); |
476 } | 478 } |
477 | 479 |
478 TEST_P(SpdyProxyClientSocketTest, ConnectFails) { | 480 TEST_P(SpdyProxyClientSocketTest, ConnectFails) { |
479 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 481 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
480 MockWrite writes[] = { | 482 MockWrite writes[] = { |
481 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 483 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
482 }; | 484 }; |
483 | 485 |
484 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 486 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
485 MockRead reads[] = { | 487 MockRead reads[] = { |
486 MockRead(ASYNC, 0, 1), // EOF | 488 MockRead(ASYNC, 0, 1), // EOF |
487 }; | 489 }; |
488 | 490 |
489 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 491 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
490 | 492 |
491 ASSERT_FALSE(sock_->IsConnected()); | 493 ASSERT_FALSE(sock_->IsConnected()); |
492 | 494 |
493 AssertConnectFails(ERR_CONNECTION_CLOSED); | 495 AssertConnectFails(ERR_CONNECTION_CLOSED); |
494 | 496 |
495 ASSERT_FALSE(sock_->IsConnected()); | 497 ASSERT_FALSE(sock_->IsConnected()); |
496 } | 498 } |
497 | 499 |
498 // ----------- WasEverUsed | 500 // ----------- WasEverUsed |
499 | 501 |
500 TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) { | 502 TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) { |
501 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 503 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
502 MockWrite writes[] = { | 504 MockWrite writes[] = { |
503 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 505 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
504 }; | 506 }; |
505 | 507 |
506 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 508 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
507 MockRead reads[] = { | 509 MockRead reads[] = { |
508 CreateMockRead(*resp, 1, ASYNC), | 510 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
509 MockRead(ASYNC, 0, 2), // EOF | |
510 }; | 511 }; |
511 | 512 |
512 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 513 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
513 | 514 |
514 EXPECT_FALSE(sock_->WasEverUsed()); | 515 EXPECT_FALSE(sock_->WasEverUsed()); |
515 AssertConnectSucceeds(); | 516 AssertConnectSucceeds(); |
516 EXPECT_TRUE(sock_->WasEverUsed()); | 517 EXPECT_TRUE(sock_->WasEverUsed()); |
517 sock_->Disconnect(); | 518 sock_->Disconnect(); |
518 EXPECT_TRUE(sock_->WasEverUsed()); | 519 EXPECT_TRUE(sock_->WasEverUsed()); |
519 } | 520 } |
520 | 521 |
521 // ----------- GetPeerAddress | 522 // ----------- GetPeerAddress |
522 | 523 |
523 TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) { | 524 TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) { |
524 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 525 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
525 MockWrite writes[] = { | 526 MockWrite writes[] = { |
526 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 527 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
527 }; | 528 }; |
528 | 529 |
529 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 530 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
530 MockRead reads[] = { | 531 MockRead reads[] = { |
531 CreateMockRead(*resp, 1, ASYNC), | 532 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
532 MockRead(ASYNC, 0, 2), // EOF | |
533 }; | 533 }; |
534 | 534 |
535 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 535 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
536 | 536 |
537 net::IPEndPoint addr; | 537 net::IPEndPoint addr; |
538 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); | 538 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); |
539 | 539 |
540 AssertConnectSucceeds(); | 540 AssertConnectSucceeds(); |
541 EXPECT_TRUE(sock_->IsConnected()); | 541 EXPECT_TRUE(sock_->IsConnected()); |
542 EXPECT_EQ(OK, sock_->GetPeerAddress(&addr)); | 542 EXPECT_EQ(OK, sock_->GetPeerAddress(&addr)); |
543 | 543 |
544 Run(1); | 544 Run(1); |
545 | 545 |
546 EXPECT_FALSE(sock_->IsConnected()); | 546 EXPECT_FALSE(sock_->IsConnected()); |
547 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); | 547 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); |
548 | 548 |
549 sock_->Disconnect(); | 549 sock_->Disconnect(); |
550 | 550 |
551 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); | 551 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); |
552 } | 552 } |
553 | 553 |
554 // ----------- Write | 554 // ----------- Write |
555 | 555 |
556 TEST_P(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) { | 556 TEST_P(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) { |
557 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 557 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
558 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 558 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
559 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 559 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
560 MockWrite writes[] = { | 560 MockWrite writes[] = { |
561 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 561 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
562 CreateMockWrite(*msg1, 2, SYNCHRONOUS), | 562 CreateMockWrite(*msg1, 2, SYNCHRONOUS), |
563 CreateMockWrite(*msg2, 3, SYNCHRONOUS), | 563 CreateMockWrite(*msg2, 3, SYNCHRONOUS), |
564 }; | 564 }; |
565 | 565 |
566 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 566 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
567 MockRead reads[] = { | 567 MockRead reads[] = { |
568 CreateMockRead(*resp, 1, ASYNC), | 568 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
569 MockRead(ASYNC, 0, 4), // EOF | |
570 }; | 569 }; |
571 | 570 |
572 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 571 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
573 | 572 |
574 AssertConnectSucceeds(); | 573 AssertConnectSucceeds(); |
575 | 574 |
576 AssertAsyncWriteSucceeds(kMsg1, kLen1); | 575 AssertAsyncWriteSucceeds(kMsg1, kLen1); |
577 AssertAsyncWriteSucceeds(kMsg2, kLen2); | 576 AssertAsyncWriteSucceeds(kMsg2, kLen2); |
578 } | 577 } |
579 | 578 |
580 TEST_P(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) { | 579 TEST_P(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) { |
581 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 580 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
582 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 581 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
583 scoped_ptr<SpdyFrame> chunk(ConstructBodyFrame(chunk_data.data(), | 582 scoped_ptr<SpdyFrame> chunk( |
584 chunk_data.length())); | 583 ConstructBodyFrame(chunk_data.data(), chunk_data.length())); |
585 MockWrite writes[] = { | 584 MockWrite writes[] = {CreateMockWrite(*conn, 0, SYNCHRONOUS), |
586 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 585 CreateMockWrite(*chunk, 2, SYNCHRONOUS), |
587 CreateMockWrite(*chunk, 2, SYNCHRONOUS), | 586 CreateMockWrite(*chunk, 3, SYNCHRONOUS), |
588 CreateMockWrite(*chunk, 3, SYNCHRONOUS), | 587 CreateMockWrite(*chunk, 4, SYNCHRONOUS)}; |
589 CreateMockWrite(*chunk, 4, SYNCHRONOUS) | |
590 }; | |
591 | 588 |
592 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 589 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
593 MockRead reads[] = { | 590 MockRead reads[] = { |
594 CreateMockRead(*resp, 1, ASYNC), | 591 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 5), // EOF |
595 MockRead(ASYNC, 0, 5), // EOF | |
596 }; | 592 }; |
597 | 593 |
598 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 594 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
599 | 595 |
600 AssertConnectSucceeds(); | 596 AssertConnectSucceeds(); |
601 | 597 |
602 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); | 598 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); |
603 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(), | 599 scoped_refptr<IOBufferWithSize> buf( |
604 big_data.length())); | 600 CreateBuffer(big_data.data(), big_data.length())); |
605 | 601 |
606 EXPECT_EQ(ERR_IO_PENDING, | 602 EXPECT_EQ(ERR_IO_PENDING, |
607 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 603 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
608 data_->RunFor(3); | 604 data_->RunFor(3); |
609 | 605 |
610 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); | 606 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); |
611 } | 607 } |
612 | 608 |
613 // ----------- Read | 609 // ----------- Read |
614 | 610 |
615 TEST_P(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) { | 611 TEST_P(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) { |
616 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 612 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
617 MockWrite writes[] = { | 613 MockWrite writes[] = { |
618 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 614 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
619 }; | 615 }; |
620 | 616 |
621 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 617 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
622 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 618 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
623 MockRead reads[] = { | 619 MockRead reads[] = { |
624 CreateMockRead(*resp, 1, ASYNC), | 620 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
625 CreateMockRead(*msg1, 2, ASYNC), | 621 MockRead(ASYNC, 0, 3), // EOF |
626 MockRead(ASYNC, 0, 3), // EOF | |
627 }; | 622 }; |
628 | 623 |
629 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 624 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
630 | 625 |
631 AssertConnectSucceeds(); | 626 AssertConnectSucceeds(); |
632 | 627 |
633 Run(1); // SpdySession consumes the next read and sends it to | 628 Run(1); // SpdySession consumes the next read and sends it to |
634 // sock_ to be buffered. | 629 // sock_ to be buffered. |
635 AssertSyncReadEquals(kMsg1, kLen1); | 630 AssertSyncReadEquals(kMsg1, kLen1); |
636 } | 631 } |
637 | 632 |
638 TEST_P(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) { | 633 TEST_P(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) { |
639 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 634 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
640 MockWrite writes[] = { | 635 MockWrite writes[] = { |
641 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 636 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
642 }; | 637 }; |
643 | 638 |
644 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 639 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
645 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 640 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
646 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 641 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
647 MockRead reads[] = { | 642 MockRead reads[] = { |
648 CreateMockRead(*resp, 1, ASYNC), | 643 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
649 CreateMockRead(*msg1, 2, ASYNC), | 644 CreateMockRead(*msg2, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
650 CreateMockRead(*msg2, 3, ASYNC), | |
651 MockRead(ASYNC, 0, 4), // EOF | |
652 }; | 645 }; |
653 | 646 |
654 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 647 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
655 | 648 |
656 AssertConnectSucceeds(); | 649 AssertConnectSucceeds(); |
657 | 650 |
658 Run(1); // SpdySession consumes the next read and sends it to | 651 Run(1); // SpdySession consumes the next read and sends it to |
659 // sock_ to be buffered. | 652 // sock_ to be buffered. |
660 AssertSyncReadEquals(kMsg1, kLen1); | 653 AssertSyncReadEquals(kMsg1, kLen1); |
661 Run(1); // SpdySession consumes the next read and sends it to | 654 Run(1); // SpdySession consumes the next read and sends it to |
662 // sock_ to be buffered. | 655 // sock_ to be buffered. |
663 AssertSyncReadEquals(kMsg2, kLen2); | 656 AssertSyncReadEquals(kMsg2, kLen2); |
664 } | 657 } |
665 | 658 |
666 TEST_P(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) { | 659 TEST_P(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) { |
667 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 660 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
668 MockWrite writes[] = { | 661 MockWrite writes[] = { |
669 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 662 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
670 }; | 663 }; |
671 | 664 |
672 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 665 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
673 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 666 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
674 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 667 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
675 MockRead reads[] = { | 668 MockRead reads[] = { |
676 CreateMockRead(*resp, 1, ASYNC), | 669 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
677 CreateMockRead(*msg1, 2, ASYNC), | 670 CreateMockRead(*msg2, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
678 CreateMockRead(*msg2, 3, ASYNC), | |
679 MockRead(ASYNC, 0, 4), // EOF | |
680 }; | 671 }; |
681 | 672 |
682 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 673 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
683 | 674 |
684 AssertConnectSucceeds(); | 675 AssertConnectSucceeds(); |
685 | 676 |
686 Run(2); // SpdySession consumes the next two reads and sends then to | 677 Run(2); // SpdySession consumes the next two reads and sends then to |
687 // sock_ to be buffered. | 678 // sock_ to be buffered. |
688 AssertSyncReadEquals(kMsg1, kLen1); | 679 AssertSyncReadEquals(kMsg1, kLen1); |
689 AssertSyncReadEquals(kMsg2, kLen2); | 680 AssertSyncReadEquals(kMsg2, kLen2); |
690 } | 681 } |
691 | 682 |
692 TEST_P(SpdyProxyClientSocketTest, | 683 TEST_P(SpdyProxyClientSocketTest, LargeReadWillMergeDataFromDifferentFrames) { |
693 LargeReadWillMergeDataFromDifferentFrames) { | |
694 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 684 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
695 MockWrite writes[] = { | 685 MockWrite writes[] = { |
696 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 686 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
697 }; | 687 }; |
698 | 688 |
699 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 689 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
700 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 690 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
701 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 691 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
702 MockRead reads[] = { | 692 MockRead reads[] = { |
703 CreateMockRead(*resp, 1, ASYNC), | 693 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg3, 2, ASYNC), |
704 CreateMockRead(*msg3, 2, ASYNC), | 694 CreateMockRead(*msg3, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
705 CreateMockRead(*msg3, 3, ASYNC), | |
706 MockRead(ASYNC, 0, 4), // EOF | |
707 }; | 695 }; |
708 | 696 |
709 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 697 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
710 | 698 |
711 AssertConnectSucceeds(); | 699 AssertConnectSucceeds(); |
712 | 700 |
713 Run(2); // SpdySession consumes the next two reads and sends then to | 701 Run(2); // SpdySession consumes the next two reads and sends then to |
714 // sock_ to be buffered. | 702 // sock_ to be buffered. |
715 // The payload from two data frames, each with kMsg3 will be combined | 703 // The payload from two data frames, each with kMsg3 will be combined |
716 // together into a single read(). | 704 // together into a single read(). |
717 AssertSyncReadEquals(kMsg33, kLen33); | 705 AssertSyncReadEquals(kMsg33, kLen33); |
718 } | 706 } |
719 | 707 |
720 TEST_P(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) { | 708 TEST_P(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) { |
721 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 709 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
722 MockWrite writes[] = { | 710 MockWrite writes[] = { |
723 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 711 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
724 }; | 712 }; |
725 | 713 |
726 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 714 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
727 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 715 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
728 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 716 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
729 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 717 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
730 MockRead reads[] = { | 718 MockRead reads[] = { |
731 CreateMockRead(*resp, 1, ASYNC), | 719 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
732 CreateMockRead(*msg1, 2, ASYNC), | 720 CreateMockRead(*msg3, 3, ASYNC), CreateMockRead(*msg3, 4, ASYNC), |
733 CreateMockRead(*msg3, 3, ASYNC), | 721 CreateMockRead(*msg2, 5, ASYNC), MockRead(ASYNC, 0, 6), // EOF |
734 CreateMockRead(*msg3, 4, ASYNC), | |
735 CreateMockRead(*msg2, 5, ASYNC), | |
736 MockRead(ASYNC, 0, 6), // EOF | |
737 }; | 722 }; |
738 | 723 |
739 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 724 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
740 | 725 |
741 AssertConnectSucceeds(); | 726 AssertConnectSucceeds(); |
742 | 727 |
743 Run(4); // SpdySession consumes the next four reads and sends then to | 728 Run(4); // SpdySession consumes the next four reads and sends then to |
744 // sock_ to be buffered. | 729 // sock_ to be buffered. |
745 AssertSyncReadEquals(kMsg1, kLen1); | 730 AssertSyncReadEquals(kMsg1, kLen1); |
746 // The payload from two data frames, each with kMsg3 will be combined | 731 // The payload from two data frames, each with kMsg3 will be combined |
747 // together into a single read(). | 732 // together into a single read(). |
748 AssertSyncReadEquals(kMsg33, kLen33); | 733 AssertSyncReadEquals(kMsg33, kLen33); |
749 AssertSyncReadEquals(kMsg2, kLen2); | 734 AssertSyncReadEquals(kMsg2, kLen2); |
750 } | 735 } |
751 | 736 |
752 TEST_P(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) { | 737 TEST_P(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) { |
753 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 738 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
754 MockWrite writes[] = { | 739 MockWrite writes[] = { |
755 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 740 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
756 }; | 741 }; |
757 | 742 |
758 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 743 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
759 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 744 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
760 scoped_ptr<SpdyFrame> msg33(ConstructBodyFrame(kMsg33, kLen33)); | 745 scoped_ptr<SpdyFrame> msg33(ConstructBodyFrame(kMsg33, kLen33)); |
761 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 746 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
762 MockRead reads[] = { | 747 MockRead reads[] = { |
763 CreateMockRead(*resp, 1, ASYNC), | 748 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
764 CreateMockRead(*msg1, 2, ASYNC), | 749 CreateMockRead(*msg33, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
765 CreateMockRead(*msg33, 3, ASYNC), | |
766 MockRead(ASYNC, 0, 4), // EOF | |
767 }; | 750 }; |
768 | 751 |
769 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 752 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
770 | 753 |
771 AssertConnectSucceeds(); | 754 AssertConnectSucceeds(); |
772 | 755 |
773 Run(2); // SpdySession consumes the next two reads and sends then to | 756 Run(2); // SpdySession consumes the next two reads and sends then to |
774 // sock_ to be buffered. | 757 // sock_ to be buffered. |
775 AssertSyncReadEquals(kMsg1, kLen1); | 758 AssertSyncReadEquals(kMsg1, kLen1); |
776 // The payload from the single large data frame will be read across | 759 // The payload from the single large data frame will be read across |
777 // two different reads. | 760 // two different reads. |
778 AssertSyncReadEquals(kMsg3, kLen3); | 761 AssertSyncReadEquals(kMsg3, kLen3); |
779 AssertSyncReadEquals(kMsg3, kLen3); | 762 AssertSyncReadEquals(kMsg3, kLen3); |
780 } | 763 } |
781 | 764 |
782 TEST_P(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) { | 765 TEST_P(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) { |
783 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 766 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
784 MockWrite writes[] = { | 767 MockWrite writes[] = { |
785 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 768 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
786 }; | 769 }; |
787 | 770 |
788 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 771 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
789 scoped_ptr<SpdyFrame> msg333(ConstructBodyFrame(kMsg333, kLen333)); | 772 scoped_ptr<SpdyFrame> msg333(ConstructBodyFrame(kMsg333, kLen333)); |
790 MockRead reads[] = { | 773 MockRead reads[] = { |
791 CreateMockRead(*resp, 1, ASYNC), | 774 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg333, 2, ASYNC), |
792 CreateMockRead(*msg333, 2, ASYNC), | 775 MockRead(ASYNC, 0, 3), // EOF |
793 MockRead(ASYNC, 0, 3), // EOF | |
794 }; | 776 }; |
795 | 777 |
796 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 778 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
797 | 779 |
798 AssertConnectSucceeds(); | 780 AssertConnectSucceeds(); |
799 | 781 |
800 Run(1); // SpdySession consumes the next read and sends it to | 782 Run(1); // SpdySession consumes the next read and sends it to |
801 // sock_ to be buffered. | 783 // sock_ to be buffered. |
802 // The payload from the single large data frame will be read across | 784 // The payload from the single large data frame will be read across |
803 // two different reads. | 785 // two different reads. |
804 AssertSyncReadEquals(kMsg33, kLen33); | 786 AssertSyncReadEquals(kMsg33, kLen33); |
805 | 787 |
806 // Now attempt to do a read of more data than remains buffered | 788 // Now attempt to do a read of more data than remains buffered |
807 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); | 789 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); |
808 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback())); | 790 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback())); |
809 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); | 791 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); |
810 ASSERT_TRUE(sock_->IsConnected()); | 792 ASSERT_TRUE(sock_->IsConnected()); |
811 } | 793 } |
812 | 794 |
813 TEST_P(SpdyProxyClientSocketTest, ReadAuthResponseBody) { | 795 TEST_P(SpdyProxyClientSocketTest, ReadAuthResponseBody) { |
814 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 796 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
815 MockWrite writes[] = { | 797 MockWrite writes[] = { |
816 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 798 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
817 }; | 799 }; |
818 | 800 |
819 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame()); | 801 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
820 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 802 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
821 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 803 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
822 MockRead reads[] = { | 804 MockRead reads[] = { |
823 CreateMockRead(*resp, 1, ASYNC), | 805 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
824 CreateMockRead(*msg1, 2, ASYNC), | 806 CreateMockRead(*msg2, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
825 CreateMockRead(*msg2, 3, ASYNC), | |
826 MockRead(ASYNC, 0, 4), // EOF | |
827 }; | 807 }; |
828 | 808 |
829 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 809 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
830 | 810 |
831 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); | 811 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
832 | 812 |
833 Run(2); // SpdySession consumes the next two reads and sends then to | 813 Run(2); // SpdySession consumes the next two reads and sends then to |
834 // sock_ to be buffered. | 814 // sock_ to be buffered. |
835 AssertSyncReadEquals(kMsg1, kLen1); | 815 AssertSyncReadEquals(kMsg1, kLen1); |
836 AssertSyncReadEquals(kMsg2, kLen2); | 816 AssertSyncReadEquals(kMsg2, kLen2); |
837 } | 817 } |
838 | 818 |
839 TEST_P(SpdyProxyClientSocketTest, ReadErrorResponseBody) { | 819 TEST_P(SpdyProxyClientSocketTest, ReadErrorResponseBody) { |
840 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 820 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
841 MockWrite writes[] = { | 821 MockWrite writes[] = { |
842 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 822 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
843 }; | 823 }; |
844 | 824 |
845 scoped_ptr<SpdyFrame> resp(ConstructConnectErrorReplyFrame()); | 825 scoped_ptr<SpdyFrame> resp(ConstructConnectErrorReplyFrame()); |
846 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 826 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
847 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 827 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
848 MockRead reads[] = { | 828 MockRead reads[] = { |
849 CreateMockRead(*resp, 1, ASYNC), | 829 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
850 CreateMockRead(*msg1, 2, ASYNC), | 830 CreateMockRead(*msg2, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
851 CreateMockRead(*msg2, 3, ASYNC), | |
852 MockRead(ASYNC, 0, 4), // EOF | |
853 }; | 831 }; |
854 | 832 |
855 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 833 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
856 | 834 |
857 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); | 835 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
858 } | 836 } |
859 | 837 |
860 // ----------- Reads and Writes | 838 // ----------- Reads and Writes |
861 | 839 |
862 TEST_P(SpdyProxyClientSocketTest, AsyncReadAroundWrite) { | 840 TEST_P(SpdyProxyClientSocketTest, AsyncReadAroundWrite) { |
863 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 841 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
864 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 842 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
865 MockWrite writes[] = { | 843 MockWrite writes[] = { |
866 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 844 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
867 CreateMockWrite(*msg2, 3, SYNCHRONOUS), | 845 CreateMockWrite(*msg2, 3, SYNCHRONOUS), |
868 }; | 846 }; |
869 | 847 |
870 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 848 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
871 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 849 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
872 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 850 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
873 MockRead reads[] = { | 851 MockRead reads[] = { |
874 CreateMockRead(*resp, 1, ASYNC), | 852 CreateMockRead(*resp, 1, ASYNC), |
875 CreateMockRead(*msg1, 2, ASYNC), // sync read | 853 CreateMockRead(*msg1, 2, ASYNC), // sync read |
876 CreateMockRead(*msg3, 4, ASYNC), // async read | 854 CreateMockRead(*msg3, 4, ASYNC), // async read |
877 MockRead(ASYNC, 0, 5), // EOF | 855 MockRead(ASYNC, 0, 5), // EOF |
878 }; | 856 }; |
879 | 857 |
880 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 858 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
881 | 859 |
882 AssertConnectSucceeds(); | 860 AssertConnectSucceeds(); |
883 | 861 |
884 Run(1); | 862 Run(1); |
885 AssertSyncReadEquals(kMsg1, kLen1); | 863 AssertSyncReadEquals(kMsg1, kLen1); |
886 | 864 |
887 AssertReadStarts(kMsg3, kLen3); | 865 AssertReadStarts(kMsg3, kLen3); |
888 // Read should block until after the write succeeds | 866 // Read should block until after the write succeeds |
889 | 867 |
890 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Runs 1 step | 868 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Runs 1 step |
891 | 869 |
892 ASSERT_FALSE(read_callback_.have_result()); | 870 ASSERT_FALSE(read_callback_.have_result()); |
893 Run(1); | 871 Run(1); |
894 // Now the read will return | 872 // Now the read will return |
895 AssertReadReturns(kMsg3, kLen3); | 873 AssertReadReturns(kMsg3, kLen3); |
896 } | 874 } |
897 | 875 |
898 TEST_P(SpdyProxyClientSocketTest, AsyncWriteAroundReads) { | 876 TEST_P(SpdyProxyClientSocketTest, AsyncWriteAroundReads) { |
899 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 877 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
900 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 878 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
901 MockWrite writes[] = { | 879 MockWrite writes[] = { |
902 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 880 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*msg2, 4, ASYNC), |
903 CreateMockWrite(*msg2, 4, ASYNC), | |
904 }; | 881 }; |
905 | 882 |
906 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 883 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
907 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 884 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
908 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 885 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
909 MockRead reads[] = { | 886 MockRead reads[] = { |
910 CreateMockRead(*resp, 1, ASYNC), | 887 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
911 CreateMockRead(*msg1, 2, ASYNC), | 888 CreateMockRead(*msg3, 3, ASYNC), MockRead(ASYNC, 0, 5), // EOF |
912 CreateMockRead(*msg3, 3, ASYNC), | |
913 MockRead(ASYNC, 0, 5), // EOF | |
914 }; | 889 }; |
915 | 890 |
916 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 891 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
917 | 892 |
918 AssertConnectSucceeds(); | 893 AssertConnectSucceeds(); |
919 | 894 |
920 Run(1); | 895 Run(1); |
921 AssertSyncReadEquals(kMsg1, kLen1); | 896 AssertSyncReadEquals(kMsg1, kLen1); |
922 // Write should block until the read completes | 897 // Write should block until the read completes |
923 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); | 898 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); |
924 | 899 |
925 AssertAsyncReadEquals(kMsg3, kLen3); | 900 AssertAsyncReadEquals(kMsg3, kLen3); |
926 | 901 |
927 ASSERT_FALSE(write_callback_.have_result()); | 902 ASSERT_FALSE(write_callback_.have_result()); |
928 | 903 |
929 // Now the write will complete | 904 // Now the write will complete |
930 Run(1); | 905 Run(1); |
931 AssertWriteLength(kLen2); | 906 AssertWriteLength(kLen2); |
932 } | 907 } |
933 | 908 |
934 // ----------- Reading/Writing on Closed socket | 909 // ----------- Reading/Writing on Closed socket |
935 | 910 |
936 // Reading from an already closed socket should return 0 | 911 // Reading from an already closed socket should return 0 |
937 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) { | 912 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) { |
938 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 913 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
939 MockWrite writes[] = { | 914 MockWrite writes[] = { |
940 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 915 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
941 }; | 916 }; |
942 | 917 |
943 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 918 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
944 MockRead reads[] = { | 919 MockRead reads[] = { |
945 CreateMockRead(*resp, 1, ASYNC), | 920 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
946 MockRead(ASYNC, 0, 2), // EOF | |
947 }; | 921 }; |
948 | 922 |
949 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 923 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
950 | 924 |
951 AssertConnectSucceeds(); | 925 AssertConnectSucceeds(); |
952 | 926 |
953 Run(1); | 927 Run(1); |
954 | 928 |
955 ASSERT_FALSE(sock_->IsConnected()); | 929 ASSERT_FALSE(sock_->IsConnected()); |
956 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 930 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
957 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 931 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
958 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 932 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
959 ASSERT_FALSE(sock_->IsConnectedAndIdle()); | 933 ASSERT_FALSE(sock_->IsConnectedAndIdle()); |
960 } | 934 } |
961 | 935 |
962 // Read pending when socket is closed should return 0 | 936 // Read pending when socket is closed should return 0 |
963 TEST_P(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { | 937 TEST_P(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { |
964 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 938 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
965 MockWrite writes[] = { | 939 MockWrite writes[] = { |
966 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 940 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
967 }; | 941 }; |
968 | 942 |
969 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 943 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
970 MockRead reads[] = { | 944 MockRead reads[] = { |
971 CreateMockRead(*resp, 1, ASYNC), | 945 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
972 MockRead(ASYNC, 0, 2), // EOF | |
973 }; | 946 }; |
974 | 947 |
975 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 948 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
976 | 949 |
977 AssertConnectSucceeds(); | 950 AssertConnectSucceeds(); |
978 | 951 |
979 AssertReadStarts(kMsg1, kLen1); | 952 AssertReadStarts(kMsg1, kLen1); |
980 | 953 |
981 Run(1); | 954 Run(1); |
982 | 955 |
983 ASSERT_EQ(0, read_callback_.WaitForResult()); | 956 ASSERT_EQ(0, read_callback_.WaitForResult()); |
984 } | 957 } |
985 | 958 |
986 // Reading from a disconnected socket is an error | 959 // Reading from a disconnected socket is an error |
987 TEST_P(SpdyProxyClientSocketTest, | 960 TEST_P(SpdyProxyClientSocketTest, ReadOnDisconnectSocketReturnsNotConnected) { |
988 ReadOnDisconnectSocketReturnsNotConnected) { | |
989 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 961 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
990 MockWrite writes[] = { | 962 MockWrite writes[] = { |
991 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 963 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
992 }; | 964 }; |
993 | 965 |
994 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 966 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
995 MockRead reads[] = { | 967 MockRead reads[] = { |
996 CreateMockRead(*resp, 1, ASYNC), | 968 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
997 MockRead(ASYNC, 0, 2), // EOF | |
998 }; | 969 }; |
999 | 970 |
1000 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 971 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1001 | 972 |
1002 AssertConnectSucceeds(); | 973 AssertConnectSucceeds(); |
1003 | 974 |
1004 sock_->Disconnect(); | 975 sock_->Disconnect(); |
1005 | 976 |
1006 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, | 977 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
1007 sock_->Read(NULL, 1, CompletionCallback())); | 978 sock_->Read(NULL, 1, CompletionCallback())); |
1008 } | 979 } |
1009 | 980 |
1010 // Reading buffered data from an already closed socket should return | 981 // Reading buffered data from an already closed socket should return |
1011 // buffered data, then 0. | 982 // buffered data, then 0. |
1012 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { | 983 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { |
1013 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 984 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
1014 MockWrite writes[] = { | 985 MockWrite writes[] = { |
1015 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 986 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
1016 }; | 987 }; |
1017 | 988 |
1018 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 989 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
1019 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 990 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
1020 MockRead reads[] = { | 991 MockRead reads[] = { |
1021 CreateMockRead(*resp, 1, ASYNC), | 992 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
1022 CreateMockRead(*msg1, 2, ASYNC), | 993 MockRead(ASYNC, 0, 3), // EOF |
1023 MockRead(ASYNC, 0, 3), // EOF | |
1024 }; | 994 }; |
1025 | 995 |
1026 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 996 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1027 | 997 |
1028 AssertConnectSucceeds(); | 998 AssertConnectSucceeds(); |
1029 | 999 |
1030 Run(2); | 1000 Run(2); |
1031 | 1001 |
1032 ASSERT_FALSE(sock_->IsConnected()); | 1002 ASSERT_FALSE(sock_->IsConnected()); |
1033 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1003 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
1034 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback())); | 1004 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback())); |
1035 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); | 1005 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); |
1036 | 1006 |
1037 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 1007 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
1038 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 1008 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
1039 sock_->Disconnect(); | 1009 sock_->Disconnect(); |
1040 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1010 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
1041 sock_->Read(NULL, 1, CompletionCallback())); | 1011 sock_->Read(NULL, 1, CompletionCallback())); |
1042 } | 1012 } |
1043 | 1013 |
1044 // Calling Write() on a closed socket is an error | 1014 // Calling Write() on a closed socket is an error |
1045 TEST_P(SpdyProxyClientSocketTest, WriteOnClosedStream) { | 1015 TEST_P(SpdyProxyClientSocketTest, WriteOnClosedStream) { |
1046 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1016 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
1047 MockWrite writes[] = { | 1017 MockWrite writes[] = { |
1048 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1018 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
1049 }; | 1019 }; |
1050 | 1020 |
1051 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1021 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
1052 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1022 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
1053 MockRead reads[] = { | 1023 MockRead reads[] = { |
1054 CreateMockRead(*resp, 1, ASYNC), | 1024 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
1055 MockRead(ASYNC, 0, 2), // EOF | |
1056 }; | 1025 }; |
1057 | 1026 |
1058 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1027 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1059 | 1028 |
1060 AssertConnectSucceeds(); | 1029 AssertConnectSucceeds(); |
1061 | 1030 |
1062 Run(1); // Read EOF which will close the stream | 1031 Run(1); // Read EOF which will close the stream |
1063 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1032 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
1064 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1033 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
1065 sock_->Write(buf.get(), buf->size(), CompletionCallback())); | 1034 sock_->Write(buf.get(), buf->size(), CompletionCallback())); |
1066 } | 1035 } |
1067 | 1036 |
1068 // Calling Write() on a disconnected socket is an error | 1037 // Calling Write() on a disconnected socket is an error |
1069 TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { | 1038 TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { |
1070 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1039 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
1071 MockWrite writes[] = { | 1040 MockWrite writes[] = { |
1072 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1041 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
1073 }; | 1042 }; |
1074 | 1043 |
1075 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1044 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
1076 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1045 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
1077 MockRead reads[] = { | 1046 MockRead reads[] = { |
1078 CreateMockRead(*resp, 1, ASYNC), | 1047 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
1079 MockRead(ASYNC, 0, 2), // EOF | |
1080 }; | 1048 }; |
1081 | 1049 |
1082 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1050 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1083 | 1051 |
1084 AssertConnectSucceeds(); | 1052 AssertConnectSucceeds(); |
1085 | 1053 |
1086 sock_->Disconnect(); | 1054 sock_->Disconnect(); |
1087 | 1055 |
1088 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1056 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
1089 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1057 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
1090 sock_->Write(buf.get(), buf->size(), CompletionCallback())); | 1058 sock_->Write(buf.get(), buf->size(), CompletionCallback())); |
1091 } | 1059 } |
1092 | 1060 |
1093 // If the socket is closed with a pending Write(), the callback | 1061 // If the socket is closed with a pending Write(), the callback |
1094 // should be called with ERR_CONNECTION_CLOSED. | 1062 // should be called with ERR_CONNECTION_CLOSED. |
1095 TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) { | 1063 TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) { |
1096 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1064 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
1097 MockWrite writes[] = { | 1065 MockWrite writes[] = { |
1098 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1066 CreateMockWrite(*conn, 0, SYNCHRONOUS), MockWrite(ASYNC, ERR_ABORTED, 2), |
1099 MockWrite(ASYNC, ERR_ABORTED, 2), | |
1100 }; | 1067 }; |
1101 | 1068 |
1102 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1069 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
1103 MockRead reads[] = { | 1070 MockRead reads[] = { |
1104 CreateMockRead(*resp, 1, ASYNC), | 1071 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), // EOF |
1105 MockRead(ASYNC, 0, 3), // EOF | |
1106 }; | 1072 }; |
1107 | 1073 |
1108 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1074 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1109 | 1075 |
1110 AssertConnectSucceeds(); | 1076 AssertConnectSucceeds(); |
1111 | 1077 |
1112 EXPECT_TRUE(sock_->IsConnected()); | 1078 EXPECT_TRUE(sock_->IsConnected()); |
1113 | 1079 |
1114 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1080 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
1115 EXPECT_EQ(ERR_IO_PENDING, | 1081 EXPECT_EQ(ERR_IO_PENDING, |
1116 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 1082 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
1117 | 1083 |
1118 CloseSpdySession(ERR_ABORTED, std::string()); | 1084 CloseSpdySession(ERR_ABORTED, std::string()); |
1119 | 1085 |
1120 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); | 1086 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); |
1121 } | 1087 } |
1122 | 1088 |
1123 // If the socket is Disconnected with a pending Write(), the callback | 1089 // If the socket is Disconnected with a pending Write(), the callback |
1124 // should not be called. | 1090 // should not be called. |
1125 TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) { | 1091 TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) { |
1126 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1092 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
1127 MockWrite writes[] = { | 1093 MockWrite writes[] = { |
1128 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1094 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
1129 MockWrite(SYNCHRONOUS, 0, 2), // EOF | 1095 MockWrite(SYNCHRONOUS, 0, 2), // EOF |
1130 }; | 1096 }; |
1131 | 1097 |
1132 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1098 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
1133 MockRead reads[] = { | 1099 MockRead reads[] = { |
1134 CreateMockRead(*resp, 1, ASYNC), | 1100 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), // EOF |
1135 MockRead(ASYNC, 0, 3), // EOF | |
1136 }; | 1101 }; |
1137 | 1102 |
1138 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1103 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1139 | 1104 |
1140 AssertConnectSucceeds(); | 1105 AssertConnectSucceeds(); |
1141 | 1106 |
1142 EXPECT_TRUE(sock_->IsConnected()); | 1107 EXPECT_TRUE(sock_->IsConnected()); |
1143 | 1108 |
1144 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1109 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
1145 EXPECT_EQ(ERR_IO_PENDING, | 1110 EXPECT_EQ(ERR_IO_PENDING, |
1146 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 1111 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
1147 | 1112 |
1148 sock_->Disconnect(); | 1113 sock_->Disconnect(); |
1149 | 1114 |
1150 EXPECT_FALSE(sock_->IsConnected()); | 1115 EXPECT_FALSE(sock_->IsConnected()); |
1151 EXPECT_FALSE(write_callback_.have_result()); | 1116 EXPECT_FALSE(write_callback_.have_result()); |
1152 } | 1117 } |
1153 | 1118 |
1154 // If the socket is Disconnected with a pending Read(), the callback | 1119 // If the socket is Disconnected with a pending Read(), the callback |
1155 // should not be called. | 1120 // should not be called. |
1156 TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) { | 1121 TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) { |
1157 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1122 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
1158 MockWrite writes[] = { | 1123 MockWrite writes[] = { |
1159 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1124 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
1160 }; | 1125 }; |
1161 | 1126 |
1162 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1127 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
1163 MockRead reads[] = { | 1128 MockRead reads[] = { |
1164 CreateMockRead(*resp, 1, ASYNC), | 1129 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
1165 MockRead(ASYNC, 0, 2), // EOF | |
1166 }; | 1130 }; |
1167 | 1131 |
1168 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1132 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1169 | 1133 |
1170 AssertConnectSucceeds(); | 1134 AssertConnectSucceeds(); |
1171 | 1135 |
1172 EXPECT_TRUE(sock_->IsConnected()); | 1136 EXPECT_TRUE(sock_->IsConnected()); |
1173 | 1137 |
1174 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1138 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
1175 ASSERT_EQ(ERR_IO_PENDING, | 1139 ASSERT_EQ(ERR_IO_PENDING, |
1176 sock_->Read(buf.get(), kLen1, read_callback_.callback())); | 1140 sock_->Read(buf.get(), kLen1, read_callback_.callback())); |
1177 | 1141 |
1178 sock_->Disconnect(); | 1142 sock_->Disconnect(); |
1179 | 1143 |
1180 EXPECT_FALSE(sock_->IsConnected()); | 1144 EXPECT_FALSE(sock_->IsConnected()); |
1181 EXPECT_FALSE(read_callback_.have_result()); | 1145 EXPECT_FALSE(read_callback_.have_result()); |
1182 } | 1146 } |
1183 | 1147 |
1184 // If the socket is Reset when both a read and write are pending, | 1148 // If the socket is Reset when both a read and write are pending, |
1185 // both should be called back. | 1149 // both should be called back. |
1186 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { | 1150 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { |
1187 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1151 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
1188 MockWrite writes[] = { | 1152 MockWrite writes[] = { |
1189 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1153 CreateMockWrite(*conn, 0, SYNCHRONOUS), MockWrite(ASYNC, ERR_ABORTED, 3), |
1190 MockWrite(ASYNC, ERR_ABORTED, 3), | |
1191 }; | 1154 }; |
1192 | 1155 |
1193 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1156 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
1194 scoped_ptr<SpdyFrame> rst( | 1157 scoped_ptr<SpdyFrame> rst( |
1195 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1158 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
1196 MockRead reads[] = { | 1159 MockRead reads[] = { |
1197 CreateMockRead(*resp, 1, ASYNC), | 1160 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*rst, 2, ASYNC), |
1198 CreateMockRead(*rst, 2, ASYNC), | 1161 MockRead(ASYNC, 0, 4) // EOF |
1199 MockRead(ASYNC, 0, 4) // EOF | |
1200 }; | 1162 }; |
1201 | 1163 |
1202 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1164 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1203 | 1165 |
1204 AssertConnectSucceeds(); | 1166 AssertConnectSucceeds(); |
1205 | 1167 |
1206 EXPECT_TRUE(sock_->IsConnected()); | 1168 EXPECT_TRUE(sock_->IsConnected()); |
1207 | 1169 |
1208 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); | 1170 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); |
1209 ASSERT_EQ(ERR_IO_PENDING, | 1171 ASSERT_EQ(ERR_IO_PENDING, |
(...skipping 10 matching lines...) Expand all Loading... |
1220 EXPECT_TRUE(sock_.get()); | 1182 EXPECT_TRUE(sock_.get()); |
1221 EXPECT_TRUE(read_callback_.have_result()); | 1183 EXPECT_TRUE(read_callback_.have_result()); |
1222 EXPECT_TRUE(write_callback_.have_result()); | 1184 EXPECT_TRUE(write_callback_.have_result()); |
1223 } | 1185 } |
1224 | 1186 |
1225 // Makes sure the proxy client socket's source gets the expected NetLog events | 1187 // Makes sure the proxy client socket's source gets the expected NetLog events |
1226 // and only the expected NetLog events (No SpdySession events). | 1188 // and only the expected NetLog events (No SpdySession events). |
1227 TEST_P(SpdyProxyClientSocketTest, NetLog) { | 1189 TEST_P(SpdyProxyClientSocketTest, NetLog) { |
1228 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1190 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
1229 MockWrite writes[] = { | 1191 MockWrite writes[] = { |
1230 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1192 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
1231 }; | 1193 }; |
1232 | 1194 |
1233 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1195 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
1234 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1196 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
1235 MockRead reads[] = { | 1197 MockRead reads[] = { |
1236 CreateMockRead(*resp, 1, ASYNC), | 1198 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
1237 CreateMockRead(*msg1, 2, ASYNC), | 1199 MockRead(ASYNC, 0, 3), // EOF |
1238 MockRead(ASYNC, 0, 3), // EOF | |
1239 }; | 1200 }; |
1240 | 1201 |
1241 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1202 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1242 | 1203 |
1243 AssertConnectSucceeds(); | 1204 AssertConnectSucceeds(); |
1244 | 1205 |
1245 Run(1); // SpdySession consumes the next read and sends it to | 1206 Run(1); // SpdySession consumes the next read and sends it to |
1246 // sock_ to be buffered. | 1207 // sock_ to be buffered. |
1247 AssertSyncReadEquals(kMsg1, kLen1); | 1208 AssertSyncReadEquals(kMsg1, kLen1); |
1248 | 1209 |
1249 NetLog::Source sock_source = sock_->NetLog().source(); | 1210 NetLog::Source sock_source = sock_->NetLog().source(); |
1250 sock_.reset(); | 1211 sock_.reset(); |
1251 | 1212 |
1252 CapturingNetLog::CapturedEntryList entry_list; | 1213 CapturingNetLog::CapturedEntryList entry_list; |
1253 net_log_.GetEntriesForSource(sock_source, &entry_list); | 1214 net_log_.GetEntriesForSource(sock_source, &entry_list); |
1254 | 1215 |
1255 ASSERT_EQ(entry_list.size(), 10u); | 1216 ASSERT_EQ(entry_list.size(), 10u); |
1256 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 0, NetLog::TYPE_SOCKET_ALIVE)); | 1217 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 0, NetLog::TYPE_SOCKET_ALIVE)); |
1257 EXPECT_TRUE(LogContainsEvent(entry_list, 1, | 1218 EXPECT_TRUE(LogContainsEvent(entry_list, |
1258 NetLog::TYPE_SPDY_PROXY_CLIENT_SESSION, | 1219 1, |
1259 NetLog::PHASE_NONE)); | 1220 NetLog::TYPE_SPDY_PROXY_CLIENT_SESSION, |
1260 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 2, | 1221 NetLog::PHASE_NONE)); |
1261 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST)); | 1222 EXPECT_TRUE(LogContainsBeginEvent( |
1262 EXPECT_TRUE(LogContainsEvent(entry_list, 3, | 1223 entry_list, 2, NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST)); |
1263 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | 1224 EXPECT_TRUE( |
1264 NetLog::PHASE_NONE)); | 1225 LogContainsEvent(entry_list, |
1265 EXPECT_TRUE(LogContainsEndEvent(entry_list, 4, | 1226 3, |
1266 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST)); | 1227 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, |
1267 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 5, | 1228 NetLog::PHASE_NONE)); |
1268 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); | 1229 EXPECT_TRUE(LogContainsEndEvent( |
1269 EXPECT_TRUE(LogContainsEvent(entry_list, 6, | 1230 entry_list, 4, NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST)); |
1270 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 1231 EXPECT_TRUE(LogContainsBeginEvent( |
1271 NetLog::PHASE_NONE)); | 1232 entry_list, 5, NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); |
1272 EXPECT_TRUE(LogContainsEndEvent(entry_list, 7, | 1233 EXPECT_TRUE(LogContainsEvent( |
1273 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); | 1234 entry_list, |
1274 EXPECT_TRUE(LogContainsEvent(entry_list, 8, | 1235 6, |
1275 NetLog::TYPE_SOCKET_BYTES_RECEIVED, | 1236 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
1276 NetLog::PHASE_NONE)); | 1237 NetLog::PHASE_NONE)); |
| 1238 EXPECT_TRUE(LogContainsEndEvent( |
| 1239 entry_list, 7, NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); |
| 1240 EXPECT_TRUE(LogContainsEvent( |
| 1241 entry_list, 8, NetLog::TYPE_SOCKET_BYTES_RECEIVED, NetLog::PHASE_NONE)); |
1277 EXPECT_TRUE(LogContainsEndEvent(entry_list, 9, NetLog::TYPE_SOCKET_ALIVE)); | 1242 EXPECT_TRUE(LogContainsEndEvent(entry_list, 9, NetLog::TYPE_SOCKET_ALIVE)); |
1278 } | 1243 } |
1279 | 1244 |
1280 // CompletionCallback that causes the SpdyProxyClientSocket to be | 1245 // CompletionCallback that causes the SpdyProxyClientSocket to be |
1281 // deleted when Run is invoked. | 1246 // deleted when Run is invoked. |
1282 class DeleteSockCallback : public TestCompletionCallbackBase { | 1247 class DeleteSockCallback : public TestCompletionCallbackBase { |
1283 public: | 1248 public: |
1284 explicit DeleteSockCallback(scoped_ptr<SpdyProxyClientSocket>* sock) | 1249 explicit DeleteSockCallback(scoped_ptr<SpdyProxyClientSocket>* sock) |
1285 : sock_(sock), | 1250 : sock_(sock), |
1286 callback_(base::Bind(&DeleteSockCallback::OnComplete, | 1251 callback_(base::Bind(&DeleteSockCallback::OnComplete, |
1287 base::Unretained(this))) { | 1252 base::Unretained(this))) {} |
1288 } | |
1289 | 1253 |
1290 virtual ~DeleteSockCallback() { | 1254 virtual ~DeleteSockCallback() {} |
1291 } | |
1292 | 1255 |
1293 const CompletionCallback& callback() const { return callback_; } | 1256 const CompletionCallback& callback() const { return callback_; } |
1294 | 1257 |
1295 private: | 1258 private: |
1296 void OnComplete(int result) { | 1259 void OnComplete(int result) { |
1297 sock_->reset(NULL); | 1260 sock_->reset(NULL); |
1298 SetResult(result); | 1261 SetResult(result); |
1299 } | 1262 } |
1300 | 1263 |
1301 scoped_ptr<SpdyProxyClientSocket>* sock_; | 1264 scoped_ptr<SpdyProxyClientSocket>* sock_; |
1302 CompletionCallback callback_; | 1265 CompletionCallback callback_; |
1303 | 1266 |
1304 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback); | 1267 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback); |
1305 }; | 1268 }; |
1306 | 1269 |
1307 // If the socket is Reset when both a read and write are pending, and the | 1270 // If the socket is Reset when both a read and write are pending, and the |
1308 // read callback causes the socket to be deleted, the write callback should | 1271 // read callback causes the socket to be deleted, the write callback should |
1309 // not be called. | 1272 // not be called. |
1310 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) { | 1273 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) { |
1311 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1274 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
1312 MockWrite writes[] = { | 1275 MockWrite writes[] = { |
1313 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1276 CreateMockWrite(*conn, 0, SYNCHRONOUS), MockWrite(ASYNC, ERR_ABORTED, 3), |
1314 MockWrite(ASYNC, ERR_ABORTED, 3), | |
1315 }; | 1277 }; |
1316 | 1278 |
1317 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1279 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
1318 scoped_ptr<SpdyFrame> rst( | 1280 scoped_ptr<SpdyFrame> rst( |
1319 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1281 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
1320 MockRead reads[] = { | 1282 MockRead reads[] = { |
1321 CreateMockRead(*resp, 1, ASYNC), | 1283 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*rst, 2, ASYNC), |
1322 CreateMockRead(*rst, 2, ASYNC), | 1284 MockRead(ASYNC, 0, 4), // EOF |
1323 MockRead(ASYNC, 0, 4), // EOF | |
1324 }; | 1285 }; |
1325 | 1286 |
1326 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1287 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1327 | 1288 |
1328 AssertConnectSucceeds(); | 1289 AssertConnectSucceeds(); |
1329 | 1290 |
1330 EXPECT_TRUE(sock_->IsConnected()); | 1291 EXPECT_TRUE(sock_->IsConnected()); |
1331 | 1292 |
1332 DeleteSockCallback read_callback(&sock_); | 1293 DeleteSockCallback read_callback(&sock_); |
1333 | 1294 |
1334 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); | 1295 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); |
1335 ASSERT_EQ(ERR_IO_PENDING, | 1296 ASSERT_EQ(ERR_IO_PENDING, |
1336 sock_->Read(read_buf.get(), kLen1, read_callback.callback())); | 1297 sock_->Read(read_buf.get(), kLen1, read_callback.callback())); |
1337 | 1298 |
1338 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); | 1299 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); |
1339 EXPECT_EQ( | 1300 EXPECT_EQ( |
1340 ERR_IO_PENDING, | 1301 ERR_IO_PENDING, |
1341 sock_->Write( | 1302 sock_->Write( |
1342 write_buf.get(), write_buf->size(), write_callback_.callback())); | 1303 write_buf.get(), write_buf->size(), write_callback_.callback())); |
1343 | 1304 |
1344 Run(1); | 1305 Run(1); |
1345 | 1306 |
1346 EXPECT_FALSE(sock_.get()); | 1307 EXPECT_FALSE(sock_.get()); |
1347 EXPECT_TRUE(read_callback.have_result()); | 1308 EXPECT_TRUE(read_callback.have_result()); |
1348 EXPECT_FALSE(write_callback_.have_result()); | 1309 EXPECT_FALSE(write_callback_.have_result()); |
1349 } | 1310 } |
1350 | 1311 |
1351 } // namespace net | 1312 } // namespace net |
OLD | NEW |