| 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 #include <cstddef> | 8 #include <cstddef> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 | 95 |
| 96 void RunResumeAfterUnstallRequestResponseTest( | 96 void RunResumeAfterUnstallRequestResponseTest( |
| 97 const UnstallFunction& unstall_function); | 97 const UnstallFunction& unstall_function); |
| 98 | 98 |
| 99 void RunResumeAfterUnstallBidirectionalTest( | 99 void RunResumeAfterUnstallBidirectionalTest( |
| 100 const UnstallFunction& unstall_function); | 100 const UnstallFunction& unstall_function); |
| 101 | 101 |
| 102 // Add{Read,Write}() populates lists that are eventually passed to a | 102 // Add{Read,Write}() populates lists that are eventually passed to a |
| 103 // SocketData class. |frame| must live for the whole test. | 103 // SocketData class. |frame| must live for the whole test. |
| 104 | 104 |
| 105 void AddRead(const SpdyFrame& frame) { | 105 void AddRead(const SpdySerializedFrame& frame) { |
| 106 reads_.push_back(CreateMockRead(frame, offset_++)); | 106 reads_.push_back(CreateMockRead(frame, offset_++)); |
| 107 } | 107 } |
| 108 | 108 |
| 109 void AddWrite(const SpdyFrame& frame) { | 109 void AddWrite(const SpdySerializedFrame& frame) { |
| 110 writes_.push_back(CreateMockWrite(frame, offset_++)); | 110 writes_.push_back(CreateMockWrite(frame, offset_++)); |
| 111 } | 111 } |
| 112 | 112 |
| 113 void AddReadEOF() { | 113 void AddReadEOF() { |
| 114 reads_.push_back(MockRead(ASYNC, 0, offset_++)); | 114 reads_.push_back(MockRead(ASYNC, 0, offset_++)); |
| 115 } | 115 } |
| 116 | 116 |
| 117 void AddWritePause() { | 117 void AddWritePause() { |
| 118 writes_.push_back(MockWrite(ASYNC, ERR_IO_PENDING, offset_++)); | 118 writes_.push_back(MockWrite(ASYNC, ERR_IO_PENDING, offset_++)); |
| 119 } | 119 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 147 | 147 |
| 148 INSTANTIATE_TEST_CASE_P(ProtoPlusDepend, | 148 INSTANTIATE_TEST_CASE_P(ProtoPlusDepend, |
| 149 SpdyStreamTest, | 149 SpdyStreamTest, |
| 150 testing::Values(kTestCaseSPDY31, | 150 testing::Values(kTestCaseSPDY31, |
| 151 kTestCaseHTTP2NoPriorityDependencies, | 151 kTestCaseHTTP2NoPriorityDependencies, |
| 152 kTestCaseHTTP2PriorityDependencies)); | 152 kTestCaseHTTP2PriorityDependencies)); |
| 153 | 153 |
| 154 TEST_P(SpdyStreamTest, SendDataAfterOpen) { | 154 TEST_P(SpdyStreamTest, SendDataAfterOpen) { |
| 155 GURL url(kStreamUrl); | 155 GURL url(kStreamUrl); |
| 156 | 156 |
| 157 scoped_ptr<SpdyFrame> req( | 157 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 158 spdy_util_.ConstructSpdyPost( | 158 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 159 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
| 160 AddWrite(*req); | 159 AddWrite(*req); |
| 161 | 160 |
| 162 scoped_ptr<SpdyFrame> resp( | 161 scoped_ptr<SpdySerializedFrame> resp( |
| 163 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 162 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
| 164 AddRead(*resp); | 163 AddRead(*resp); |
| 165 | 164 |
| 166 scoped_ptr<SpdyFrame> msg( | 165 scoped_ptr<SpdySerializedFrame> msg( |
| 167 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 166 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 168 AddWrite(*msg); | 167 AddWrite(*msg); |
| 169 | 168 |
| 170 scoped_ptr<SpdyFrame> echo( | 169 scoped_ptr<SpdySerializedFrame> echo( |
| 171 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 170 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 172 AddRead(*echo); | 171 AddRead(*echo); |
| 173 | 172 |
| 174 AddReadEOF(); | 173 AddReadEOF(); |
| 175 | 174 |
| 176 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 175 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 177 GetNumWrites()); | 176 GetNumWrites()); |
| 178 MockConnect connect_data(SYNCHRONOUS, OK); | 177 MockConnect connect_data(SYNCHRONOUS, OK); |
| 179 data.set_connect_data(connect_data); | 178 data.set_connect_data(connect_data); |
| 180 | 179 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 const SpdyHeaderBlock& trailers() const { return trailers_; } | 223 const SpdyHeaderBlock& trailers() const { return trailers_; } |
| 225 | 224 |
| 226 private: | 225 private: |
| 227 SpdyHeaderBlock trailers_; | 226 SpdyHeaderBlock trailers_; |
| 228 }; | 227 }; |
| 229 | 228 |
| 230 // Regression test for crbug.com/481033. | 229 // Regression test for crbug.com/481033. |
| 231 TEST_P(SpdyStreamTest, Trailers) { | 230 TEST_P(SpdyStreamTest, Trailers) { |
| 232 GURL url(kStreamUrl); | 231 GURL url(kStreamUrl); |
| 233 | 232 |
| 234 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( | 233 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 235 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 234 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 236 AddWrite(*req); | 235 AddWrite(*req); |
| 237 | 236 |
| 238 scoped_ptr<SpdyFrame> msg( | 237 scoped_ptr<SpdySerializedFrame> msg( |
| 239 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, true)); | 238 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, true)); |
| 240 AddWrite(*msg); | 239 AddWrite(*msg); |
| 241 | 240 |
| 242 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 241 scoped_ptr<SpdySerializedFrame> resp( |
| 242 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
| 243 AddRead(*resp); | 243 AddRead(*resp); |
| 244 | 244 |
| 245 scoped_ptr<SpdyFrame> echo( | 245 scoped_ptr<SpdySerializedFrame> echo( |
| 246 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 246 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 247 AddRead(*echo); | 247 AddRead(*echo); |
| 248 | 248 |
| 249 SpdyHeaderBlock late_headers; | 249 SpdyHeaderBlock late_headers; |
| 250 late_headers["foo"] = "bar"; | 250 late_headers["foo"] = "bar"; |
| 251 scoped_ptr<SpdyFrame> trailers( | 251 scoped_ptr<SpdySerializedFrame> trailers( |
| 252 spdy_util_.ConstructSpdyResponseHeaders(1, late_headers, false)); | 252 spdy_util_.ConstructSpdyResponseHeaders(1, late_headers, false)); |
| 253 AddRead(*trailers); | 253 AddRead(*trailers); |
| 254 | 254 |
| 255 AddReadEOF(); | 255 AddReadEOF(); |
| 256 | 256 |
| 257 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 257 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 258 GetNumWrites()); | 258 GetNumWrites()); |
| 259 MockConnect connect_data(SYNCHRONOUS, OK); | 259 MockConnect connect_data(SYNCHRONOUS, OK); |
| 260 data.set_connect_data(connect_data); | 260 data.set_connect_data(connect_data); |
| 261 | 261 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 | 339 |
| 340 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 340 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 341 EXPECT_EQ("beta", delegate.GetResponseHeaderValue("alpha")); | 341 EXPECT_EQ("beta", delegate.GetResponseHeaderValue("alpha")); |
| 342 | 342 |
| 343 EXPECT_TRUE(spdy_session == NULL); | 343 EXPECT_TRUE(spdy_session == NULL); |
| 344 } | 344 } |
| 345 | 345 |
| 346 TEST_P(SpdyStreamTest, StreamError) { | 346 TEST_P(SpdyStreamTest, StreamError) { |
| 347 GURL url(kStreamUrl); | 347 GURL url(kStreamUrl); |
| 348 | 348 |
| 349 scoped_ptr<SpdyFrame> req( | 349 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 350 spdy_util_.ConstructSpdyPost( | 350 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 351 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
| 352 AddWrite(*req); | 351 AddWrite(*req); |
| 353 | 352 |
| 354 scoped_ptr<SpdyFrame> resp( | 353 scoped_ptr<SpdySerializedFrame> resp( |
| 355 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 354 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 356 AddRead(*resp); | 355 AddRead(*resp); |
| 357 | 356 |
| 358 scoped_ptr<SpdyFrame> msg( | 357 scoped_ptr<SpdySerializedFrame> msg( |
| 359 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 358 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 360 AddWrite(*msg); | 359 AddWrite(*msg); |
| 361 | 360 |
| 362 scoped_ptr<SpdyFrame> echo( | 361 scoped_ptr<SpdySerializedFrame> echo( |
| 363 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 362 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 364 AddRead(*echo); | 363 AddRead(*echo); |
| 365 | 364 |
| 366 AddReadEOF(); | 365 AddReadEOF(); |
| 367 | 366 |
| 368 BoundTestNetLog log; | 367 BoundTestNetLog log; |
| 369 | 368 |
| 370 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 369 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 371 GetNumWrites()); | 370 GetNumWrites()); |
| 372 MockConnect connect_data(SYNCHRONOUS, OK); | 371 MockConnect connect_data(SYNCHRONOUS, OK); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); | 415 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); |
| 417 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); | 416 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); |
| 418 } | 417 } |
| 419 | 418 |
| 420 // Make sure that large blocks of data are properly split up into | 419 // Make sure that large blocks of data are properly split up into |
| 421 // frame-sized chunks for a request/response (i.e., an HTTP-like) | 420 // frame-sized chunks for a request/response (i.e., an HTTP-like) |
| 422 // stream. | 421 // stream. |
| 423 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenRequestResponse) { | 422 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenRequestResponse) { |
| 424 GURL url(kStreamUrl); | 423 GURL url(kStreamUrl); |
| 425 | 424 |
| 426 scoped_ptr<SpdyFrame> req( | 425 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 427 spdy_util_.ConstructSpdyPost( | 426 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 428 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
| 429 AddWrite(*req); | 427 AddWrite(*req); |
| 430 | 428 |
| 431 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 429 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 432 scoped_ptr<SpdyFrame> chunk( | 430 scoped_ptr<SpdySerializedFrame> chunk(spdy_util_.ConstructSpdyBodyFrame( |
| 433 spdy_util_.ConstructSpdyBodyFrame( | 431 1, chunk_data.data(), chunk_data.length(), false)); |
| 434 1, chunk_data.data(), chunk_data.length(), false)); | |
| 435 AddWrite(*chunk); | 432 AddWrite(*chunk); |
| 436 AddWrite(*chunk); | 433 AddWrite(*chunk); |
| 437 | 434 |
| 438 scoped_ptr<SpdyFrame> last_chunk( | 435 scoped_ptr<SpdySerializedFrame> last_chunk(spdy_util_.ConstructSpdyBodyFrame( |
| 439 spdy_util_.ConstructSpdyBodyFrame( | 436 1, chunk_data.data(), chunk_data.length(), true)); |
| 440 1, chunk_data.data(), chunk_data.length(), true)); | |
| 441 AddWrite(*last_chunk); | 437 AddWrite(*last_chunk); |
| 442 | 438 |
| 443 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 439 scoped_ptr<SpdySerializedFrame> resp( |
| 440 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
| 444 AddRead(*resp); | 441 AddRead(*resp); |
| 445 | 442 |
| 446 AddReadEOF(); | 443 AddReadEOF(); |
| 447 | 444 |
| 448 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 445 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 449 GetNumWrites()); | 446 GetNumWrites()); |
| 450 MockConnect connect_data(SYNCHRONOUS, OK); | 447 MockConnect connect_data(SYNCHRONOUS, OK); |
| 451 data.set_connect_data(connect_data); | 448 data.set_connect_data(connect_data); |
| 452 | 449 |
| 453 session_deps_.socket_factory->AddSocketDataProvider(&data); | 450 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 479 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 476 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
| 480 EXPECT_TRUE(data.AllWriteDataConsumed()); | 477 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 481 } | 478 } |
| 482 | 479 |
| 483 // Make sure that large blocks of data are properly split up into | 480 // Make sure that large blocks of data are properly split up into |
| 484 // frame-sized chunks for a bidirectional (i.e., non-HTTP-like) | 481 // frame-sized chunks for a bidirectional (i.e., non-HTTP-like) |
| 485 // stream. | 482 // stream. |
| 486 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenBidirectional) { | 483 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenBidirectional) { |
| 487 GURL url(kStreamUrl); | 484 GURL url(kStreamUrl); |
| 488 | 485 |
| 489 scoped_ptr<SpdyFrame> req( | 486 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 490 spdy_util_.ConstructSpdyPost( | 487 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 491 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
| 492 AddWrite(*req); | 488 AddWrite(*req); |
| 493 | 489 |
| 494 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 490 scoped_ptr<SpdySerializedFrame> resp( |
| 491 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
| 495 AddRead(*resp); | 492 AddRead(*resp); |
| 496 | 493 |
| 497 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 494 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 498 scoped_ptr<SpdyFrame> chunk( | 495 scoped_ptr<SpdySerializedFrame> chunk(spdy_util_.ConstructSpdyBodyFrame( |
| 499 spdy_util_.ConstructSpdyBodyFrame( | 496 1, chunk_data.data(), chunk_data.length(), false)); |
| 500 1, chunk_data.data(), chunk_data.length(), false)); | |
| 501 AddWrite(*chunk); | 497 AddWrite(*chunk); |
| 502 AddWrite(*chunk); | 498 AddWrite(*chunk); |
| 503 AddWrite(*chunk); | 499 AddWrite(*chunk); |
| 504 | 500 |
| 505 AddReadEOF(); | 501 AddReadEOF(); |
| 506 | 502 |
| 507 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 503 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 508 GetNumWrites()); | 504 GetNumWrites()); |
| 509 MockConnect connect_data(SYNCHRONOUS, OK); | 505 MockConnect connect_data(SYNCHRONOUS, OK); |
| 510 data.set_connect_data(connect_data); | 506 data.set_connect_data(connect_data); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 537 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 533 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 538 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 534 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
| 539 EXPECT_TRUE(data.AllWriteDataConsumed()); | 535 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 540 } | 536 } |
| 541 | 537 |
| 542 // Receiving a header with uppercase ASCII should result in a protocol | 538 // Receiving a header with uppercase ASCII should result in a protocol |
| 543 // error. | 539 // error. |
| 544 TEST_P(SpdyStreamTest, UpperCaseHeaders) { | 540 TEST_P(SpdyStreamTest, UpperCaseHeaders) { |
| 545 GURL url(kStreamUrl); | 541 GURL url(kStreamUrl); |
| 546 | 542 |
| 547 scoped_ptr<SpdyFrame> syn( | 543 scoped_ptr<SpdySerializedFrame> syn( |
| 548 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 544 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 549 AddWrite(*syn); | 545 AddWrite(*syn); |
| 550 | 546 |
| 551 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 547 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
| 552 scoped_ptr<SpdyFrame> | 548 scoped_ptr<SpdySerializedFrame> reply( |
| 553 reply(spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); | 549 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); |
| 554 AddRead(*reply); | 550 AddRead(*reply); |
| 555 | 551 |
| 556 scoped_ptr<SpdyFrame> rst( | 552 scoped_ptr<SpdySerializedFrame> rst( |
| 557 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 553 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 558 AddWrite(*rst); | 554 AddWrite(*rst); |
| 559 | 555 |
| 560 AddReadEOF(); | 556 AddReadEOF(); |
| 561 | 557 |
| 562 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 558 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 563 GetNumWrites()); | 559 GetNumWrites()); |
| 564 MockConnect connect_data(SYNCHRONOUS, OK); | 560 MockConnect connect_data(SYNCHRONOUS, OK); |
| 565 data.set_connect_data(connect_data); | 561 data.set_connect_data(connect_data); |
| 566 | 562 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 586 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 582 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
| 587 | 583 |
| 588 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); | 584 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); |
| 589 } | 585 } |
| 590 | 586 |
| 591 // Receiving a header with uppercase ASCII should result in a protocol | 587 // Receiving a header with uppercase ASCII should result in a protocol |
| 592 // error even for a push stream. | 588 // error even for a push stream. |
| 593 TEST_P(SpdyStreamTest, UpperCaseHeadersOnPush) { | 589 TEST_P(SpdyStreamTest, UpperCaseHeadersOnPush) { |
| 594 GURL url(kStreamUrl); | 590 GURL url(kStreamUrl); |
| 595 | 591 |
| 596 scoped_ptr<SpdyFrame> syn( | 592 scoped_ptr<SpdySerializedFrame> syn( |
| 597 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 593 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 598 AddWrite(*syn); | 594 AddWrite(*syn); |
| 599 | 595 |
| 600 scoped_ptr<SpdyFrame> | 596 scoped_ptr<SpdySerializedFrame> reply( |
| 601 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 597 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 602 AddRead(*reply); | 598 AddRead(*reply); |
| 603 | 599 |
| 604 const char* const extra_headers[] = {"X-UpperCase", "yes"}; | 600 const char* const extra_headers[] = {"X-UpperCase", "yes"}; |
| 605 scoped_ptr<SpdyFrame> | 601 scoped_ptr<SpdySerializedFrame> push( |
| 606 push(spdy_util_.ConstructSpdyPush(extra_headers, 1, 2, 1, kStreamUrl)); | 602 spdy_util_.ConstructSpdyPush(extra_headers, 1, 2, 1, kStreamUrl)); |
| 607 AddRead(*push); | 603 AddRead(*push); |
| 608 | 604 |
| 609 scoped_ptr<SpdyFrame> rst( | 605 scoped_ptr<SpdySerializedFrame> rst( |
| 610 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 606 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
| 611 AddWrite(*rst); | 607 AddWrite(*rst); |
| 612 | 608 |
| 613 AddReadPause(); | 609 AddReadPause(); |
| 614 | 610 |
| 615 AddReadEOF(); | 611 AddReadEOF(); |
| 616 | 612 |
| 617 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 613 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 618 GetNumWrites()); | 614 GetNumWrites()); |
| 619 MockConnect connect_data(SYNCHRONOUS, OK); | 615 MockConnect connect_data(SYNCHRONOUS, OK); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 649 data.Resume(); | 645 data.Resume(); |
| 650 | 646 |
| 651 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 647 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 652 } | 648 } |
| 653 | 649 |
| 654 // Receiving a header with uppercase ASCII in a HEADERS frame should | 650 // Receiving a header with uppercase ASCII in a HEADERS frame should |
| 655 // result in a protocol error. | 651 // result in a protocol error. |
| 656 TEST_P(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { | 652 TEST_P(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { |
| 657 GURL url(kStreamUrl); | 653 GURL url(kStreamUrl); |
| 658 | 654 |
| 659 scoped_ptr<SpdyFrame> syn( | 655 scoped_ptr<SpdySerializedFrame> syn( |
| 660 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 656 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 661 AddWrite(*syn); | 657 AddWrite(*syn); |
| 662 | 658 |
| 663 scoped_ptr<SpdyFrame> | 659 scoped_ptr<SpdySerializedFrame> reply( |
| 664 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 660 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 665 AddRead(*reply); | 661 AddRead(*reply); |
| 666 | 662 |
| 667 scoped_ptr<SpdyFrame> | 663 scoped_ptr<SpdySerializedFrame> push( |
| 668 push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); | 664 spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); |
| 669 AddRead(*push); | 665 AddRead(*push); |
| 670 | 666 |
| 671 AddReadPause(); | 667 AddReadPause(); |
| 672 | 668 |
| 673 SpdyHeaderBlock late_headers; | 669 SpdyHeaderBlock late_headers; |
| 674 late_headers["X-UpperCase"] = "yes"; | 670 late_headers["X-UpperCase"] = "yes"; |
| 675 scoped_ptr<SpdyFrame> headers_frame( | 671 scoped_ptr<SpdySerializedFrame> headers_frame( |
| 676 spdy_util_.ConstructSpdyReply(2, late_headers)); | 672 spdy_util_.ConstructSpdyReply(2, late_headers)); |
| 677 AddRead(*headers_frame); | 673 AddRead(*headers_frame); |
| 678 | 674 |
| 679 AddWritePause(); | 675 AddWritePause(); |
| 680 | 676 |
| 681 scoped_ptr<SpdyFrame> rst( | 677 scoped_ptr<SpdySerializedFrame> rst( |
| 682 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 678 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
| 683 AddWrite(*rst); | 679 AddWrite(*rst); |
| 684 | 680 |
| 685 AddReadEOF(); | 681 AddReadEOF(); |
| 686 | 682 |
| 687 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 683 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 688 GetNumWrites()); | 684 GetNumWrites()); |
| 689 MockConnect connect_data(SYNCHRONOUS, OK); | 685 MockConnect connect_data(SYNCHRONOUS, OK); |
| 690 data.set_connect_data(connect_data); | 686 data.set_connect_data(connect_data); |
| 691 | 687 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 data.Resume(); | 721 data.Resume(); |
| 726 | 722 |
| 727 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 723 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 728 } | 724 } |
| 729 | 725 |
| 730 // Receiving a duplicate header in a HEADERS frame should result in a | 726 // Receiving a duplicate header in a HEADERS frame should result in a |
| 731 // protocol error. | 727 // protocol error. |
| 732 TEST_P(SpdyStreamTest, DuplicateHeaders) { | 728 TEST_P(SpdyStreamTest, DuplicateHeaders) { |
| 733 GURL url(kStreamUrl); | 729 GURL url(kStreamUrl); |
| 734 | 730 |
| 735 scoped_ptr<SpdyFrame> syn( | 731 scoped_ptr<SpdySerializedFrame> syn( |
| 736 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 732 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 737 AddWrite(*syn); | 733 AddWrite(*syn); |
| 738 | 734 |
| 739 scoped_ptr<SpdyFrame> | 735 scoped_ptr<SpdySerializedFrame> reply( |
| 740 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 736 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 741 AddRead(*reply); | 737 AddRead(*reply); |
| 742 | 738 |
| 743 scoped_ptr<SpdyFrame> | 739 scoped_ptr<SpdySerializedFrame> push( |
| 744 push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); | 740 spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); |
| 745 AddRead(*push); | 741 AddRead(*push); |
| 746 | 742 |
| 747 AddReadPause(); | 743 AddReadPause(); |
| 748 | 744 |
| 749 SpdyHeaderBlock late_headers; | 745 SpdyHeaderBlock late_headers; |
| 750 late_headers[spdy_util_.GetStatusKey()] = "500 Server Error"; | 746 late_headers[spdy_util_.GetStatusKey()] = "500 Server Error"; |
| 751 scoped_ptr<SpdyFrame> headers_frame( | 747 scoped_ptr<SpdySerializedFrame> headers_frame( |
| 752 spdy_util_.ConstructSpdyReply(2, late_headers)); | 748 spdy_util_.ConstructSpdyReply(2, late_headers)); |
| 753 AddRead(*headers_frame); | 749 AddRead(*headers_frame); |
| 754 | 750 |
| 755 AddReadPause(); | 751 AddReadPause(); |
| 756 | 752 |
| 757 scoped_ptr<SpdyFrame> rst( | 753 scoped_ptr<SpdySerializedFrame> rst( |
| 758 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 754 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
| 759 AddWrite(*rst); | 755 AddWrite(*rst); |
| 760 | 756 |
| 761 AddReadEOF(); | 757 AddReadEOF(); |
| 762 | 758 |
| 763 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 759 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 764 GetNumWrites()); | 760 GetNumWrites()); |
| 765 MockConnect connect_data(SYNCHRONOUS, OK); | 761 MockConnect connect_data(SYNCHRONOUS, OK); |
| 766 data.set_connect_data(connect_data); | 762 data.set_connect_data(connect_data); |
| 767 | 763 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 | 796 |
| 801 data.Resume(); | 797 data.Resume(); |
| 802 | 798 |
| 803 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 799 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 804 } | 800 } |
| 805 | 801 |
| 806 // Call IncreaseSendWindowSize on a stream with a large enough delta | 802 // Call IncreaseSendWindowSize on a stream with a large enough delta |
| 807 // to overflow an int32_t. The SpdyStream should handle that case | 803 // to overflow an int32_t. The SpdyStream should handle that case |
| 808 // gracefully. | 804 // gracefully. |
| 809 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { | 805 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { |
| 810 scoped_ptr<SpdyFrame> req( | 806 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 811 spdy_util_.ConstructSpdyPost( | 807 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 812 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
| 813 AddWrite(*req); | 808 AddWrite(*req); |
| 814 | 809 |
| 815 AddReadPause(); | 810 AddReadPause(); |
| 816 | 811 |
| 817 // Triggered by the overflowing call to IncreaseSendWindowSize | 812 // Triggered by the overflowing call to IncreaseSendWindowSize |
| 818 // below. | 813 // below. |
| 819 scoped_ptr<SpdyFrame> rst( | 814 scoped_ptr<SpdySerializedFrame> rst( |
| 820 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); | 815 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); |
| 821 AddWrite(*rst); | 816 AddWrite(*rst); |
| 822 | 817 |
| 823 AddReadEOF(); | 818 AddReadEOF(); |
| 824 | 819 |
| 825 BoundTestNetLog log; | 820 BoundTestNetLog log; |
| 826 | 821 |
| 827 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 822 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 828 GetNumWrites()); | 823 GetNumWrites()); |
| 829 MockConnect connect_data(SYNCHRONOUS, OK); | 824 MockConnect connect_data(SYNCHRONOUS, OK); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 888 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 894 } | 889 } |
| 895 | 890 |
| 896 // Given an unstall function, runs a test to make sure that a | 891 // Given an unstall function, runs a test to make sure that a |
| 897 // request/response (i.e., an HTTP-like) stream resumes after a stall | 892 // request/response (i.e., an HTTP-like) stream resumes after a stall |
| 898 // and unstall. | 893 // and unstall. |
| 899 void SpdyStreamTest::RunResumeAfterUnstallRequestResponseTest( | 894 void SpdyStreamTest::RunResumeAfterUnstallRequestResponseTest( |
| 900 const UnstallFunction& unstall_function) { | 895 const UnstallFunction& unstall_function) { |
| 901 GURL url(kStreamUrl); | 896 GURL url(kStreamUrl); |
| 902 | 897 |
| 903 scoped_ptr<SpdyFrame> req( | 898 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 904 spdy_util_.ConstructSpdyPost( | 899 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 905 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
| 906 AddWrite(*req); | 900 AddWrite(*req); |
| 907 | 901 |
| 908 scoped_ptr<SpdyFrame> body( | 902 scoped_ptr<SpdySerializedFrame> body( |
| 909 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, true)); | 903 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, true)); |
| 910 AddWrite(*body); | 904 AddWrite(*body); |
| 911 | 905 |
| 912 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 906 scoped_ptr<SpdySerializedFrame> resp( |
| 907 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 913 AddRead(*resp); | 908 AddRead(*resp); |
| 914 | 909 |
| 915 AddReadEOF(); | 910 AddReadEOF(); |
| 916 | 911 |
| 917 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 912 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 918 GetNumWrites()); | 913 GetNumWrites()); |
| 919 MockConnect connect_data(SYNCHRONOUS, OK); | 914 MockConnect connect_data(SYNCHRONOUS, OK); |
| 920 data.set_connect_data(connect_data); | 915 data.set_connect_data(connect_data); |
| 921 | 916 |
| 922 session_deps_.socket_factory->AddSocketDataProvider(&data); | 917 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 969 base::Bind(&AdjustStreamSendWindowSize)); | 964 base::Bind(&AdjustStreamSendWindowSize)); |
| 970 } | 965 } |
| 971 | 966 |
| 972 // Given an unstall function, runs a test to make sure that a | 967 // Given an unstall function, runs a test to make sure that a |
| 973 // bidirectional (i.e., non-HTTP-like) stream resumes after a stall | 968 // bidirectional (i.e., non-HTTP-like) stream resumes after a stall |
| 974 // and unstall. | 969 // and unstall. |
| 975 void SpdyStreamTest::RunResumeAfterUnstallBidirectionalTest( | 970 void SpdyStreamTest::RunResumeAfterUnstallBidirectionalTest( |
| 976 const UnstallFunction& unstall_function) { | 971 const UnstallFunction& unstall_function) { |
| 977 GURL url(kStreamUrl); | 972 GURL url(kStreamUrl); |
| 978 | 973 |
| 979 scoped_ptr<SpdyFrame> req( | 974 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 980 spdy_util_.ConstructSpdyPost( | 975 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 981 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
| 982 AddWrite(*req); | 976 AddWrite(*req); |
| 983 | 977 |
| 984 AddReadPause(); | 978 AddReadPause(); |
| 985 | 979 |
| 986 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 980 scoped_ptr<SpdySerializedFrame> resp( |
| 981 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 987 AddRead(*resp); | 982 AddRead(*resp); |
| 988 | 983 |
| 989 scoped_ptr<SpdyFrame> msg( | 984 scoped_ptr<SpdySerializedFrame> msg( |
| 990 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 985 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 991 AddWrite(*msg); | 986 AddWrite(*msg); |
| 992 | 987 |
| 993 scoped_ptr<SpdyFrame> echo( | 988 scoped_ptr<SpdySerializedFrame> echo( |
| 994 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 989 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 995 AddRead(*echo); | 990 AddRead(*echo); |
| 996 | 991 |
| 997 AddReadEOF(); | 992 AddReadEOF(); |
| 998 | 993 |
| 999 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 994 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 1000 GetNumWrites()); | 995 GetNumWrites()); |
| 1001 MockConnect connect_data(SYNCHRONOUS, OK); | 996 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1002 data.set_connect_data(connect_data); | 997 data.set_connect_data(connect_data); |
| 1003 | 998 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1053 | 1048 |
| 1054 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustBidirectional) { | 1049 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustBidirectional) { |
| 1055 RunResumeAfterUnstallBidirectionalTest( | 1050 RunResumeAfterUnstallBidirectionalTest( |
| 1056 base::Bind(&AdjustStreamSendWindowSize)); | 1051 base::Bind(&AdjustStreamSendWindowSize)); |
| 1057 } | 1052 } |
| 1058 | 1053 |
| 1059 // Test calculation of amount of bytes received from network. | 1054 // Test calculation of amount of bytes received from network. |
| 1060 TEST_P(SpdyStreamTest, ReceivedBytes) { | 1055 TEST_P(SpdyStreamTest, ReceivedBytes) { |
| 1061 GURL url(kStreamUrl); | 1056 GURL url(kStreamUrl); |
| 1062 | 1057 |
| 1063 scoped_ptr<SpdyFrame> syn( | 1058 scoped_ptr<SpdySerializedFrame> syn( |
| 1064 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1059 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1065 AddWrite(*syn); | 1060 AddWrite(*syn); |
| 1066 | 1061 |
| 1067 AddReadPause(); | 1062 AddReadPause(); |
| 1068 | 1063 |
| 1069 scoped_ptr<SpdyFrame> | 1064 scoped_ptr<SpdySerializedFrame> reply( |
| 1070 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1065 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 1071 AddRead(*reply); | 1066 AddRead(*reply); |
| 1072 | 1067 |
| 1073 AddReadPause(); | 1068 AddReadPause(); |
| 1074 | 1069 |
| 1075 scoped_ptr<SpdyFrame> msg( | 1070 scoped_ptr<SpdySerializedFrame> msg( |
| 1076 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 1071 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 1077 AddRead(*msg); | 1072 AddRead(*msg); |
| 1078 | 1073 |
| 1079 AddReadPause(); | 1074 AddReadPause(); |
| 1080 | 1075 |
| 1081 AddReadEOF(); | 1076 AddReadEOF(); |
| 1082 | 1077 |
| 1083 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 1078 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 1084 GetNumWrites()); | 1079 GetNumWrites()); |
| 1085 MockConnect connect_data(SYNCHRONOUS, OK); | 1080 MockConnect connect_data(SYNCHRONOUS, OK); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1129 EXPECT_EQ(response_len, stream->raw_received_bytes()); | 1124 EXPECT_EQ(response_len, stream->raw_received_bytes()); |
| 1130 | 1125 |
| 1131 // FIN | 1126 // FIN |
| 1132 data.Resume(); | 1127 data.Resume(); |
| 1133 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 1128 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 1134 } | 1129 } |
| 1135 | 1130 |
| 1136 } // namespace test | 1131 } // namespace test |
| 1137 | 1132 |
| 1138 } // namespace net | 1133 } // namespace net |
| OLD | NEW |