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