| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_stream.h" | 5 #include "net/spdy/spdy_stream.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cstddef> | 10 #include <cstddef> |
| 11 #include <limits> | 11 #include <limits> |
| 12 #include <memory> | 12 #include <memory> |
| 13 #include <string> | |
| 14 #include <utility> | 13 #include <utility> |
| 15 #include <vector> | 14 #include <vector> |
| 16 | 15 |
| 17 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
| 18 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
| 19 #include "net/base/completion_callback.h" | 18 #include "net/base/completion_callback.h" |
| 20 #include "net/base/request_priority.h" | 19 #include "net/base/request_priority.h" |
| 21 #include "net/log/net_log_event_type.h" | 20 #include "net/log/net_log_event_type.h" |
| 22 #include "net/log/test_net_log.h" | 21 #include "net/log/test_net_log.h" |
| 23 #include "net/log/test_net_log_entry.h" | 22 #include "net/log/test_net_log_entry.h" |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 SpdyHeaderBlock headers( | 188 SpdyHeaderBlock headers( |
| 190 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kPostBodyLength)); | 189 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kPostBodyLength)); |
| 191 EXPECT_THAT(stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND), | 190 EXPECT_THAT(stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND), |
| 192 IsError(ERR_IO_PENDING)); | 191 IsError(ERR_IO_PENDING)); |
| 193 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 192 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 194 | 193 |
| 195 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 194 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 196 | 195 |
| 197 EXPECT_TRUE(delegate.send_headers_completed()); | 196 EXPECT_TRUE(delegate.send_headers_completed()); |
| 198 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 197 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 199 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 198 EXPECT_EQ(SpdyString(kPostBody, kPostBodyLength), |
| 200 delegate.TakeReceivedData()); | 199 delegate.TakeReceivedData()); |
| 201 EXPECT_TRUE(data.AllWriteDataConsumed()); | 200 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 202 } | 201 } |
| 203 | 202 |
| 204 // Delegate that receives trailers. | 203 // Delegate that receives trailers. |
| 205 class StreamDelegateWithTrailers : public test::StreamDelegateWithBody { | 204 class StreamDelegateWithTrailers : public test::StreamDelegateWithBody { |
| 206 public: | 205 public: |
| 207 StreamDelegateWithTrailers(const base::WeakPtr<SpdyStream>& stream, | 206 StreamDelegateWithTrailers(const base::WeakPtr<SpdyStream>& stream, |
| 208 SpdyStringPiece data) | 207 SpdyStringPiece data) |
| 209 : StreamDelegateWithBody(stream, data) {} | 208 : StreamDelegateWithBody(stream, data) {} |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 IsError(ERR_IO_PENDING)); | 269 IsError(ERR_IO_PENDING)); |
| 271 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 270 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 272 | 271 |
| 273 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 272 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 274 | 273 |
| 275 EXPECT_TRUE(delegate.send_headers_completed()); | 274 EXPECT_TRUE(delegate.send_headers_completed()); |
| 276 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 275 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 277 const SpdyHeaderBlock& received_trailers = delegate.trailers(); | 276 const SpdyHeaderBlock& received_trailers = delegate.trailers(); |
| 278 SpdyHeaderBlock::const_iterator it = received_trailers.find("foo"); | 277 SpdyHeaderBlock::const_iterator it = received_trailers.find("foo"); |
| 279 EXPECT_EQ("bar", it->second); | 278 EXPECT_EQ("bar", it->second); |
| 280 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 279 EXPECT_EQ(SpdyString(kPostBody, kPostBodyLength), |
| 281 delegate.TakeReceivedData()); | 280 delegate.TakeReceivedData()); |
| 282 EXPECT_TRUE(data.AllWriteDataConsumed()); | 281 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 283 } | 282 } |
| 284 | 283 |
| 285 TEST_F(SpdyStreamTest, PushedStream) { | 284 TEST_F(SpdyStreamTest, PushedStream) { |
| 286 SpdySerializedFrame req( | 285 SpdySerializedFrame req( |
| 287 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 286 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 288 AddWrite(req); | 287 AddWrite(req); |
| 289 | 288 |
| 290 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 289 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 EXPECT_THAT(stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND), | 416 EXPECT_THAT(stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND), |
| 418 IsError(ERR_IO_PENDING)); | 417 IsError(ERR_IO_PENDING)); |
| 419 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 418 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 420 | 419 |
| 421 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 420 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 422 | 421 |
| 423 const SpdyStreamId stream_id = delegate.stream_id(); | 422 const SpdyStreamId stream_id = delegate.stream_id(); |
| 424 | 423 |
| 425 EXPECT_TRUE(delegate.send_headers_completed()); | 424 EXPECT_TRUE(delegate.send_headers_completed()); |
| 426 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 425 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 427 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 426 EXPECT_EQ(SpdyString(kPostBody, kPostBodyLength), |
| 428 delegate.TakeReceivedData()); | 427 delegate.TakeReceivedData()); |
| 429 EXPECT_TRUE(data.AllWriteDataConsumed()); | 428 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 430 | 429 |
| 431 // Check that the NetLog was filled reasonably. | 430 // Check that the NetLog was filled reasonably. |
| 432 TestNetLogEntry::List entries; | 431 TestNetLogEntry::List entries; |
| 433 log.GetEntries(&entries); | 432 log.GetEntries(&entries); |
| 434 EXPECT_LT(0u, entries.size()); | 433 EXPECT_LT(0u, entries.size()); |
| 435 | 434 |
| 436 // Check that we logged SPDY_STREAM_ERROR correctly. | 435 // Check that we logged SPDY_STREAM_ERROR correctly. |
| 437 int pos = ExpectLogContainsSomewhere( | 436 int pos = ExpectLogContainsSomewhere( |
| 438 entries, 0, NetLogEventType::HTTP2_STREAM_ERROR, NetLogEventPhase::NONE); | 437 entries, 0, NetLogEventType::HTTP2_STREAM_ERROR, NetLogEventPhase::NONE); |
| 439 | 438 |
| 440 int stream_id2; | 439 int stream_id2; |
| 441 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); | 440 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); |
| 442 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); | 441 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); |
| 443 } | 442 } |
| 444 | 443 |
| 445 // Make sure that large blocks of data are properly split up into frame-sized | 444 // Make sure that large blocks of data are properly split up into frame-sized |
| 446 // chunks for a request/response (i.e., an HTTP-like) stream. | 445 // chunks for a request/response (i.e., an HTTP-like) stream. |
| 447 TEST_F(SpdyStreamTest, SendLargeDataAfterOpenRequestResponse) { | 446 TEST_F(SpdyStreamTest, SendLargeDataAfterOpenRequestResponse) { |
| 448 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 447 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 449 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); | 448 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); |
| 450 AddWrite(req); | 449 AddWrite(req); |
| 451 | 450 |
| 452 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 451 SpdyString chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 453 SpdySerializedFrame chunk(spdy_util_.ConstructSpdyDataFrame( | 452 SpdySerializedFrame chunk(spdy_util_.ConstructSpdyDataFrame( |
| 454 1, chunk_data.data(), chunk_data.length(), false)); | 453 1, chunk_data.data(), chunk_data.length(), false)); |
| 455 AddWrite(chunk); | 454 AddWrite(chunk); |
| 456 AddWrite(chunk); | 455 AddWrite(chunk); |
| 457 | 456 |
| 458 SpdySerializedFrame last_chunk(spdy_util_.ConstructSpdyDataFrame( | 457 SpdySerializedFrame last_chunk(spdy_util_.ConstructSpdyDataFrame( |
| 459 1, chunk_data.data(), chunk_data.length(), true)); | 458 1, chunk_data.data(), chunk_data.length(), true)); |
| 460 AddWrite(last_chunk); | 459 AddWrite(last_chunk); |
| 461 | 460 |
| 462 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0)); | 461 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0)); |
| 463 AddRead(resp); | 462 AddRead(resp); |
| 464 | 463 |
| 465 AddReadEOF(); | 464 AddReadEOF(); |
| 466 | 465 |
| 467 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 466 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 468 GetNumWrites()); | 467 GetNumWrites()); |
| 469 MockConnect connect_data(SYNCHRONOUS, OK); | 468 MockConnect connect_data(SYNCHRONOUS, OK); |
| 470 data.set_connect_data(connect_data); | 469 data.set_connect_data(connect_data); |
| 471 session_deps_.socket_factory->AddSocketDataProvider(&data); | 470 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 472 | 471 |
| 473 AddSSLSocketData(); | 472 AddSSLSocketData(); |
| 474 | 473 |
| 475 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 474 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 476 | 475 |
| 477 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( | 476 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 478 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); | 477 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 479 ASSERT_TRUE(stream); | 478 ASSERT_TRUE(stream); |
| 480 | 479 |
| 481 std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x'); | 480 SpdyString body_data(3 * kMaxSpdyFrameChunkSize, 'x'); |
| 482 StreamDelegateWithBody delegate(stream, body_data); | 481 StreamDelegateWithBody delegate(stream, body_data); |
| 483 stream->SetDelegate(&delegate); | 482 stream->SetDelegate(&delegate); |
| 484 | 483 |
| 485 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); | 484 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 486 | 485 |
| 487 SpdyHeaderBlock headers( | 486 SpdyHeaderBlock headers( |
| 488 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kPostBodyLength)); | 487 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kPostBodyLength)); |
| 489 EXPECT_THAT(stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND), | 488 EXPECT_THAT(stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND), |
| 490 IsError(ERR_IO_PENDING)); | 489 IsError(ERR_IO_PENDING)); |
| 491 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 490 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 492 | 491 |
| 493 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 492 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 494 | 493 |
| 495 EXPECT_TRUE(delegate.send_headers_completed()); | 494 EXPECT_TRUE(delegate.send_headers_completed()); |
| 496 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 495 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 497 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 496 EXPECT_EQ(SpdyString(), delegate.TakeReceivedData()); |
| 498 EXPECT_TRUE(data.AllWriteDataConsumed()); | 497 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 499 } | 498 } |
| 500 | 499 |
| 501 // Make sure that large blocks of data are properly split up into frame-sized | 500 // Make sure that large blocks of data are properly split up into frame-sized |
| 502 // chunks for a bidirectional (i.e., non-HTTP-like) stream. | 501 // chunks for a bidirectional (i.e., non-HTTP-like) stream. |
| 503 TEST_F(SpdyStreamTest, SendLargeDataAfterOpenBidirectional) { | 502 TEST_F(SpdyStreamTest, SendLargeDataAfterOpenBidirectional) { |
| 504 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 503 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 505 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); | 504 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); |
| 506 AddWrite(req); | 505 AddWrite(req); |
| 507 | 506 |
| 508 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0)); | 507 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0)); |
| 509 AddRead(resp); | 508 AddRead(resp); |
| 510 | 509 |
| 511 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 510 SpdyString chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 512 SpdySerializedFrame chunk(spdy_util_.ConstructSpdyDataFrame( | 511 SpdySerializedFrame chunk(spdy_util_.ConstructSpdyDataFrame( |
| 513 1, chunk_data.data(), chunk_data.length(), false)); | 512 1, chunk_data.data(), chunk_data.length(), false)); |
| 514 AddWrite(chunk); | 513 AddWrite(chunk); |
| 515 AddWrite(chunk); | 514 AddWrite(chunk); |
| 516 AddWrite(chunk); | 515 AddWrite(chunk); |
| 517 | 516 |
| 518 AddReadEOF(); | 517 AddReadEOF(); |
| 519 | 518 |
| 520 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 519 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 521 GetNumWrites()); | 520 GetNumWrites()); |
| 522 MockConnect connect_data(SYNCHRONOUS, OK); | 521 MockConnect connect_data(SYNCHRONOUS, OK); |
| 523 data.set_connect_data(connect_data); | 522 data.set_connect_data(connect_data); |
| 524 session_deps_.socket_factory->AddSocketDataProvider(&data); | 523 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 525 | 524 |
| 526 AddSSLSocketData(); | 525 AddSSLSocketData(); |
| 527 | 526 |
| 528 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 527 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 529 | 528 |
| 530 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( | 529 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 531 SPDY_BIDIRECTIONAL_STREAM, session, url_, LOWEST, NetLogWithSource()); | 530 SPDY_BIDIRECTIONAL_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 532 ASSERT_TRUE(stream); | 531 ASSERT_TRUE(stream); |
| 533 | 532 |
| 534 std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x'); | 533 SpdyString body_data(3 * kMaxSpdyFrameChunkSize, 'x'); |
| 535 StreamDelegateSendImmediate delegate(stream, body_data); | 534 StreamDelegateSendImmediate delegate(stream, body_data); |
| 536 stream->SetDelegate(&delegate); | 535 stream->SetDelegate(&delegate); |
| 537 | 536 |
| 538 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); | 537 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 539 | 538 |
| 540 SpdyHeaderBlock headers( | 539 SpdyHeaderBlock headers( |
| 541 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kPostBodyLength)); | 540 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kPostBodyLength)); |
| 542 EXPECT_THAT(stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND), | 541 EXPECT_THAT(stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND), |
| 543 IsError(ERR_IO_PENDING)); | 542 IsError(ERR_IO_PENDING)); |
| 544 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 543 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 545 | 544 |
| 546 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 545 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 547 | 546 |
| 548 EXPECT_TRUE(delegate.send_headers_completed()); | 547 EXPECT_TRUE(delegate.send_headers_completed()); |
| 549 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 548 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 550 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 549 EXPECT_EQ(SpdyString(), delegate.TakeReceivedData()); |
| 551 EXPECT_TRUE(data.AllWriteDataConsumed()); | 550 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 552 } | 551 } |
| 553 | 552 |
| 554 // Receiving a header with uppercase ASCII should result in a protocol error. | 553 // Receiving a header with uppercase ASCII should result in a protocol error. |
| 555 TEST_F(SpdyStreamTest, UpperCaseHeaders) { | 554 TEST_F(SpdyStreamTest, UpperCaseHeaders) { |
| 556 SpdySerializedFrame req( | 555 SpdySerializedFrame req( |
| 557 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 556 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 558 AddWrite(req); | 557 AddWrite(req); |
| 559 | 558 |
| 560 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 559 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); | 779 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 781 | 780 |
| 782 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 781 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 783 EXPECT_THAT( | 782 EXPECT_THAT( |
| 784 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), | 783 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), |
| 785 IsError(ERR_IO_PENDING)); | 784 IsError(ERR_IO_PENDING)); |
| 786 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 785 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 787 | 786 |
| 788 EXPECT_THAT(delegate.WaitForClose(), IsOk()); | 787 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
| 789 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 788 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 790 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 789 EXPECT_EQ(SpdyString(kPostBody, kPostBodyLength), |
| 791 delegate.TakeReceivedData()); | 790 delegate.TakeReceivedData()); |
| 792 | 791 |
| 793 // Finish async network reads and writes. | 792 // Finish async network reads and writes. |
| 794 base::RunLoop().RunUntilIdle(); | 793 base::RunLoop().RunUntilIdle(); |
| 795 | 794 |
| 796 EXPECT_TRUE(data.AllWriteDataConsumed()); | 795 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 797 EXPECT_TRUE(data.AllReadDataConsumed()); | 796 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 798 } | 797 } |
| 799 | 798 |
| 800 TEST_F(SpdyStreamTest, HeadersMustPreceedData) { | 799 TEST_F(SpdyStreamTest, HeadersMustPreceedData) { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); | 889 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 891 | 890 |
| 892 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 891 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 893 EXPECT_THAT( | 892 EXPECT_THAT( |
| 894 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), | 893 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), |
| 895 IsError(ERR_IO_PENDING)); | 894 IsError(ERR_IO_PENDING)); |
| 896 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 895 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 897 | 896 |
| 898 EXPECT_THAT(delegate.WaitForClose(), IsOk()); | 897 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
| 899 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 898 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 900 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 899 EXPECT_EQ(SpdyString(kPostBody, kPostBodyLength), |
| 901 delegate.TakeReceivedData()); | 900 delegate.TakeReceivedData()); |
| 902 | 901 |
| 903 // Finish async network reads and writes. | 902 // Finish async network reads and writes. |
| 904 base::RunLoop().RunUntilIdle(); | 903 base::RunLoop().RunUntilIdle(); |
| 905 | 904 |
| 906 EXPECT_TRUE(data.AllWriteDataConsumed()); | 905 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 907 EXPECT_TRUE(data.AllReadDataConsumed()); | 906 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 908 } | 907 } |
| 909 | 908 |
| 910 TEST_F(SpdyStreamTest, TrailersMustNotFollowTrailers) { | 909 TEST_F(SpdyStreamTest, TrailersMustNotFollowTrailers) { |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1069 | 1068 |
| 1070 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); | 1069 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 1071 | 1070 |
| 1072 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 1071 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 1073 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), | 1072 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 1074 NO_MORE_DATA_TO_SEND)); | 1073 NO_MORE_DATA_TO_SEND)); |
| 1075 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 1074 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 1076 | 1075 |
| 1077 EXPECT_THAT(delegate.WaitForClose(), IsOk()); | 1076 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
| 1078 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 1077 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 1079 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 1078 EXPECT_EQ(SpdyString(kPostBody, kPostBodyLength), |
| 1080 delegate.TakeReceivedData()); | 1079 delegate.TakeReceivedData()); |
| 1081 | 1080 |
| 1082 // Finish async network reads and writes. | 1081 // Finish async network reads and writes. |
| 1083 base::RunLoop().RunUntilIdle(); | 1082 base::RunLoop().RunUntilIdle(); |
| 1084 | 1083 |
| 1085 EXPECT_TRUE(data.AllWriteDataConsumed()); | 1084 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 1086 EXPECT_TRUE(data.AllReadDataConsumed()); | 1085 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 1087 } | 1086 } |
| 1088 | 1087 |
| 1089 TEST_F(SpdyStreamTest, StatusMustBeNumber) { | 1088 TEST_F(SpdyStreamTest, StatusMustBeNumber) { |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1381 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 1380 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
| 1382 | 1381 |
| 1383 unstall_function.Run(stream, kPostBodyLength); | 1382 unstall_function.Run(stream, kPostBodyLength); |
| 1384 | 1383 |
| 1385 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 1384 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 1386 | 1385 |
| 1387 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 1386 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 1388 | 1387 |
| 1389 EXPECT_TRUE(delegate.send_headers_completed()); | 1388 EXPECT_TRUE(delegate.send_headers_completed()); |
| 1390 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 1389 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
| 1391 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 1390 EXPECT_EQ(SpdyString(), delegate.TakeReceivedData()); |
| 1392 EXPECT_TRUE(data.AllWriteDataConsumed()); | 1391 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 1393 } | 1392 } |
| 1394 | 1393 |
| 1395 TEST_F(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseRequestResponse) { | 1394 TEST_F(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseRequestResponse) { |
| 1396 RunResumeAfterUnstallRequestResponseTest( | 1395 RunResumeAfterUnstallRequestResponseTest( |
| 1397 base::Bind(&IncreaseStreamSendWindowSize)); | 1396 base::Bind(&IncreaseStreamSendWindowSize)); |
| 1398 } | 1397 } |
| 1399 | 1398 |
| 1400 TEST_F(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustRequestResponse) { | 1399 TEST_F(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustRequestResponse) { |
| 1401 RunResumeAfterUnstallRequestResponseTest( | 1400 RunResumeAfterUnstallRequestResponseTest( |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1462 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 1461 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
| 1463 | 1462 |
| 1464 unstall_function.Run(stream, kPostBodyLength); | 1463 unstall_function.Run(stream, kPostBodyLength); |
| 1465 | 1464 |
| 1466 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 1465 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 1467 | 1466 |
| 1468 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 1467 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 1469 | 1468 |
| 1470 EXPECT_TRUE(delegate.send_headers_completed()); | 1469 EXPECT_TRUE(delegate.send_headers_completed()); |
| 1471 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 1470 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
| 1472 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 1471 EXPECT_EQ(SpdyString(kPostBody, kPostBodyLength), |
| 1473 delegate.TakeReceivedData()); | 1472 delegate.TakeReceivedData()); |
| 1474 EXPECT_TRUE(data.AllWriteDataConsumed()); | 1473 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 1475 } | 1474 } |
| 1476 | 1475 |
| 1477 TEST_F(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseBidirectional) { | 1476 TEST_F(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseBidirectional) { |
| 1478 RunResumeAfterUnstallBidirectionalTest( | 1477 RunResumeAfterUnstallBidirectionalTest( |
| 1479 base::Bind(&IncreaseStreamSendWindowSize)); | 1478 base::Bind(&IncreaseStreamSendWindowSize)); |
| 1480 } | 1479 } |
| 1481 | 1480 |
| 1482 TEST_F(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustBidirectional) { | 1481 TEST_F(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustBidirectional) { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1552 EXPECT_EQ(response_len, stream->raw_received_bytes()); | 1551 EXPECT_EQ(response_len, stream->raw_received_bytes()); |
| 1553 | 1552 |
| 1554 // FIN | 1553 // FIN |
| 1555 data.Resume(); | 1554 data.Resume(); |
| 1556 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 1555 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 1557 } | 1556 } |
| 1558 | 1557 |
| 1559 } // namespace test | 1558 } // namespace test |
| 1560 | 1559 |
| 1561 } // namespace net | 1560 } // namespace net |
| OLD | NEW |