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

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

Issue 2156643002: Move ~1000 SpdySerializedFrame instances from heap to stack in tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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
« no previous file with comments | « net/spdy/spdy_network_transaction_unittest.cc ('k') | net/spdy/spdy_session_pool_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/spdy/spdy_proxy_client_socket.h" 5 #include "net/spdy/spdy_proxy_client_socket.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 85
86 void TearDown() override; 86 void TearDown() override;
87 87
88 protected: 88 protected:
89 bool GetDependenciesFromPriority() const; 89 bool GetDependenciesFromPriority() const;
90 90
91 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes, 91 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes,
92 size_t writes_count); 92 size_t writes_count);
93 void PopulateConnectRequestIR(SpdyHeaderBlock* syn_ir); 93 void PopulateConnectRequestIR(SpdyHeaderBlock* syn_ir);
94 void PopulateConnectReplyIR(SpdyHeaderBlock* block, const char* status); 94 void PopulateConnectReplyIR(SpdyHeaderBlock* block, const char* status);
95 SpdySerializedFrame* ConstructConnectRequestFrame(); 95 SpdySerializedFrame ConstructConnectRequestFrame();
96 SpdySerializedFrame* ConstructConnectAuthRequestFrame(); 96 SpdySerializedFrame ConstructConnectAuthRequestFrame();
97 SpdySerializedFrame* ConstructConnectReplyFrame(); 97 SpdySerializedFrame ConstructConnectReplyFrame();
98 SpdySerializedFrame* ConstructConnectAuthReplyFrame(); 98 SpdySerializedFrame ConstructConnectAuthReplyFrame();
99 SpdySerializedFrame* ConstructConnectRedirectReplyFrame(); 99 SpdySerializedFrame ConstructConnectRedirectReplyFrame();
100 SpdySerializedFrame* ConstructConnectErrorReplyFrame(); 100 SpdySerializedFrame ConstructConnectErrorReplyFrame();
101 SpdySerializedFrame* ConstructBodyFrame(const char* data, int length); 101 SpdySerializedFrame ConstructBodyFrame(const char* data, int length);
102 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); 102 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size);
103 void AssertConnectSucceeds(); 103 void AssertConnectSucceeds();
104 void AssertConnectFails(int result); 104 void AssertConnectFails(int result);
105 void AssertConnectionEstablished(); 105 void AssertConnectionEstablished();
106 void AssertSyncReadEquals(const char* data, int len); 106 void AssertSyncReadEquals(const char* data, int len);
107 void AssertAsyncReadEquals(const char* data, int len); 107 void AssertAsyncReadEquals(const char* data, int len);
108 void AssertReadStarts(const char* data, int len); 108 void AssertReadStarts(const char* data, int len);
109 void AssertReadReturns(const char* data, int len); 109 void AssertReadReturns(const char* data, int len);
110 void AssertAsyncWriteSucceeds(const char* data, int len); 110 void AssertAsyncWriteSucceeds(const char* data, int len);
111 void AssertWriteReturns(const char* data, int len, int rv); 111 void AssertWriteReturns(const char* data, int len, int rv);
(...skipping 27 matching lines...) Expand all
139 TestCompletionCallback write_callback_; 139 TestCompletionCallback write_callback_;
140 std::unique_ptr<SequencedSocketData> data_; 140 std::unique_ptr<SequencedSocketData> data_;
141 BoundTestNetLog net_log_; 141 BoundTestNetLog net_log_;
142 142
143 private: 143 private:
144 std::unique_ptr<HttpNetworkSession> session_; 144 std::unique_ptr<HttpNetworkSession> session_;
145 scoped_refptr<IOBuffer> read_buf_; 145 scoped_refptr<IOBuffer> read_buf_;
146 SpdySessionDependencies session_deps_; 146 SpdySessionDependencies session_deps_;
147 MockConnect connect_data_; 147 MockConnect connect_data_;
148 base::WeakPtr<SpdySession> spdy_session_; 148 base::WeakPtr<SpdySession> spdy_session_;
149 BufferedSpdyFramer framer_;
150
151 std::string user_agent_; 149 std::string user_agent_;
152 GURL url_; 150 GURL url_;
153 HostPortPair proxy_host_port_; 151 HostPortPair proxy_host_port_;
154 HostPortPair endpoint_host_port_pair_; 152 HostPortPair endpoint_host_port_pair_;
155 ProxyServer proxy_; 153 ProxyServer proxy_;
156 SpdySessionKey endpoint_spdy_session_key_; 154 SpdySessionKey endpoint_spdy_session_key_;
157 155
158 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest); 156 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest);
159 }; 157 };
160 158
161 INSTANTIATE_TEST_CASE_P(ProtoPlusDepend, 159 INSTANTIATE_TEST_CASE_P(ProtoPlusDepend,
162 SpdyProxyClientSocketTest, 160 SpdyProxyClientSocketTest,
163 testing::Values(kTestCaseNoPriorityDependencies, 161 testing::Values(kTestCaseNoPriorityDependencies,
164 kTestCasePriorityDependencies)); 162 kTestCasePriorityDependencies));
165 163
166 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest() 164 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest()
167 : spdy_util_(GetDependenciesFromPriority()), 165 : spdy_util_(GetDependenciesFromPriority()),
168 read_buf_(NULL), 166 read_buf_(NULL),
169 connect_data_(SYNCHRONOUS, OK), 167 connect_data_(SYNCHRONOUS, OK),
170 framer_(),
171 user_agent_(kUserAgent), 168 user_agent_(kUserAgent),
172 url_(kRequestUrl), 169 url_(kRequestUrl),
173 proxy_host_port_(kProxyHost, kProxyPort), 170 proxy_host_port_(kProxyHost, kProxyPort),
174 endpoint_host_port_pair_(kOriginHost, kOriginPort), 171 endpoint_host_port_pair_(kOriginHost, kOriginPort),
175 proxy_(ProxyServer::SCHEME_HTTPS, proxy_host_port_), 172 proxy_(ProxyServer::SCHEME_HTTPS, proxy_host_port_),
176 endpoint_spdy_session_key_(endpoint_host_port_pair_, 173 endpoint_spdy_session_key_(endpoint_host_port_pair_,
177 proxy_, 174 proxy_,
178 PRIVACY_MODE_DISABLED) { 175 PRIVACY_MODE_DISABLED) {
179 session_deps_.net_log = net_log_.bound().net_log(); 176 session_deps_.net_log = net_log_.bound().net_log();
180 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority(); 177 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority();
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 (*block)[spdy_util_.GetHostKey()] = kOriginHostPort; 314 (*block)[spdy_util_.GetHostKey()] = kOriginHostPort;
318 (*block)["user-agent"] = kUserAgent; 315 (*block)["user-agent"] = kUserAgent;
319 } 316 }
320 317
321 void SpdyProxyClientSocketTest::PopulateConnectReplyIR(SpdyHeaderBlock* block, 318 void SpdyProxyClientSocketTest::PopulateConnectReplyIR(SpdyHeaderBlock* block,
322 const char* status) { 319 const char* status) {
323 (*block)[spdy_util_.GetStatusKey()] = status; 320 (*block)[spdy_util_.GetStatusKey()] = status;
324 } 321 }
325 322
326 // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request. 323 // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request.
327 SpdySerializedFrame* SpdyProxyClientSocketTest::ConstructConnectRequestFrame() { 324 SpdySerializedFrame SpdyProxyClientSocketTest::ConstructConnectRequestFrame() {
328 SpdyHeaderBlock block; 325 SpdyHeaderBlock block;
329 PopulateConnectRequestIR(&block); 326 PopulateConnectRequestIR(&block);
330 return spdy_util_.ConstructSpdySyn(kStreamId, std::move(block), LOWEST, 327 return spdy_util_.ConstructSpdySyn(kStreamId, std::move(block), LOWEST,
331 false); 328 false);
332 } 329 }
333 330
334 // Constructs a SPDY SYN_STREAM frame for a CONNECT request which includes 331 // Constructs a SPDY SYN_STREAM frame for a CONNECT request which includes
335 // Proxy-Authorization headers. 332 // Proxy-Authorization headers.
336 SpdySerializedFrame* 333 SpdySerializedFrame
337 SpdyProxyClientSocketTest::ConstructConnectAuthRequestFrame() { 334 SpdyProxyClientSocketTest::ConstructConnectAuthRequestFrame() {
338 SpdyHeaderBlock block; 335 SpdyHeaderBlock block;
339 PopulateConnectRequestIR(&block); 336 PopulateConnectRequestIR(&block);
340 block["proxy-authorization"] = "Basic Zm9vOmJhcg=="; 337 block["proxy-authorization"] = "Basic Zm9vOmJhcg==";
341 return spdy_util_.ConstructSpdySyn(kStreamId, std::move(block), LOWEST, 338 return spdy_util_.ConstructSpdySyn(kStreamId, std::move(block), LOWEST,
342 false); 339 false);
343 } 340 }
344 341
345 // Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT. 342 // Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT.
346 SpdySerializedFrame* SpdyProxyClientSocketTest::ConstructConnectReplyFrame() { 343 SpdySerializedFrame SpdyProxyClientSocketTest::ConstructConnectReplyFrame() {
347 SpdyHeaderBlock block; 344 SpdyHeaderBlock block;
348 PopulateConnectReplyIR(&block, "200"); 345 PopulateConnectReplyIR(&block, "200");
349 return spdy_util_.ConstructSpdyReply(kStreamId, std::move(block)); 346 return spdy_util_.ConstructSpdyReply(kStreamId, std::move(block));
350 } 347 }
351 348
352 // Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT, 349 // Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT,
353 // including Proxy-Authenticate headers. 350 // including Proxy-Authenticate headers.
354 SpdySerializedFrame* 351 SpdySerializedFrame
355 SpdyProxyClientSocketTest::ConstructConnectAuthReplyFrame() { 352 SpdyProxyClientSocketTest::ConstructConnectAuthReplyFrame() {
356 SpdyHeaderBlock block; 353 SpdyHeaderBlock block;
357 PopulateConnectReplyIR(&block, "407"); 354 PopulateConnectReplyIR(&block, "407");
358 block["proxy-authenticate"] = "Basic realm=\"MyRealm1\""; 355 block["proxy-authenticate"] = "Basic realm=\"MyRealm1\"";
359 return spdy_util_.ConstructSpdyReply(kStreamId, std::move(block)); 356 return spdy_util_.ConstructSpdyReply(kStreamId, std::move(block));
360 } 357 }
361 358
362 // Constructs a SPDY SYN_REPLY frame with an HTTP 302 redirect. 359 // Constructs a SPDY SYN_REPLY frame with an HTTP 302 redirect.
363 SpdySerializedFrame* 360 SpdySerializedFrame
364 SpdyProxyClientSocketTest::ConstructConnectRedirectReplyFrame() { 361 SpdyProxyClientSocketTest::ConstructConnectRedirectReplyFrame() {
365 SpdyHeaderBlock block; 362 SpdyHeaderBlock block;
366 PopulateConnectReplyIR(&block, "302"); 363 PopulateConnectReplyIR(&block, "302");
367 block["location"] = kRedirectUrl; 364 block["location"] = kRedirectUrl;
368 block["set-cookie"] = "foo=bar"; 365 block["set-cookie"] = "foo=bar";
369 return spdy_util_.ConstructSpdyReply(kStreamId, std::move(block)); 366 return spdy_util_.ConstructSpdyReply(kStreamId, std::move(block));
370 } 367 }
371 368
372 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. 369 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error.
373 SpdySerializedFrame* 370 SpdySerializedFrame
374 SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { 371 SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() {
375 SpdyHeaderBlock block; 372 SpdyHeaderBlock block;
376 PopulateConnectReplyIR(&block, "500"); 373 PopulateConnectReplyIR(&block, "500");
377 return spdy_util_.ConstructSpdyReply(kStreamId, std::move(block)); 374 return spdy_util_.ConstructSpdyReply(kStreamId, std::move(block));
378 } 375 }
379 376
380 SpdySerializedFrame* SpdyProxyClientSocketTest::ConstructBodyFrame( 377 SpdySerializedFrame SpdyProxyClientSocketTest::ConstructBodyFrame(
381 const char* data, 378 const char* data,
382 int length) { 379 int length) {
383 return framer_.CreateDataFrame(kStreamId, data, length, DATA_FLAG_NONE); 380 return spdy_util_.ConstructSpdyDataFrame(kStreamId, data, length,
381 /*fin=*/false);
384 } 382 }
385 383
386 // ----------- Connect 384 // ----------- Connect
387 385
388 TEST_P(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) { 386 TEST_P(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) {
389 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 387 SpdySerializedFrame conn(ConstructConnectRequestFrame());
390 MockWrite writes[] = { 388 MockWrite writes[] = {
391 CreateMockWrite(*conn, 0, SYNCHRONOUS), 389 CreateMockWrite(conn, 0, SYNCHRONOUS),
392 }; 390 };
393 391
394 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 392 SpdySerializedFrame resp(ConstructConnectReplyFrame());
395 MockRead reads[] = { 393 MockRead reads[] = {
396 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 394 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
397 }; 395 };
398 396
399 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 397 Initialize(reads, arraysize(reads), writes, arraysize(writes));
400 398
401 ASSERT_FALSE(sock_->IsConnected()); 399 ASSERT_FALSE(sock_->IsConnected());
402 400
403 AssertConnectSucceeds(); 401 AssertConnectSucceeds();
404 402
405 AssertConnectionEstablished(); 403 AssertConnectionEstablished();
406 } 404 }
407 405
408 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { 406 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthRequested) {
409 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 407 SpdySerializedFrame conn(ConstructConnectRequestFrame());
410 MockWrite writes[] = { 408 MockWrite writes[] = {
411 CreateMockWrite(*conn, 0, SYNCHRONOUS), 409 CreateMockWrite(conn, 0, SYNCHRONOUS),
412 }; 410 };
413 411
414 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectAuthReplyFrame()); 412 SpdySerializedFrame resp(ConstructConnectAuthReplyFrame());
415 MockRead reads[] = { 413 MockRead reads[] = {
416 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 414 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
417 }; 415 };
418 416
419 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 417 Initialize(reads, arraysize(reads), writes, arraysize(writes));
420 418
421 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); 419 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
422 420
423 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); 421 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
424 ASSERT_TRUE(response != NULL); 422 ASSERT_TRUE(response != NULL);
425 ASSERT_EQ(407, response->headers->response_code()); 423 ASSERT_EQ(407, response->headers->response_code());
426 } 424 }
427 425
428 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { 426 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) {
429 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectAuthRequestFrame()); 427 SpdySerializedFrame conn(ConstructConnectAuthRequestFrame());
430 MockWrite writes[] = { 428 MockWrite writes[] = {
431 CreateMockWrite(*conn, 0, SYNCHRONOUS), 429 CreateMockWrite(conn, 0, SYNCHRONOUS),
432 }; 430 };
433 431
434 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 432 SpdySerializedFrame resp(ConstructConnectReplyFrame());
435 MockRead reads[] = { 433 MockRead reads[] = {
436 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 434 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
437 }; 435 };
438 436
439 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 437 Initialize(reads, arraysize(reads), writes, arraysize(writes));
440 AddAuthToCache(); 438 AddAuthToCache();
441 439
442 AssertConnectSucceeds(); 440 AssertConnectSucceeds();
443 441
444 AssertConnectionEstablished(); 442 AssertConnectionEstablished();
445 } 443 }
446 444
447 TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) { 445 TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) {
448 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 446 SpdySerializedFrame conn(ConstructConnectRequestFrame());
449 std::unique_ptr<SpdySerializedFrame> rst( 447 SpdySerializedFrame rst(
450 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 448 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
451 MockWrite writes[] = { 449 MockWrite writes[] = {
452 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3), 450 CreateMockWrite(conn, 0, SYNCHRONOUS), CreateMockWrite(rst, 3),
453 }; 451 };
454 452
455 std::unique_ptr<SpdySerializedFrame> resp( 453 SpdySerializedFrame resp(ConstructConnectRedirectReplyFrame());
456 ConstructConnectRedirectReplyFrame());
457 MockRead reads[] = { 454 MockRead reads[] = {
458 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 455 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
459 }; 456 };
460 457
461 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 458 Initialize(reads, arraysize(reads), writes, arraysize(writes));
462 459
463 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); 460 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE);
464 461
465 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); 462 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
466 ASSERT_TRUE(response != NULL); 463 ASSERT_TRUE(response != NULL);
467 464
468 const HttpResponseHeaders* headers = response->headers.get(); 465 const HttpResponseHeaders* headers = response->headers.get();
469 ASSERT_EQ(302, headers->response_code()); 466 ASSERT_EQ(302, headers->response_code());
470 ASSERT_FALSE(headers->HasHeader("set-cookie")); 467 ASSERT_FALSE(headers->HasHeader("set-cookie"));
471 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); 468 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0"));
472 469
473 std::string location; 470 std::string location;
474 ASSERT_TRUE(headers->IsRedirect(&location)); 471 ASSERT_TRUE(headers->IsRedirect(&location));
475 ASSERT_EQ(location, kRedirectUrl); 472 ASSERT_EQ(location, kRedirectUrl);
476 473
477 // Let the RST_STREAM write while |rst| is in-scope. 474 // Let the RST_STREAM write while |rst| is in-scope.
478 base::RunLoop().RunUntilIdle(); 475 base::RunLoop().RunUntilIdle();
479 } 476 }
480 477
481 TEST_P(SpdyProxyClientSocketTest, ConnectFails) { 478 TEST_P(SpdyProxyClientSocketTest, ConnectFails) {
482 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 479 SpdySerializedFrame conn(ConstructConnectRequestFrame());
483 MockWrite writes[] = { 480 MockWrite writes[] = {
484 CreateMockWrite(*conn, 0, SYNCHRONOUS), 481 CreateMockWrite(conn, 0, SYNCHRONOUS),
485 }; 482 };
486 483
487 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 484 SpdySerializedFrame resp(ConstructConnectReplyFrame());
488 MockRead reads[] = { 485 MockRead reads[] = {
489 MockRead(ASYNC, 0, 1), // EOF 486 MockRead(ASYNC, 0, 1), // EOF
490 }; 487 };
491 488
492 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 489 Initialize(reads, arraysize(reads), writes, arraysize(writes));
493 490
494 ASSERT_FALSE(sock_->IsConnected()); 491 ASSERT_FALSE(sock_->IsConnected());
495 492
496 AssertConnectFails(ERR_CONNECTION_CLOSED); 493 AssertConnectFails(ERR_CONNECTION_CLOSED);
497 494
498 ASSERT_FALSE(sock_->IsConnected()); 495 ASSERT_FALSE(sock_->IsConnected());
499 } 496 }
500 497
501 // ----------- WasEverUsed 498 // ----------- WasEverUsed
502 499
503 TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) { 500 TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) {
504 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 501 SpdySerializedFrame conn(ConstructConnectRequestFrame());
505 std::unique_ptr<SpdySerializedFrame> rst( 502 SpdySerializedFrame rst(
506 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 503 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
507 MockWrite writes[] = { 504 MockWrite writes[] = {
508 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3), 505 CreateMockWrite(conn, 0, SYNCHRONOUS), CreateMockWrite(rst, 3),
509 }; 506 };
510 507
511 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 508 SpdySerializedFrame resp(ConstructConnectReplyFrame());
512 MockRead reads[] = { 509 MockRead reads[] = {
513 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 510 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
514 }; 511 };
515 512
516 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 513 Initialize(reads, arraysize(reads), writes, arraysize(writes));
517 514
518 EXPECT_FALSE(sock_->WasEverUsed()); 515 EXPECT_FALSE(sock_->WasEverUsed());
519 AssertConnectSucceeds(); 516 AssertConnectSucceeds();
520 EXPECT_TRUE(sock_->WasEverUsed()); 517 EXPECT_TRUE(sock_->WasEverUsed());
521 sock_->Disconnect(); 518 sock_->Disconnect();
522 EXPECT_TRUE(sock_->WasEverUsed()); 519 EXPECT_TRUE(sock_->WasEverUsed());
523 520
524 // Let the RST_STREAM write while |rst| is in-scope. 521 // Let the RST_STREAM write while |rst| is in-scope.
525 base::RunLoop().RunUntilIdle(); 522 base::RunLoop().RunUntilIdle();
526 } 523 }
527 524
528 // ----------- GetPeerAddress 525 // ----------- GetPeerAddress
529 526
530 TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) { 527 TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) {
531 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 528 SpdySerializedFrame conn(ConstructConnectRequestFrame());
532 MockWrite writes[] = { 529 MockWrite writes[] = {
533 CreateMockWrite(*conn, 0, SYNCHRONOUS), 530 CreateMockWrite(conn, 0, SYNCHRONOUS),
534 }; 531 };
535 532
536 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 533 SpdySerializedFrame resp(ConstructConnectReplyFrame());
537 MockRead reads[] = { 534 MockRead reads[] = {
538 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 535 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
539 MockRead(ASYNC, 0, 3), // EOF 536 MockRead(ASYNC, 0, 3), // EOF
540 }; 537 };
541 538
542 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 539 Initialize(reads, arraysize(reads), writes, arraysize(writes));
543 540
544 IPEndPoint addr; 541 IPEndPoint addr;
545 EXPECT_THAT(sock_->GetPeerAddress(&addr), IsError(ERR_SOCKET_NOT_CONNECTED)); 542 EXPECT_THAT(sock_->GetPeerAddress(&addr), IsError(ERR_SOCKET_NOT_CONNECTED));
546 543
547 AssertConnectSucceeds(); 544 AssertConnectSucceeds();
548 EXPECT_TRUE(sock_->IsConnected()); 545 EXPECT_TRUE(sock_->IsConnected());
549 EXPECT_THAT(sock_->GetPeerAddress(&addr), IsOk()); 546 EXPECT_THAT(sock_->GetPeerAddress(&addr), IsOk());
550 547
551 ResumeAndRun(); 548 ResumeAndRun();
552 549
553 EXPECT_FALSE(sock_->IsConnected()); 550 EXPECT_FALSE(sock_->IsConnected());
554 EXPECT_THAT(sock_->GetPeerAddress(&addr), IsError(ERR_SOCKET_NOT_CONNECTED)); 551 EXPECT_THAT(sock_->GetPeerAddress(&addr), IsError(ERR_SOCKET_NOT_CONNECTED));
555 552
556 sock_->Disconnect(); 553 sock_->Disconnect();
557 554
558 EXPECT_THAT(sock_->GetPeerAddress(&addr), IsError(ERR_SOCKET_NOT_CONNECTED)); 555 EXPECT_THAT(sock_->GetPeerAddress(&addr), IsError(ERR_SOCKET_NOT_CONNECTED));
559 } 556 }
560 557
561 // ----------- Write 558 // ----------- Write
562 559
563 TEST_P(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) { 560 TEST_P(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) {
564 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 561 SpdySerializedFrame conn(ConstructConnectRequestFrame());
565 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 562 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
566 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); 563 SpdySerializedFrame msg2(ConstructBodyFrame(kMsg2, kLen2));
567 MockWrite writes[] = { 564 MockWrite writes[] = {
568 CreateMockWrite(*conn, 0, SYNCHRONOUS), 565 CreateMockWrite(conn, 0, SYNCHRONOUS),
569 CreateMockWrite(*msg1, 3, SYNCHRONOUS), 566 CreateMockWrite(msg1, 3, SYNCHRONOUS),
570 CreateMockWrite(*msg2, 4, SYNCHRONOUS), 567 CreateMockWrite(msg2, 4, SYNCHRONOUS),
571 }; 568 };
572 569
573 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 570 SpdySerializedFrame resp(ConstructConnectReplyFrame());
574 MockRead reads[] = { 571 MockRead reads[] = {
575 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 572 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
576 }; 573 };
577 574
578 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 575 Initialize(reads, arraysize(reads), writes, arraysize(writes));
579 576
580 AssertConnectSucceeds(); 577 AssertConnectSucceeds();
581 578
582 AssertAsyncWriteSucceeds(kMsg1, kLen1); 579 AssertAsyncWriteSucceeds(kMsg1, kLen1);
583 AssertAsyncWriteSucceeds(kMsg2, kLen2); 580 AssertAsyncWriteSucceeds(kMsg2, kLen2);
584 } 581 }
585 582
586 TEST_P(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) { 583 TEST_P(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) {
587 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); 584 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x');
588 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 585 SpdySerializedFrame conn(ConstructConnectRequestFrame());
589 std::unique_ptr<SpdySerializedFrame> chunk( 586 SpdySerializedFrame chunk(
590 ConstructBodyFrame(chunk_data.data(), chunk_data.length())); 587 ConstructBodyFrame(chunk_data.data(), chunk_data.length()));
591 MockWrite writes[] = {CreateMockWrite(*conn, 0, SYNCHRONOUS), 588 MockWrite writes[] = {CreateMockWrite(conn, 0, SYNCHRONOUS),
592 CreateMockWrite(*chunk, 3, SYNCHRONOUS), 589 CreateMockWrite(chunk, 3, SYNCHRONOUS),
593 CreateMockWrite(*chunk, 4, SYNCHRONOUS), 590 CreateMockWrite(chunk, 4, SYNCHRONOUS),
594 CreateMockWrite(*chunk, 5, SYNCHRONOUS)}; 591 CreateMockWrite(chunk, 5, SYNCHRONOUS)};
595 592
596 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 593 SpdySerializedFrame resp(ConstructConnectReplyFrame());
597 MockRead reads[] = { 594 MockRead reads[] = {
598 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 595 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
599 }; 596 };
600 597
601 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 598 Initialize(reads, arraysize(reads), writes, arraysize(writes));
602 599
603 AssertConnectSucceeds(); 600 AssertConnectSucceeds();
604 601
605 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); 602 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x');
606 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(), 603 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(),
607 big_data.length())); 604 big_data.length()));
608 605
609 EXPECT_EQ(ERR_IO_PENDING, 606 EXPECT_EQ(ERR_IO_PENDING,
610 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); 607 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
611 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); 608 EXPECT_EQ(buf->size(), write_callback_.WaitForResult());
612 } 609 }
613 610
614 // ----------- Read 611 // ----------- Read
615 612
616 TEST_P(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) { 613 TEST_P(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) {
617 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 614 SpdySerializedFrame conn(ConstructConnectRequestFrame());
618 MockWrite writes[] = { 615 MockWrite writes[] = {
619 CreateMockWrite(*conn, 0, SYNCHRONOUS), 616 CreateMockWrite(conn, 0, SYNCHRONOUS),
620 }; 617 };
621 618
622 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 619 SpdySerializedFrame resp(ConstructConnectReplyFrame());
623 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 620 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
624 MockRead reads[] = { 621 MockRead reads[] = {
625 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 622 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
626 CreateMockRead(*msg1, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4), 623 CreateMockRead(msg1, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
627 }; 624 };
628 625
629 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 626 Initialize(reads, arraysize(reads), writes, arraysize(writes));
630 627
631 AssertConnectSucceeds(); 628 AssertConnectSucceeds();
632 629
633 // SpdySession consumes the next read and sends it to sock_ to be buffered. 630 // SpdySession consumes the next read and sends it to sock_ to be buffered.
634 ResumeAndRun(); 631 ResumeAndRun();
635 AssertSyncReadEquals(kMsg1, kLen1); 632 AssertSyncReadEquals(kMsg1, kLen1);
636 } 633 }
637 634
638 TEST_P(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) { 635 TEST_P(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) {
639 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 636 SpdySerializedFrame conn(ConstructConnectRequestFrame());
640 MockWrite writes[] = { 637 MockWrite writes[] = {
641 CreateMockWrite(*conn, 0, SYNCHRONOUS), 638 CreateMockWrite(conn, 0, SYNCHRONOUS),
642 }; 639 };
643 640
644 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 641 SpdySerializedFrame resp(ConstructConnectReplyFrame());
645 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 642 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
646 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); 643 SpdySerializedFrame msg2(ConstructBodyFrame(kMsg2, kLen2));
647 MockRead reads[] = { 644 MockRead reads[] = {
648 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 645 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
649 CreateMockRead(*msg1, 3, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 4), 646 CreateMockRead(msg1, 3, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 4),
650 CreateMockRead(*msg2, 5, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), 647 CreateMockRead(msg2, 5, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
651 }; 648 };
652 649
653 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 650 Initialize(reads, arraysize(reads), writes, arraysize(writes));
654 651
655 AssertConnectSucceeds(); 652 AssertConnectSucceeds();
656 653
657 // SpdySession consumes the next read and sends it to sock_ to be buffered. 654 // SpdySession consumes the next read and sends it to sock_ to be buffered.
658 ResumeAndRun(); 655 ResumeAndRun();
659 AssertSyncReadEquals(kMsg1, kLen1); 656 AssertSyncReadEquals(kMsg1, kLen1);
660 // SpdySession consumes the next read and sends it to sock_ to be buffered. 657 // SpdySession consumes the next read and sends it to sock_ to be buffered.
661 ResumeAndRun(); 658 ResumeAndRun();
662 AssertSyncReadEquals(kMsg2, kLen2); 659 AssertSyncReadEquals(kMsg2, kLen2);
663 } 660 }
664 661
665 TEST_P(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) { 662 TEST_P(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) {
666 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 663 SpdySerializedFrame conn(ConstructConnectRequestFrame());
667 MockWrite writes[] = { 664 MockWrite writes[] = {
668 CreateMockWrite(*conn, 0, SYNCHRONOUS), 665 CreateMockWrite(conn, 0, SYNCHRONOUS),
669 }; 666 };
670 667
671 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 668 SpdySerializedFrame resp(ConstructConnectReplyFrame());
672 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 669 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
673 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); 670 SpdySerializedFrame msg2(ConstructBodyFrame(kMsg2, kLen2));
674 MockRead reads[] = { 671 MockRead reads[] = {
675 CreateMockRead(*resp, 1, ASYNC), 672 CreateMockRead(resp, 1, ASYNC),
676 MockRead(ASYNC, ERR_IO_PENDING, 2), 673 MockRead(ASYNC, ERR_IO_PENDING, 2),
677 CreateMockRead(*msg1, 3, ASYNC), 674 CreateMockRead(msg1, 3, ASYNC),
678 CreateMockRead(*msg2, 4, ASYNC), 675 CreateMockRead(msg2, 4, ASYNC),
679 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), 676 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
680 }; 677 };
681 678
682 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 679 Initialize(reads, arraysize(reads), writes, arraysize(writes));
683 680
684 AssertConnectSucceeds(); 681 AssertConnectSucceeds();
685 682
686 // SpdySession consumes the next two reads and sends then to sock_ to be 683 // SpdySession consumes the next two reads and sends then to sock_ to be
687 // buffered. 684 // buffered.
688 ResumeAndRun(); 685 ResumeAndRun();
689 AssertSyncReadEquals(kMsg1, kLen1); 686 AssertSyncReadEquals(kMsg1, kLen1);
690 AssertSyncReadEquals(kMsg2, kLen2); 687 AssertSyncReadEquals(kMsg2, kLen2);
691 } 688 }
692 689
693 TEST_P(SpdyProxyClientSocketTest, 690 TEST_P(SpdyProxyClientSocketTest,
694 LargeReadWillMergeDataFromDifferentFrames) { 691 LargeReadWillMergeDataFromDifferentFrames) {
695 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 692 SpdySerializedFrame conn(ConstructConnectRequestFrame());
696 MockWrite writes[] = { 693 MockWrite writes[] = {
697 CreateMockWrite(*conn, 0, SYNCHRONOUS), 694 CreateMockWrite(conn, 0, SYNCHRONOUS),
698 }; 695 };
699 696
700 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 697 SpdySerializedFrame resp(ConstructConnectReplyFrame());
701 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 698 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
702 std::unique_ptr<SpdySerializedFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); 699 SpdySerializedFrame msg3(ConstructBodyFrame(kMsg3, kLen3));
703 MockRead reads[] = { 700 MockRead reads[] = {
704 CreateMockRead(*resp, 1, ASYNC), 701 CreateMockRead(resp, 1, ASYNC),
705 MockRead(ASYNC, ERR_IO_PENDING, 2), 702 MockRead(ASYNC, ERR_IO_PENDING, 2),
706 CreateMockRead(*msg3, 3, ASYNC), 703 CreateMockRead(msg3, 3, ASYNC),
707 CreateMockRead(*msg3, 4, ASYNC), 704 CreateMockRead(msg3, 4, ASYNC),
708 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), 705 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
709 }; 706 };
710 707
711 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 708 Initialize(reads, arraysize(reads), writes, arraysize(writes));
712 709
713 AssertConnectSucceeds(); 710 AssertConnectSucceeds();
714 711
715 // SpdySession consumes the next two reads and sends then to sock_ to be 712 // SpdySession consumes the next two reads and sends then to sock_ to be
716 // buffered. 713 // buffered.
717 ResumeAndRun(); 714 ResumeAndRun();
718 // The payload from two data frames, each with kMsg3 will be combined 715 // The payload from two data frames, each with kMsg3 will be combined
719 // together into a single read(). 716 // together into a single read().
720 AssertSyncReadEquals(kMsg33, kLen33); 717 AssertSyncReadEquals(kMsg33, kLen33);
721 } 718 }
722 719
723 TEST_P(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) { 720 TEST_P(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) {
724 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 721 SpdySerializedFrame conn(ConstructConnectRequestFrame());
725 MockWrite writes[] = { 722 MockWrite writes[] = {
726 CreateMockWrite(*conn, 0, SYNCHRONOUS), 723 CreateMockWrite(conn, 0, SYNCHRONOUS),
727 }; 724 };
728 725
729 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 726 SpdySerializedFrame resp(ConstructConnectReplyFrame());
730 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 727 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
731 std::unique_ptr<SpdySerializedFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); 728 SpdySerializedFrame msg3(ConstructBodyFrame(kMsg3, kLen3));
732 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); 729 SpdySerializedFrame msg2(ConstructBodyFrame(kMsg2, kLen2));
733 MockRead reads[] = { 730 MockRead reads[] = {
734 CreateMockRead(*resp, 1, ASYNC), 731 CreateMockRead(resp, 1, ASYNC),
735 MockRead(ASYNC, ERR_IO_PENDING, 2), 732 MockRead(ASYNC, ERR_IO_PENDING, 2),
736 CreateMockRead(*msg1, 3, ASYNC), 733 CreateMockRead(msg1, 3, ASYNC),
737 CreateMockRead(*msg3, 4, ASYNC), 734 CreateMockRead(msg3, 4, ASYNC),
738 CreateMockRead(*msg3, 5, ASYNC), 735 CreateMockRead(msg3, 5, ASYNC),
739 CreateMockRead(*msg2, 6, ASYNC), 736 CreateMockRead(msg2, 6, ASYNC),
740 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), 737 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7),
741 }; 738 };
742 739
743 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 740 Initialize(reads, arraysize(reads), writes, arraysize(writes));
744 741
745 AssertConnectSucceeds(); 742 AssertConnectSucceeds();
746 743
747 // SpdySession consumes the next four reads and sends then to sock_ to be 744 // SpdySession consumes the next four reads and sends then to sock_ to be
748 // buffered. 745 // buffered.
749 ResumeAndRun(); 746 ResumeAndRun();
750 AssertSyncReadEquals(kMsg1, kLen1); 747 AssertSyncReadEquals(kMsg1, kLen1);
751 // The payload from two data frames, each with kMsg3 will be combined 748 // The payload from two data frames, each with kMsg3 will be combined
752 // together into a single read(). 749 // together into a single read().
753 AssertSyncReadEquals(kMsg33, kLen33); 750 AssertSyncReadEquals(kMsg33, kLen33);
754 AssertSyncReadEquals(kMsg2, kLen2); 751 AssertSyncReadEquals(kMsg2, kLen2);
755 } 752 }
756 753
757 TEST_P(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) { 754 TEST_P(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) {
758 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 755 SpdySerializedFrame conn(ConstructConnectRequestFrame());
759 MockWrite writes[] = { 756 MockWrite writes[] = {
760 CreateMockWrite(*conn, 0, SYNCHRONOUS), 757 CreateMockWrite(conn, 0, SYNCHRONOUS),
761 }; 758 };
762 759
763 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 760 SpdySerializedFrame resp(ConstructConnectReplyFrame());
764 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 761 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
765 std::unique_ptr<SpdySerializedFrame> msg33( 762 SpdySerializedFrame msg33(ConstructBodyFrame(kMsg33, kLen33));
766 ConstructBodyFrame(kMsg33, kLen33)); 763 SpdySerializedFrame msg2(ConstructBodyFrame(kMsg2, kLen2));
767 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
768 MockRead reads[] = { 764 MockRead reads[] = {
769 CreateMockRead(*resp, 1, ASYNC), 765 CreateMockRead(resp, 1, ASYNC),
770 MockRead(ASYNC, ERR_IO_PENDING, 2), 766 MockRead(ASYNC, ERR_IO_PENDING, 2),
771 CreateMockRead(*msg1, 3, ASYNC), 767 CreateMockRead(msg1, 3, ASYNC),
772 CreateMockRead(*msg33, 4, ASYNC), 768 CreateMockRead(msg33, 4, ASYNC),
773 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), 769 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
774 }; 770 };
775 771
776 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 772 Initialize(reads, arraysize(reads), writes, arraysize(writes));
777 773
778 AssertConnectSucceeds(); 774 AssertConnectSucceeds();
779 775
780 // SpdySession consumes the next two reads and sends then to sock_ to be 776 // SpdySession consumes the next two reads and sends then to sock_ to be
781 // buffered. 777 // buffered.
782 ResumeAndRun(); 778 ResumeAndRun();
783 AssertSyncReadEquals(kMsg1, kLen1); 779 AssertSyncReadEquals(kMsg1, kLen1);
784 // The payload from the single large data frame will be read across 780 // The payload from the single large data frame will be read across
785 // two different reads. 781 // two different reads.
786 AssertSyncReadEquals(kMsg3, kLen3); 782 AssertSyncReadEquals(kMsg3, kLen3);
787 AssertSyncReadEquals(kMsg3, kLen3); 783 AssertSyncReadEquals(kMsg3, kLen3);
788 } 784 }
789 785
790 TEST_P(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) { 786 TEST_P(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) {
791 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 787 SpdySerializedFrame conn(ConstructConnectRequestFrame());
792 MockWrite writes[] = { 788 MockWrite writes[] = {
793 CreateMockWrite(*conn, 0, SYNCHRONOUS), 789 CreateMockWrite(conn, 0, SYNCHRONOUS),
794 }; 790 };
795 791
796 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 792 SpdySerializedFrame resp(ConstructConnectReplyFrame());
797 std::unique_ptr<SpdySerializedFrame> msg333( 793 SpdySerializedFrame msg333(ConstructBodyFrame(kMsg333, kLen333));
798 ConstructBodyFrame(kMsg333, kLen333));
799 MockRead reads[] = { 794 MockRead reads[] = {
800 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 795 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
801 CreateMockRead(*msg333, 3, ASYNC), 796 CreateMockRead(msg333, 3, ASYNC),
802 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4), 797 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
803 }; 798 };
804 799
805 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 800 Initialize(reads, arraysize(reads), writes, arraysize(writes));
806 801
807 AssertConnectSucceeds(); 802 AssertConnectSucceeds();
808 803
809 // SpdySession consumes the next read and sends it to sock_ to be buffered. 804 // SpdySession consumes the next read and sends it to sock_ to be buffered.
810 ResumeAndRun(); 805 ResumeAndRun();
811 // The payload from the single large data frame will be read across 806 // The payload from the single large data frame will be read across
812 // two different reads. 807 // two different reads.
813 AssertSyncReadEquals(kMsg33, kLen33); 808 AssertSyncReadEquals(kMsg33, kLen33);
814 809
815 // Now attempt to do a read of more data than remains buffered 810 // Now attempt to do a read of more data than remains buffered
816 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); 811 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33));
817 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback())); 812 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback()));
818 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); 813 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3));
819 ASSERT_TRUE(sock_->IsConnected()); 814 ASSERT_TRUE(sock_->IsConnected());
820 } 815 }
821 816
822 TEST_P(SpdyProxyClientSocketTest, ReadAuthResponseBody) { 817 TEST_P(SpdyProxyClientSocketTest, ReadAuthResponseBody) {
823 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 818 SpdySerializedFrame conn(ConstructConnectRequestFrame());
824 MockWrite writes[] = { 819 MockWrite writes[] = {
825 CreateMockWrite(*conn, 0, SYNCHRONOUS), 820 CreateMockWrite(conn, 0, SYNCHRONOUS),
826 }; 821 };
827 822
828 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectAuthReplyFrame()); 823 SpdySerializedFrame resp(ConstructConnectAuthReplyFrame());
829 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 824 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
830 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); 825 SpdySerializedFrame msg2(ConstructBodyFrame(kMsg2, kLen2));
831 MockRead reads[] = { 826 MockRead reads[] = {
832 CreateMockRead(*resp, 1, ASYNC), 827 CreateMockRead(resp, 1, ASYNC),
833 MockRead(ASYNC, ERR_IO_PENDING, 2), 828 MockRead(ASYNC, ERR_IO_PENDING, 2),
834 CreateMockRead(*msg1, 3, ASYNC), 829 CreateMockRead(msg1, 3, ASYNC),
835 CreateMockRead(*msg2, 4, ASYNC), 830 CreateMockRead(msg2, 4, ASYNC),
836 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), 831 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
837 }; 832 };
838 833
839 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 834 Initialize(reads, arraysize(reads), writes, arraysize(writes));
840 835
841 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); 836 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
842 837
843 // SpdySession consumes the next two reads and sends then to sock_ to be 838 // SpdySession consumes the next two reads and sends then to sock_ to be
844 // buffered. 839 // buffered.
845 ResumeAndRun(); 840 ResumeAndRun();
846 AssertSyncReadEquals(kMsg1, kLen1); 841 AssertSyncReadEquals(kMsg1, kLen1);
847 AssertSyncReadEquals(kMsg2, kLen2); 842 AssertSyncReadEquals(kMsg2, kLen2);
848 } 843 }
849 844
850 TEST_P(SpdyProxyClientSocketTest, ReadErrorResponseBody) { 845 TEST_P(SpdyProxyClientSocketTest, ReadErrorResponseBody) {
851 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 846 SpdySerializedFrame conn(ConstructConnectRequestFrame());
852 MockWrite writes[] = { 847 MockWrite writes[] = {
853 CreateMockWrite(*conn, 0, SYNCHRONOUS), 848 CreateMockWrite(conn, 0, SYNCHRONOUS),
854 }; 849 };
855 850
856 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectErrorReplyFrame()); 851 SpdySerializedFrame resp(ConstructConnectErrorReplyFrame());
857 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 852 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
858 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); 853 SpdySerializedFrame msg2(ConstructBodyFrame(kMsg2, kLen2));
859 MockRead reads[] = { 854 MockRead reads[] = {
860 CreateMockRead(*resp, 1, ASYNC), 855 CreateMockRead(resp, 1, ASYNC), CreateMockRead(msg1, 2, ASYNC),
861 CreateMockRead(*msg1, 2, ASYNC), 856 CreateMockRead(msg2, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF
862 CreateMockRead(*msg2, 3, ASYNC),
863 MockRead(ASYNC, 0, 4), // EOF
864 }; 857 };
865 858
866 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 859 Initialize(reads, arraysize(reads), writes, arraysize(writes));
867 860
868 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); 861 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED);
869 } 862 }
870 863
871 // ----------- Reads and Writes 864 // ----------- Reads and Writes
872 865
873 TEST_P(SpdyProxyClientSocketTest, AsyncReadAroundWrite) { 866 TEST_P(SpdyProxyClientSocketTest, AsyncReadAroundWrite) {
874 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 867 SpdySerializedFrame conn(ConstructConnectRequestFrame());
875 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); 868 SpdySerializedFrame msg2(ConstructBodyFrame(kMsg2, kLen2));
876 MockWrite writes[] = { 869 MockWrite writes[] = {
877 CreateMockWrite(*conn, 0, SYNCHRONOUS), 870 CreateMockWrite(conn, 0, SYNCHRONOUS),
878 CreateMockWrite(*msg2, 4, SYNCHRONOUS), 871 CreateMockWrite(msg2, 4, SYNCHRONOUS),
879 }; 872 };
880 873
881 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 874 SpdySerializedFrame resp(ConstructConnectReplyFrame());
882 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 875 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
883 std::unique_ptr<SpdySerializedFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); 876 SpdySerializedFrame msg3(ConstructBodyFrame(kMsg3, kLen3));
884 MockRead reads[] = { 877 MockRead reads[] = {
885 CreateMockRead(*resp, 1, ASYNC), 878 CreateMockRead(resp, 1, ASYNC),
886 MockRead(ASYNC, ERR_IO_PENDING, 2), 879 MockRead(ASYNC, ERR_IO_PENDING, 2),
887 CreateMockRead(*msg1, 3, ASYNC), // sync read 880 CreateMockRead(msg1, 3, ASYNC), // sync read
888 MockRead(ASYNC, ERR_IO_PENDING, 5), 881 MockRead(ASYNC, ERR_IO_PENDING, 5),
889 CreateMockRead(*msg3, 6, ASYNC), // async read 882 CreateMockRead(msg3, 6, ASYNC), // async read
890 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), 883 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7),
891 }; 884 };
892 885
893 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 886 Initialize(reads, arraysize(reads), writes, arraysize(writes));
894 887
895 AssertConnectSucceeds(); 888 AssertConnectSucceeds();
896 889
897 ResumeAndRun(); 890 ResumeAndRun();
898 AssertSyncReadEquals(kMsg1, kLen1); 891 AssertSyncReadEquals(kMsg1, kLen1);
899 892
900 AssertReadStarts(kMsg3, kLen3); 893 AssertReadStarts(kMsg3, kLen3);
901 // Read should block until after the write succeeds. 894 // Read should block until after the write succeeds.
902 895
903 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Advances past paused read. 896 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Advances past paused read.
904 897
905 ASSERT_FALSE(read_callback_.have_result()); 898 ASSERT_FALSE(read_callback_.have_result());
906 ResumeAndRun(); 899 ResumeAndRun();
907 // Now the read will return. 900 // Now the read will return.
908 AssertReadReturns(kMsg3, kLen3); 901 AssertReadReturns(kMsg3, kLen3);
909 } 902 }
910 903
911 TEST_P(SpdyProxyClientSocketTest, AsyncWriteAroundReads) { 904 TEST_P(SpdyProxyClientSocketTest, AsyncWriteAroundReads) {
912 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 905 SpdySerializedFrame conn(ConstructConnectRequestFrame());
913 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); 906 SpdySerializedFrame msg2(ConstructBodyFrame(kMsg2, kLen2));
914 MockWrite writes[] = { 907 MockWrite writes[] = {
915 CreateMockWrite(*conn, 0, SYNCHRONOUS), 908 CreateMockWrite(conn, 0, SYNCHRONOUS),
916 MockWrite(ASYNC, ERR_IO_PENDING, 7), CreateMockWrite(*msg2, 8, ASYNC), 909 MockWrite(ASYNC, ERR_IO_PENDING, 7), CreateMockWrite(msg2, 8, ASYNC),
917 }; 910 };
918 911
919 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 912 SpdySerializedFrame resp(ConstructConnectReplyFrame());
920 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 913 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
921 std::unique_ptr<SpdySerializedFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); 914 SpdySerializedFrame msg3(ConstructBodyFrame(kMsg3, kLen3));
922 MockRead reads[] = { 915 MockRead reads[] = {
923 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 916 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
924 CreateMockRead(*msg1, 3, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 4), 917 CreateMockRead(msg1, 3, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 4),
925 CreateMockRead(*msg3, 5, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), 918 CreateMockRead(msg3, 5, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
926 }; 919 };
927 920
928 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 921 Initialize(reads, arraysize(reads), writes, arraysize(writes));
929 922
930 AssertConnectSucceeds(); 923 AssertConnectSucceeds();
931 924
932 ResumeAndRun(); 925 ResumeAndRun();
933 AssertSyncReadEquals(kMsg1, kLen1); 926 AssertSyncReadEquals(kMsg1, kLen1);
934 // Write should block until the read completes 927 // Write should block until the read completes
935 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); 928 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING);
936 929
937 AssertAsyncReadEquals(kMsg3, kLen3); 930 AssertAsyncReadEquals(kMsg3, kLen3);
938 931
939 ASSERT_FALSE(write_callback_.have_result()); 932 ASSERT_FALSE(write_callback_.have_result());
940 933
941 // Now the write will complete 934 // Now the write will complete
942 ResumeAndRun(); 935 ResumeAndRun();
943 AssertWriteLength(kLen2); 936 AssertWriteLength(kLen2);
944 } 937 }
945 938
946 // ----------- Reading/Writing on Closed socket 939 // ----------- Reading/Writing on Closed socket
947 940
948 // Reading from an already closed socket should return 0 941 // Reading from an already closed socket should return 0
949 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) { 942 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) {
950 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 943 SpdySerializedFrame conn(ConstructConnectRequestFrame());
951 MockWrite writes[] = { 944 MockWrite writes[] = {
952 CreateMockWrite(*conn, 0, SYNCHRONOUS), 945 CreateMockWrite(conn, 0, SYNCHRONOUS),
953 }; 946 };
954 947
955 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 948 SpdySerializedFrame resp(ConstructConnectReplyFrame());
956 MockRead reads[] = { 949 MockRead reads[] = {
957 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 950 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
958 MockRead(ASYNC, 0, 3), // EOF 951 MockRead(ASYNC, 0, 3), // EOF
959 }; 952 };
960 953
961 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 954 Initialize(reads, arraysize(reads), writes, arraysize(writes));
962 955
963 AssertConnectSucceeds(); 956 AssertConnectSucceeds();
964 957
965 ResumeAndRun(); 958 ResumeAndRun();
966 959
967 ASSERT_FALSE(sock_->IsConnected()); 960 ASSERT_FALSE(sock_->IsConnected());
968 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); 961 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
969 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); 962 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
970 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); 963 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
971 ASSERT_FALSE(sock_->IsConnectedAndIdle()); 964 ASSERT_FALSE(sock_->IsConnectedAndIdle());
972 } 965 }
973 966
974 // Read pending when socket is closed should return 0 967 // Read pending when socket is closed should return 0
975 TEST_P(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { 968 TEST_P(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) {
976 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 969 SpdySerializedFrame conn(ConstructConnectRequestFrame());
977 MockWrite writes[] = { 970 MockWrite writes[] = {
978 CreateMockWrite(*conn, 0, SYNCHRONOUS), 971 CreateMockWrite(conn, 0, SYNCHRONOUS),
979 }; 972 };
980 973
981 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 974 SpdySerializedFrame resp(ConstructConnectReplyFrame());
982 MockRead reads[] = { 975 MockRead reads[] = {
983 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 976 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
984 MockRead(ASYNC, 0, 3), // EOF 977 MockRead(ASYNC, 0, 3), // EOF
985 }; 978 };
986 979
987 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 980 Initialize(reads, arraysize(reads), writes, arraysize(writes));
988 981
989 AssertConnectSucceeds(); 982 AssertConnectSucceeds();
990 983
991 AssertReadStarts(kMsg1, kLen1); 984 AssertReadStarts(kMsg1, kLen1);
992 985
993 ResumeAndRun(); 986 ResumeAndRun();
994 987
995 ASSERT_EQ(0, read_callback_.WaitForResult()); 988 ASSERT_EQ(0, read_callback_.WaitForResult());
996 } 989 }
997 990
998 // Reading from a disconnected socket is an error 991 // Reading from a disconnected socket is an error
999 TEST_P(SpdyProxyClientSocketTest, 992 TEST_P(SpdyProxyClientSocketTest,
1000 ReadOnDisconnectSocketReturnsNotConnected) { 993 ReadOnDisconnectSocketReturnsNotConnected) {
1001 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 994 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1002 std::unique_ptr<SpdySerializedFrame> rst( 995 SpdySerializedFrame rst(
1003 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 996 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1004 MockWrite writes[] = { 997 MockWrite writes[] = {
1005 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3), 998 CreateMockWrite(conn, 0, SYNCHRONOUS), CreateMockWrite(rst, 3),
1006 }; 999 };
1007 1000
1008 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1001 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1009 MockRead reads[] = { 1002 MockRead reads[] = {
1010 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 1003 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
1011 }; 1004 };
1012 1005
1013 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1006 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1014 1007
1015 AssertConnectSucceeds(); 1008 AssertConnectSucceeds();
1016 1009
1017 sock_->Disconnect(); 1010 sock_->Disconnect();
1018 1011
1019 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, 1012 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
1020 sock_->Read(NULL, 1, CompletionCallback())); 1013 sock_->Read(NULL, 1, CompletionCallback()));
1021 1014
1022 // Let the RST_STREAM write while |rst| is in-scope. 1015 // Let the RST_STREAM write while |rst| is in-scope.
1023 base::RunLoop().RunUntilIdle(); 1016 base::RunLoop().RunUntilIdle();
1024 } 1017 }
1025 1018
1026 // Reading buffered data from an already closed socket should return 1019 // Reading buffered data from an already closed socket should return
1027 // buffered data, then 0. 1020 // buffered data, then 0.
1028 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { 1021 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) {
1029 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 1022 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1030 MockWrite writes[] = { 1023 MockWrite writes[] = {
1031 CreateMockWrite(*conn, 0, SYNCHRONOUS), 1024 CreateMockWrite(conn, 0, SYNCHRONOUS),
1032 }; 1025 };
1033 1026
1034 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1027 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1035 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 1028 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
1036 MockRead reads[] = { 1029 MockRead reads[] = {
1037 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 1030 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1038 CreateMockRead(*msg1, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF 1031 CreateMockRead(msg1, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF
1039 }; 1032 };
1040 1033
1041 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1034 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1042 1035
1043 AssertConnectSucceeds(); 1036 AssertConnectSucceeds();
1044 1037
1045 ResumeAndRun(); 1038 ResumeAndRun();
1046 1039
1047 ASSERT_FALSE(sock_->IsConnected()); 1040 ASSERT_FALSE(sock_->IsConnected());
1048 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); 1041 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1));
1049 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback())); 1042 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback()));
1050 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); 1043 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1));
1051 1044
1052 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); 1045 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
1053 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); 1046 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
1054 sock_->Disconnect(); 1047 sock_->Disconnect();
1055 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, 1048 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
1056 sock_->Read(NULL, 1, CompletionCallback())); 1049 sock_->Read(NULL, 1, CompletionCallback()));
1057 } 1050 }
1058 1051
1059 // Calling Write() on a closed socket is an error 1052 // Calling Write() on a closed socket is an error
1060 TEST_P(SpdyProxyClientSocketTest, WriteOnClosedStream) { 1053 TEST_P(SpdyProxyClientSocketTest, WriteOnClosedStream) {
1061 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 1054 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1062 MockWrite writes[] = { 1055 MockWrite writes[] = {
1063 CreateMockWrite(*conn, 0, SYNCHRONOUS), 1056 CreateMockWrite(conn, 0, SYNCHRONOUS),
1064 }; 1057 };
1065 1058
1066 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1059 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1067 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 1060 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
1068 MockRead reads[] = { 1061 MockRead reads[] = {
1069 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 1062 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1070 MockRead(ASYNC, 0, 3), // EOF 1063 MockRead(ASYNC, 0, 3), // EOF
1071 }; 1064 };
1072 1065
1073 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1066 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1074 1067
1075 AssertConnectSucceeds(); 1068 AssertConnectSucceeds();
1076 1069
1077 // Read EOF which will close the stream. 1070 // Read EOF which will close the stream.
1078 ResumeAndRun(); 1071 ResumeAndRun();
1079 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); 1072 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
1080 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, 1073 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED,
1081 sock_->Write(buf.get(), buf->size(), CompletionCallback())); 1074 sock_->Write(buf.get(), buf->size(), CompletionCallback()));
1082 } 1075 }
1083 1076
1084 // Calling Write() on a disconnected socket is an error. 1077 // Calling Write() on a disconnected socket is an error.
1085 TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { 1078 TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) {
1086 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 1079 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1087 std::unique_ptr<SpdySerializedFrame> rst( 1080 SpdySerializedFrame rst(
1088 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1081 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1089 MockWrite writes[] = { 1082 MockWrite writes[] = {
1090 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3), 1083 CreateMockWrite(conn, 0, SYNCHRONOUS), CreateMockWrite(rst, 3),
1091 }; 1084 };
1092 1085
1093 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1086 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1094 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 1087 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
1095 MockRead reads[] = { 1088 MockRead reads[] = {
1096 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 1089 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
1097 }; 1090 };
1098 1091
1099 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1092 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1100 1093
1101 AssertConnectSucceeds(); 1094 AssertConnectSucceeds();
1102 1095
1103 sock_->Disconnect(); 1096 sock_->Disconnect();
1104 1097
1105 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); 1098 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
1106 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, 1099 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED,
1107 sock_->Write(buf.get(), buf->size(), CompletionCallback())); 1100 sock_->Write(buf.get(), buf->size(), CompletionCallback()));
1108 1101
1109 // Let the RST_STREAM write while |rst| is in-scope. 1102 // Let the RST_STREAM write while |rst| is in-scope.
1110 base::RunLoop().RunUntilIdle(); 1103 base::RunLoop().RunUntilIdle();
1111 } 1104 }
1112 1105
1113 // If the socket is closed with a pending Write(), the callback 1106 // If the socket is closed with a pending Write(), the callback
1114 // should be called with ERR_CONNECTION_CLOSED. 1107 // should be called with ERR_CONNECTION_CLOSED.
1115 TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) { 1108 TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) {
1116 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 1109 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1117 MockWrite writes[] = { 1110 MockWrite writes[] = {
1118 CreateMockWrite(*conn, 0, SYNCHRONOUS), 1111 CreateMockWrite(conn, 0, SYNCHRONOUS),
1119 MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 3), 1112 MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 3),
1120 }; 1113 };
1121 1114
1122 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1115 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1123 MockRead reads[] = { 1116 MockRead reads[] = {
1124 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 1117 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
1125 }; 1118 };
1126 1119
1127 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1120 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1128 1121
1129 AssertConnectSucceeds(); 1122 AssertConnectSucceeds();
1130 1123
1131 EXPECT_TRUE(sock_->IsConnected()); 1124 EXPECT_TRUE(sock_->IsConnected());
1132 1125
1133 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); 1126 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
1134 EXPECT_EQ(ERR_IO_PENDING, 1127 EXPECT_EQ(ERR_IO_PENDING,
1135 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); 1128 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
1136 // Make sure the write actually starts. 1129 // Make sure the write actually starts.
1137 base::RunLoop().RunUntilIdle(); 1130 base::RunLoop().RunUntilIdle();
1138 1131
1139 CloseSpdySession(ERR_ABORTED, std::string()); 1132 CloseSpdySession(ERR_ABORTED, std::string());
1140 1133
1141 EXPECT_THAT(write_callback_.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); 1134 EXPECT_THAT(write_callback_.WaitForResult(), IsError(ERR_CONNECTION_CLOSED));
1142 } 1135 }
1143 1136
1144 // If the socket is Disconnected with a pending Write(), the callback 1137 // If the socket is Disconnected with a pending Write(), the callback
1145 // should not be called. 1138 // should not be called.
1146 TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) { 1139 TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) {
1147 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 1140 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1148 std::unique_ptr<SpdySerializedFrame> rst( 1141 SpdySerializedFrame rst(
1149 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1142 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1150 MockWrite writes[] = { 1143 MockWrite writes[] = {
1151 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3), 1144 CreateMockWrite(conn, 0, SYNCHRONOUS), CreateMockWrite(rst, 3),
1152 }; 1145 };
1153 1146
1154 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1147 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1155 MockRead reads[] = { 1148 MockRead reads[] = {
1156 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 1149 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
1157 }; 1150 };
1158 1151
1159 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1152 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1160 1153
1161 AssertConnectSucceeds(); 1154 AssertConnectSucceeds();
1162 1155
1163 EXPECT_TRUE(sock_->IsConnected()); 1156 EXPECT_TRUE(sock_->IsConnected());
1164 1157
1165 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); 1158 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
1166 EXPECT_EQ(ERR_IO_PENDING, 1159 EXPECT_EQ(ERR_IO_PENDING,
1167 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); 1160 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
1168 1161
1169 sock_->Disconnect(); 1162 sock_->Disconnect();
1170 1163
1171 EXPECT_FALSE(sock_->IsConnected()); 1164 EXPECT_FALSE(sock_->IsConnected());
1172 EXPECT_FALSE(write_callback_.have_result()); 1165 EXPECT_FALSE(write_callback_.have_result());
1173 1166
1174 // Let the RST_STREAM write while |rst| is in-scope. 1167 // Let the RST_STREAM write while |rst| is in-scope.
1175 base::RunLoop().RunUntilIdle(); 1168 base::RunLoop().RunUntilIdle();
1176 } 1169 }
1177 1170
1178 // If the socket is Disconnected with a pending Read(), the callback 1171 // If the socket is Disconnected with a pending Read(), the callback
1179 // should not be called. 1172 // should not be called.
1180 TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) { 1173 TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) {
1181 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 1174 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1182 std::unique_ptr<SpdySerializedFrame> rst( 1175 SpdySerializedFrame rst(
1183 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1176 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1184 MockWrite writes[] = { 1177 MockWrite writes[] = {
1185 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3), 1178 CreateMockWrite(conn, 0, SYNCHRONOUS), CreateMockWrite(rst, 3),
1186 }; 1179 };
1187 1180
1188 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1181 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1189 MockRead reads[] = { 1182 MockRead reads[] = {
1190 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), 1183 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
1191 }; 1184 };
1192 1185
1193 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1186 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1194 1187
1195 AssertConnectSucceeds(); 1188 AssertConnectSucceeds();
1196 1189
1197 EXPECT_TRUE(sock_->IsConnected()); 1190 EXPECT_TRUE(sock_->IsConnected());
1198 1191
1199 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); 1192 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1));
1200 ASSERT_EQ(ERR_IO_PENDING, 1193 ASSERT_EQ(ERR_IO_PENDING,
1201 sock_->Read(buf.get(), kLen1, read_callback_.callback())); 1194 sock_->Read(buf.get(), kLen1, read_callback_.callback()));
1202 1195
1203 sock_->Disconnect(); 1196 sock_->Disconnect();
1204 1197
1205 EXPECT_FALSE(sock_->IsConnected()); 1198 EXPECT_FALSE(sock_->IsConnected());
1206 EXPECT_FALSE(read_callback_.have_result()); 1199 EXPECT_FALSE(read_callback_.have_result());
1207 1200
1208 // Let the RST_STREAM write while |rst| is in-scope. 1201 // Let the RST_STREAM write while |rst| is in-scope.
1209 base::RunLoop().RunUntilIdle(); 1202 base::RunLoop().RunUntilIdle();
1210 } 1203 }
1211 1204
1212 // If the socket is Reset when both a read and write are pending, 1205 // If the socket is Reset when both a read and write are pending,
1213 // both should be called back. 1206 // both should be called back.
1214 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { 1207 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) {
1215 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 1208 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1216 MockWrite writes[] = { 1209 MockWrite writes[] = {
1217 CreateMockWrite(*conn, 0, SYNCHRONOUS), 1210 CreateMockWrite(conn, 0, SYNCHRONOUS),
1218 }; 1211 };
1219 1212
1220 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1213 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1221 std::unique_ptr<SpdySerializedFrame> rst( 1214 SpdySerializedFrame rst(
1222 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1215 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1223 MockRead reads[] = { 1216 MockRead reads[] = {
1224 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 1217 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1225 CreateMockRead(*rst, 3, ASYNC), MockRead(ASYNC, 0, 4) // EOF 1218 CreateMockRead(rst, 3, ASYNC), MockRead(ASYNC, 0, 4) // EOF
1226 }; 1219 };
1227 1220
1228 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1221 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1229 1222
1230 AssertConnectSucceeds(); 1223 AssertConnectSucceeds();
1231 1224
1232 EXPECT_TRUE(sock_->IsConnected()); 1225 EXPECT_TRUE(sock_->IsConnected());
1233 1226
1234 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); 1227 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1));
1235 ASSERT_EQ(ERR_IO_PENDING, 1228 ASSERT_EQ(ERR_IO_PENDING,
(...skipping 11 matching lines...) Expand all
1247 EXPECT_TRUE(read_callback_.have_result()); 1240 EXPECT_TRUE(read_callback_.have_result());
1248 EXPECT_TRUE(write_callback_.have_result()); 1241 EXPECT_TRUE(write_callback_.have_result());
1249 1242
1250 // Let the RST_STREAM write while |rst| is in-scope. 1243 // Let the RST_STREAM write while |rst| is in-scope.
1251 base::RunLoop().RunUntilIdle(); 1244 base::RunLoop().RunUntilIdle();
1252 } 1245 }
1253 1246
1254 // Makes sure the proxy client socket's source gets the expected NetLog events 1247 // Makes sure the proxy client socket's source gets the expected NetLog events
1255 // and only the expected NetLog events (No SpdySession events). 1248 // and only the expected NetLog events (No SpdySession events).
1256 TEST_P(SpdyProxyClientSocketTest, NetLog) { 1249 TEST_P(SpdyProxyClientSocketTest, NetLog) {
1257 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 1250 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1258 std::unique_ptr<SpdySerializedFrame> rst( 1251 SpdySerializedFrame rst(
1259 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1252 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1260 MockWrite writes[] = { 1253 MockWrite writes[] = {
1261 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 5), 1254 CreateMockWrite(conn, 0, SYNCHRONOUS), CreateMockWrite(rst, 5),
1262 }; 1255 };
1263 1256
1264 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1257 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1265 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); 1258 SpdySerializedFrame msg1(ConstructBodyFrame(kMsg1, kLen1));
1266 MockRead reads[] = { 1259 MockRead reads[] = {
1267 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 1260 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1268 CreateMockRead(*msg1, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4), 1261 CreateMockRead(msg1, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
1269 }; 1262 };
1270 1263
1271 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1264 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1272 1265
1273 AssertConnectSucceeds(); 1266 AssertConnectSucceeds();
1274 1267
1275 // SpdySession consumes the next read and sends it to sock_ to be buffered. 1268 // SpdySession consumes the next read and sends it to sock_ to be buffered.
1276 ResumeAndRun(); 1269 ResumeAndRun();
1277 AssertSyncReadEquals(kMsg1, kLen1); 1270 AssertSyncReadEquals(kMsg1, kLen1);
1278 1271
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1332 std::unique_ptr<SpdyProxyClientSocket>* sock_; 1325 std::unique_ptr<SpdyProxyClientSocket>* sock_;
1333 CompletionCallback callback_; 1326 CompletionCallback callback_;
1334 1327
1335 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback); 1328 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback);
1336 }; 1329 };
1337 1330
1338 // If the socket is Reset when both a read and write are pending, and the 1331 // If the socket is Reset when both a read and write are pending, and the
1339 // read callback causes the socket to be deleted, the write callback should 1332 // read callback causes the socket to be deleted, the write callback should
1340 // not be called. 1333 // not be called.
1341 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) { 1334 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) {
1342 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame()); 1335 SpdySerializedFrame conn(ConstructConnectRequestFrame());
1343 MockWrite writes[] = { 1336 MockWrite writes[] = {
1344 CreateMockWrite(*conn, 0, SYNCHRONOUS), 1337 CreateMockWrite(conn, 0, SYNCHRONOUS),
1345 }; 1338 };
1346 1339
1347 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame()); 1340 SpdySerializedFrame resp(ConstructConnectReplyFrame());
1348 std::unique_ptr<SpdySerializedFrame> rst( 1341 SpdySerializedFrame rst(
1349 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1342 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1350 MockRead reads[] = { 1343 MockRead reads[] = {
1351 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2), 1344 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1352 CreateMockRead(*rst, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4), 1345 CreateMockRead(rst, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
1353 }; 1346 };
1354 1347
1355 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1348 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1356 1349
1357 AssertConnectSucceeds(); 1350 AssertConnectSucceeds();
1358 1351
1359 EXPECT_TRUE(sock_->IsConnected()); 1352 EXPECT_TRUE(sock_->IsConnected());
1360 1353
1361 DeleteSockCallback read_callback(&sock_); 1354 DeleteSockCallback read_callback(&sock_);
1362 1355
(...skipping 11 matching lines...) Expand all
1374 1367
1375 EXPECT_FALSE(sock_.get()); 1368 EXPECT_FALSE(sock_.get());
1376 EXPECT_TRUE(read_callback.have_result()); 1369 EXPECT_TRUE(read_callback.have_result());
1377 EXPECT_FALSE(write_callback_.have_result()); 1370 EXPECT_FALSE(write_callback_.have_result());
1378 1371
1379 // Let the RST_STREAM write while |rst| is in-scope. 1372 // Let the RST_STREAM write while |rst| is in-scope.
1380 base::RunLoop().RunUntilIdle(); 1373 base::RunLoop().RunUntilIdle();
1381 } 1374 }
1382 1375
1383 } // namespace net 1376 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_network_transaction_unittest.cc ('k') | net/spdy/spdy_session_pool_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698