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

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

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/spdy/spdy_proxy_client_socket.h" 5 #include "net/spdy/spdy_proxy_client_socket.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "net/base/address_list.h" 10 #include "net/base/address_list.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698