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 |