| 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 <cstddef> | 9 #include <cstddef> |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "net/log/test_net_log_entry.h" | 22 #include "net/log/test_net_log_entry.h" |
| 23 #include "net/log/test_net_log_util.h" | 23 #include "net/log/test_net_log_util.h" |
| 24 #include "net/socket/next_proto.h" | 24 #include "net/socket/next_proto.h" |
| 25 #include "net/socket/socket_test_util.h" | 25 #include "net/socket/socket_test_util.h" |
| 26 #include "net/spdy/buffered_spdy_framer.h" | 26 #include "net/spdy/buffered_spdy_framer.h" |
| 27 #include "net/spdy/spdy_http_utils.h" | 27 #include "net/spdy/spdy_http_utils.h" |
| 28 #include "net/spdy/spdy_protocol.h" | 28 #include "net/spdy/spdy_protocol.h" |
| 29 #include "net/spdy/spdy_session.h" | 29 #include "net/spdy/spdy_session.h" |
| 30 #include "net/spdy/spdy_stream_test_util.h" | 30 #include "net/spdy/spdy_stream_test_util.h" |
| 31 #include "net/spdy/spdy_test_util_common.h" | 31 #include "net/spdy/spdy_test_util_common.h" |
| 32 #include "net/test/gtest_util.h" |
| 33 #include "testing/gmock/include/gmock/gmock.h" |
| 32 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
| 33 | 35 |
| 36 using net::test::IsError; |
| 37 using net::test::IsOk; |
| 38 |
| 34 // TODO(ukai): factor out common part with spdy_http_stream_unittest.cc | 39 // TODO(ukai): factor out common part with spdy_http_stream_unittest.cc |
| 35 // | 40 // |
| 36 namespace net { | 41 namespace net { |
| 37 | 42 |
| 38 namespace test { | 43 namespace test { |
| 39 | 44 |
| 40 namespace { | 45 namespace { |
| 41 | 46 |
| 42 enum TestCase { | 47 enum TestCase { |
| 43 // Test using the SPDY/3.1 protocol. | 48 // Test using the SPDY/3.1 protocol. |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 | 205 |
| 201 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 206 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
| 202 | 207 |
| 203 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 208 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 204 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); | 209 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); |
| 205 EXPECT_EQ(ERR_IO_PENDING, | 210 EXPECT_EQ(ERR_IO_PENDING, |
| 206 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 211 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 207 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 212 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 208 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 213 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 209 | 214 |
| 210 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 215 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 211 | 216 |
| 212 EXPECT_TRUE(delegate.send_headers_completed()); | 217 EXPECT_TRUE(delegate.send_headers_completed()); |
| 213 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 218 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 214 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 219 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
| 215 delegate.TakeReceivedData()); | 220 delegate.TakeReceivedData()); |
| 216 EXPECT_TRUE(data.AllWriteDataConsumed()); | 221 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 217 } | 222 } |
| 218 | 223 |
| 219 // Delegate that receives trailers. | 224 // Delegate that receives trailers. |
| 220 class StreamDelegateWithTrailers : public test::StreamDelegateWithBody { | 225 class StreamDelegateWithTrailers : public test::StreamDelegateWithBody { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 | 287 |
| 283 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 288 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
| 284 | 289 |
| 285 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 290 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 286 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); | 291 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); |
| 287 EXPECT_EQ(ERR_IO_PENDING, | 292 EXPECT_EQ(ERR_IO_PENDING, |
| 288 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 293 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 289 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 294 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 290 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 295 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 291 | 296 |
| 292 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 297 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 293 | 298 |
| 294 EXPECT_TRUE(delegate.send_headers_completed()); | 299 EXPECT_TRUE(delegate.send_headers_completed()); |
| 295 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 300 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 296 const SpdyHeaderBlock& received_trailers = delegate.trailers(); | 301 const SpdyHeaderBlock& received_trailers = delegate.trailers(); |
| 297 SpdyHeaderBlock::const_iterator it = received_trailers.find("foo"); | 302 SpdyHeaderBlock::const_iterator it = received_trailers.find("foo"); |
| 298 EXPECT_EQ("bar", it->second); | 303 EXPECT_EQ("bar", it->second); |
| 299 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 304 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
| 300 delegate.TakeReceivedData()); | 305 delegate.TakeReceivedData()); |
| 301 EXPECT_TRUE(data.AllWriteDataConsumed()); | 306 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 302 } | 307 } |
| 303 | 308 |
| 304 TEST_P(SpdyStreamTest, PushedStream) { | 309 TEST_P(SpdyStreamTest, PushedStream) { |
| 305 AddReadEOF(); | 310 AddReadEOF(); |
| 306 | 311 |
| 307 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 312 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 308 GetNumWrites()); | 313 GetNumWrites()); |
| 309 MockConnect connect_data(SYNCHRONOUS, OK); | 314 MockConnect connect_data(SYNCHRONOUS, OK); |
| 310 data.set_connect_data(connect_data); | 315 data.set_connect_data(connect_data); |
| 311 | 316 |
| 312 session_deps_.socket_factory->AddSocketDataProvider(&data); | 317 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 313 | 318 |
| 314 base::WeakPtr<SpdySession> spdy_session(CreateDefaultSpdySession()); | 319 base::WeakPtr<SpdySession> spdy_session(CreateDefaultSpdySession()); |
| 315 | 320 |
| 316 // Conjure up a stream. | 321 // Conjure up a stream. |
| 317 SpdyStreamRequest stream_request; | 322 SpdyStreamRequest stream_request; |
| 318 int result = stream_request.StartRequest(SPDY_PUSH_STREAM, spdy_session, | 323 int result = stream_request.StartRequest(SPDY_PUSH_STREAM, spdy_session, |
| 319 GURL(), DEFAULT_PRIORITY, | 324 GURL(), DEFAULT_PRIORITY, |
| 320 BoundNetLog(), CompletionCallback()); | 325 BoundNetLog(), CompletionCallback()); |
| 321 ASSERT_EQ(OK, result); | 326 ASSERT_THAT(result, IsOk()); |
| 322 base::WeakPtr<SpdyStream> stream = stream_request.ReleaseStream(); | 327 base::WeakPtr<SpdyStream> stream = stream_request.ReleaseStream(); |
| 323 ActivatePushStream(spdy_session.get(), stream.get()); | 328 ActivatePushStream(spdy_session.get(), stream.get()); |
| 324 | 329 |
| 325 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 330 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
| 326 | 331 |
| 327 // Set required request headers. | 332 // Set required request headers. |
| 328 SpdyHeaderBlock request_headers; | 333 SpdyHeaderBlock request_headers; |
| 329 spdy_util_.AddUrlToHeaderBlock(kStreamUrl, &request_headers); | 334 spdy_util_.AddUrlToHeaderBlock(kStreamUrl, &request_headers); |
| 330 stream->OnPushPromiseHeadersReceived(request_headers); | 335 stream->OnPushPromiseHeadersReceived(request_headers); |
| 331 | 336 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 | 415 |
| 411 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 416 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
| 412 | 417 |
| 413 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 418 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 414 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); | 419 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); |
| 415 EXPECT_EQ(ERR_IO_PENDING, | 420 EXPECT_EQ(ERR_IO_PENDING, |
| 416 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 421 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 417 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 422 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 418 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 423 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 419 | 424 |
| 420 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 425 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 421 | 426 |
| 422 const SpdyStreamId stream_id = delegate.stream_id(); | 427 const SpdyStreamId stream_id = delegate.stream_id(); |
| 423 | 428 |
| 424 EXPECT_TRUE(delegate.send_headers_completed()); | 429 EXPECT_TRUE(delegate.send_headers_completed()); |
| 425 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 430 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 426 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 431 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
| 427 delegate.TakeReceivedData()); | 432 delegate.TakeReceivedData()); |
| 428 EXPECT_TRUE(data.AllWriteDataConsumed()); | 433 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 429 | 434 |
| 430 // Check that the NetLog was filled reasonably. | 435 // Check that the NetLog was filled reasonably. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 | 493 |
| 489 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 494 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
| 490 | 495 |
| 491 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 496 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 492 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); | 497 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); |
| 493 EXPECT_EQ(ERR_IO_PENDING, | 498 EXPECT_EQ(ERR_IO_PENDING, |
| 494 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 499 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 495 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 500 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 496 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 501 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 497 | 502 |
| 498 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 503 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 499 | 504 |
| 500 EXPECT_TRUE(delegate.send_headers_completed()); | 505 EXPECT_TRUE(delegate.send_headers_completed()); |
| 501 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 506 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 502 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 507 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
| 503 EXPECT_TRUE(data.AllWriteDataConsumed()); | 508 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 504 } | 509 } |
| 505 | 510 |
| 506 // Make sure that large blocks of data are properly split up into | 511 // Make sure that large blocks of data are properly split up into |
| 507 // frame-sized chunks for a bidirectional (i.e., non-HTTP-like) | 512 // frame-sized chunks for a bidirectional (i.e., non-HTTP-like) |
| 508 // stream. | 513 // stream. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 | 551 |
| 547 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 552 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
| 548 | 553 |
| 549 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 554 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 550 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); | 555 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength))); |
| 551 EXPECT_EQ(ERR_IO_PENDING, | 556 EXPECT_EQ(ERR_IO_PENDING, |
| 552 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 557 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 553 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 558 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 554 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 559 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 555 | 560 |
| 556 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 561 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 557 | 562 |
| 558 EXPECT_TRUE(delegate.send_headers_completed()); | 563 EXPECT_TRUE(delegate.send_headers_completed()); |
| 559 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 564 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 560 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 565 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
| 561 EXPECT_TRUE(data.AllWriteDataConsumed()); | 566 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 562 } | 567 } |
| 563 | 568 |
| 564 // Receiving a header with uppercase ASCII should result in a protocol | 569 // Receiving a header with uppercase ASCII should result in a protocol |
| 565 // error. | 570 // error. |
| 566 TEST_P(SpdyStreamTest, UpperCaseHeaders) { | 571 TEST_P(SpdyStreamTest, UpperCaseHeaders) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 | 605 |
| 601 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 606 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
| 602 | 607 |
| 603 std::unique_ptr<SpdyHeaderBlock> headers( | 608 std::unique_ptr<SpdyHeaderBlock> headers( |
| 604 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kStreamUrl))); | 609 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kStreamUrl))); |
| 605 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), | 610 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 606 NO_MORE_DATA_TO_SEND)); | 611 NO_MORE_DATA_TO_SEND)); |
| 607 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 612 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 608 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 613 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 609 | 614 |
| 610 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); | 615 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 611 } | 616 } |
| 612 | 617 |
| 613 // Receiving a header with uppercase ASCII should result in a protocol | 618 // Receiving a header with uppercase ASCII should result in a protocol |
| 614 // error even for a push stream. | 619 // error even for a push stream. |
| 615 TEST_P(SpdyStreamTest, UpperCaseHeadersOnPush) { | 620 TEST_P(SpdyStreamTest, UpperCaseHeadersOnPush) { |
| 616 GURL url(kStreamUrl); | 621 GURL url(kStreamUrl); |
| 617 | 622 |
| 618 std::unique_ptr<SpdySerializedFrame> syn( | 623 std::unique_ptr<SpdySerializedFrame> syn( |
| 619 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 624 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 620 AddWrite(*syn); | 625 AddWrite(*syn); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 std::unique_ptr<SpdyHeaderBlock> headers( | 663 std::unique_ptr<SpdyHeaderBlock> headers( |
| 659 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kStreamUrl))); | 664 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kStreamUrl))); |
| 660 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), | 665 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 661 NO_MORE_DATA_TO_SEND)); | 666 NO_MORE_DATA_TO_SEND)); |
| 662 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 667 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 663 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 668 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 664 | 669 |
| 665 data.RunUntilPaused(); | 670 data.RunUntilPaused(); |
| 666 | 671 |
| 667 base::WeakPtr<SpdyStream> push_stream; | 672 base::WeakPtr<SpdyStream> push_stream; |
| 668 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 673 EXPECT_THAT(session->GetPushStream(url, &push_stream, BoundNetLog()), IsOk()); |
| 669 EXPECT_FALSE(push_stream); | 674 EXPECT_FALSE(push_stream); |
| 670 | 675 |
| 671 data.Resume(); | 676 data.Resume(); |
| 672 | 677 |
| 673 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 678 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 674 } | 679 } |
| 675 | 680 |
| 676 // Receiving a header with uppercase ASCII in a HEADERS frame should | 681 // Receiving a header with uppercase ASCII in a HEADERS frame should |
| 677 // result in a protocol error. | 682 // result in a protocol error. |
| 678 TEST_P(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { | 683 TEST_P(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { |
| 679 GURL url(kStreamUrl); | 684 GURL url(kStreamUrl); |
| 680 | 685 |
| 681 std::unique_ptr<SpdySerializedFrame> syn( | 686 std::unique_ptr<SpdySerializedFrame> syn( |
| 682 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 687 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 683 AddWrite(*syn); | 688 AddWrite(*syn); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 std::unique_ptr<SpdyHeaderBlock> headers( | 733 std::unique_ptr<SpdyHeaderBlock> headers( |
| 729 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kStreamUrl))); | 734 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kStreamUrl))); |
| 730 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), | 735 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 731 NO_MORE_DATA_TO_SEND)); | 736 NO_MORE_DATA_TO_SEND)); |
| 732 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 737 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 733 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 738 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 734 | 739 |
| 735 data.RunUntilPaused(); | 740 data.RunUntilPaused(); |
| 736 | 741 |
| 737 base::WeakPtr<SpdyStream> push_stream; | 742 base::WeakPtr<SpdyStream> push_stream; |
| 738 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 743 EXPECT_THAT(session->GetPushStream(url, &push_stream, BoundNetLog()), IsOk()); |
| 739 EXPECT_TRUE(push_stream); | 744 EXPECT_TRUE(push_stream); |
| 740 | 745 |
| 741 data.Resume(); | 746 data.Resume(); |
| 742 data.RunUntilPaused(); | 747 data.RunUntilPaused(); |
| 743 | 748 |
| 744 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 749 EXPECT_THAT(session->GetPushStream(url, &push_stream, BoundNetLog()), IsOk()); |
| 745 EXPECT_FALSE(push_stream); | 750 EXPECT_FALSE(push_stream); |
| 746 | 751 |
| 747 data.Resume(); | 752 data.Resume(); |
| 748 | 753 |
| 749 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 754 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 750 } | 755 } |
| 751 | 756 |
| 752 // Receiving a duplicate header in a HEADERS frame should result in a | 757 // Receiving a duplicate header in a HEADERS frame should result in a |
| 753 // protocol error. | 758 // protocol error. |
| 754 TEST_P(SpdyStreamTest, DuplicateHeaders) { | 759 TEST_P(SpdyStreamTest, DuplicateHeaders) { |
| 755 GURL url(kStreamUrl); | 760 GURL url(kStreamUrl); |
| 756 | 761 |
| 757 std::unique_ptr<SpdySerializedFrame> syn( | 762 std::unique_ptr<SpdySerializedFrame> syn( |
| 758 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 763 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 759 AddWrite(*syn); | 764 AddWrite(*syn); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 std::unique_ptr<SpdyHeaderBlock> headers( | 809 std::unique_ptr<SpdyHeaderBlock> headers( |
| 805 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kStreamUrl))); | 810 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kStreamUrl))); |
| 806 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), | 811 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 807 NO_MORE_DATA_TO_SEND)); | 812 NO_MORE_DATA_TO_SEND)); |
| 808 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 813 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 809 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 814 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 810 | 815 |
| 811 data.RunUntilPaused(); | 816 data.RunUntilPaused(); |
| 812 | 817 |
| 813 base::WeakPtr<SpdyStream> push_stream; | 818 base::WeakPtr<SpdyStream> push_stream; |
| 814 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 819 EXPECT_THAT(session->GetPushStream(url, &push_stream, BoundNetLog()), IsOk()); |
| 815 EXPECT_TRUE(push_stream); | 820 EXPECT_TRUE(push_stream); |
| 816 | 821 |
| 817 data.Resume(); | 822 data.Resume(); |
| 818 data.RunUntilPaused(); | 823 data.RunUntilPaused(); |
| 819 | 824 |
| 820 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 825 EXPECT_THAT(session->GetPushStream(url, &push_stream, BoundNetLog()), IsOk()); |
| 821 EXPECT_FALSE(push_stream); | 826 EXPECT_FALSE(push_stream); |
| 822 | 827 |
| 823 data.Resume(); | 828 data.Resume(); |
| 824 | 829 |
| 825 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 830 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 826 } | 831 } |
| 827 | 832 |
| 828 // Call IncreaseSendWindowSize on a stream with a large enough delta | 833 // Call IncreaseSendWindowSize on a stream with a large enough delta |
| 829 // to overflow an int32_t. The SpdyStream should handle that case | 834 // to overflow an int32_t. The SpdyStream should handle that case |
| 830 // gracefully. | 835 // gracefully. |
| 831 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { | 836 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { |
| 832 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 837 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 833 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 838 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 834 AddWrite(*req); | 839 AddWrite(*req); |
| 835 | 840 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 int32_t old_send_window_size = stream->send_window_size(); | 879 int32_t old_send_window_size = stream->send_window_size(); |
| 875 ASSERT_GT(old_send_window_size, 0); | 880 ASSERT_GT(old_send_window_size, 0); |
| 876 int32_t delta_window_size = | 881 int32_t delta_window_size = |
| 877 std::numeric_limits<int32_t>::max() - old_send_window_size + 1; | 882 std::numeric_limits<int32_t>::max() - old_send_window_size + 1; |
| 878 stream->IncreaseSendWindowSize(delta_window_size); | 883 stream->IncreaseSendWindowSize(delta_window_size); |
| 879 EXPECT_EQ(NULL, stream.get()); | 884 EXPECT_EQ(NULL, stream.get()); |
| 880 | 885 |
| 881 data.Resume(); | 886 data.Resume(); |
| 882 base::RunLoop().RunUntilIdle(); | 887 base::RunLoop().RunUntilIdle(); |
| 883 | 888 |
| 884 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); | 889 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 885 } | 890 } |
| 886 | 891 |
| 887 // Functions used with | 892 // Functions used with |
| 888 // RunResumeAfterUnstall{RequestResponse,Bidirectional}Test(). | 893 // RunResumeAfterUnstall{RequestResponse,Bidirectional}Test(). |
| 889 | 894 |
| 890 void StallStream(const base::WeakPtr<SpdyStream>& stream) { | 895 void StallStream(const base::WeakPtr<SpdyStream>& stream) { |
| 891 // Reduce the send window size to 0 to stall. | 896 // Reduce the send window size to 0 to stall. |
| 892 while (stream->send_window_size() > 0) { | 897 while (stream->send_window_size() > 0) { |
| 893 stream->DecreaseSendWindowSize( | 898 stream->DecreaseSendWindowSize( |
| 894 std::min(kMaxSpdyFrameChunkSize, stream->send_window_size())); | 899 std::min(kMaxSpdyFrameChunkSize, stream->send_window_size())); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 965 StallStream(stream); | 970 StallStream(stream); |
| 966 | 971 |
| 967 base::RunLoop().RunUntilIdle(); | 972 base::RunLoop().RunUntilIdle(); |
| 968 | 973 |
| 969 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 974 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
| 970 | 975 |
| 971 unstall_function.Run(stream, kPostBodyLength); | 976 unstall_function.Run(stream, kPostBodyLength); |
| 972 | 977 |
| 973 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 978 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 974 | 979 |
| 975 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 980 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 976 | 981 |
| 977 EXPECT_TRUE(delegate.send_headers_completed()); | 982 EXPECT_TRUE(delegate.send_headers_completed()); |
| 978 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 983 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
| 979 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 984 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
| 980 EXPECT_TRUE(data.AllWriteDataConsumed()); | 985 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 981 } | 986 } |
| 982 | 987 |
| 983 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseRequestResponse) { | 988 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseRequestResponse) { |
| 984 RunResumeAfterUnstallRequestResponseTest( | 989 RunResumeAfterUnstallRequestResponseTest( |
| 985 base::Bind(&IncreaseStreamSendWindowSize)); | 990 base::Bind(&IncreaseStreamSendWindowSize)); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1051 | 1056 |
| 1052 data.Resume(); | 1057 data.Resume(); |
| 1053 base::RunLoop().RunUntilIdle(); | 1058 base::RunLoop().RunUntilIdle(); |
| 1054 | 1059 |
| 1055 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 1060 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
| 1056 | 1061 |
| 1057 unstall_function.Run(stream, kPostBodyLength); | 1062 unstall_function.Run(stream, kPostBodyLength); |
| 1058 | 1063 |
| 1059 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 1064 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 1060 | 1065 |
| 1061 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 1066 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 1062 | 1067 |
| 1063 EXPECT_TRUE(delegate.send_headers_completed()); | 1068 EXPECT_TRUE(delegate.send_headers_completed()); |
| 1064 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 1069 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
| 1065 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 1070 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
| 1066 delegate.TakeReceivedData()); | 1071 delegate.TakeReceivedData()); |
| 1067 EXPECT_TRUE(data.AllWriteDataConsumed()); | 1072 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 1068 } | 1073 } |
| 1069 | 1074 |
| 1070 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseBidirectional) { | 1075 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseBidirectional) { |
| 1071 RunResumeAfterUnstallBidirectionalTest( | 1076 RunResumeAfterUnstallBidirectionalTest( |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1144 data.RunUntilPaused(); | 1149 data.RunUntilPaused(); |
| 1145 EXPECT_EQ(reply_frame_len, stream->raw_received_bytes()); | 1150 EXPECT_EQ(reply_frame_len, stream->raw_received_bytes()); |
| 1146 | 1151 |
| 1147 // DATA | 1152 // DATA |
| 1148 data.Resume(); | 1153 data.Resume(); |
| 1149 data.RunUntilPaused(); | 1154 data.RunUntilPaused(); |
| 1150 EXPECT_EQ(response_len, stream->raw_received_bytes()); | 1155 EXPECT_EQ(response_len, stream->raw_received_bytes()); |
| 1151 | 1156 |
| 1152 // FIN | 1157 // FIN |
| 1153 data.Resume(); | 1158 data.Resume(); |
| 1154 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 1159 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 1155 } | 1160 } |
| 1156 | 1161 |
| 1157 } // namespace test | 1162 } // namespace test |
| 1158 | 1163 |
| 1159 } // namespace net | 1164 } // namespace net |
| OLD | NEW |