| 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 <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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |