OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/memory/ref_counted.h" | 6 #include "base/memory/ref_counted.h" |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
9 #include "base/strings/string_piece.h" | 9 #include "base/strings/string_piece.h" |
10 #include "net/base/completion_callback.h" | 10 #include "net/base/completion_callback.h" |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 | 143 |
144 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); | 144 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
145 | 145 |
146 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 146 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
147 | 147 |
148 EXPECT_TRUE(delegate.send_headers_completed()); | 148 EXPECT_TRUE(delegate.send_headers_completed()); |
149 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 149 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
150 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); | 150 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); |
151 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 151 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
152 delegate.TakeReceivedData()); | 152 delegate.TakeReceivedData()); |
153 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent()); | 153 EXPECT_TRUE(data.at_write_eof()); |
154 } | 154 } |
155 | 155 |
156 TEST_F(SpdyStreamSpdy3Test, SendHeaderAndDataAfterOpen) { | 156 TEST_F(SpdyStreamSpdy3Test, SendHeaderAndDataAfterOpen) { |
157 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 157 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
158 | 158 |
159 scoped_ptr<SpdyFrame> expected_request(ConstructSpdyWebSocketSynStream( | 159 scoped_ptr<SpdyFrame> expected_request(ConstructSpdyWebSocketSynStream( |
160 1, | 160 1, |
161 "/chat", | 161 "/chat", |
162 "server.example.com", | 162 "server.example.com", |
163 "http://example.com")); | 163 "http://example.com")); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 (*headers)[":origin"] = "http://example.com"; | 219 (*headers)[":origin"] = "http://example.com"; |
220 stream->set_spdy_headers(headers.Pass()); | 220 stream->set_spdy_headers(headers.Pass()); |
221 EXPECT_TRUE(stream->HasUrl()); | 221 EXPECT_TRUE(stream->HasUrl()); |
222 | 222 |
223 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); | 223 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
224 | 224 |
225 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 225 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
226 | 226 |
227 EXPECT_TRUE(delegate.send_headers_completed()); | 227 EXPECT_TRUE(delegate.send_headers_completed()); |
228 EXPECT_EQ("101", delegate.GetResponseHeaderValue(":status")); | 228 EXPECT_EQ("101", delegate.GetResponseHeaderValue(":status")); |
229 EXPECT_EQ(1, delegate.headers_sent()); | |
230 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 229 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
231 EXPECT_EQ(6, delegate.data_sent()); | 230 EXPECT_TRUE(data.at_write_eof()); |
232 } | 231 } |
233 | 232 |
234 TEST_F(SpdyStreamSpdy3Test, PushedStream) { | 233 TEST_F(SpdyStreamSpdy3Test, PushedStream) { |
235 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 234 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
236 scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); | 235 scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); |
237 | 236 |
238 MockRead reads[] = { | 237 MockRead reads[] = { |
239 MockRead(ASYNC, 0, 0), // EOF | 238 MockRead(ASYNC, 0, 0), // EOF |
240 }; | 239 }; |
241 | 240 |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 | 339 |
341 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 340 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
342 | 341 |
343 const SpdyStreamId stream_id = delegate.stream_id(); | 342 const SpdyStreamId stream_id = delegate.stream_id(); |
344 | 343 |
345 EXPECT_TRUE(delegate.send_headers_completed()); | 344 EXPECT_TRUE(delegate.send_headers_completed()); |
346 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 345 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
347 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); | 346 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); |
348 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 347 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
349 delegate.TakeReceivedData()); | 348 delegate.TakeReceivedData()); |
350 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent()); | 349 EXPECT_TRUE(data.at_write_eof()); |
351 | 350 |
352 // Check that the NetLog was filled reasonably. | 351 // Check that the NetLog was filled reasonably. |
353 net::CapturingNetLog::CapturedEntryList entries; | 352 net::CapturingNetLog::CapturedEntryList entries; |
354 log.GetEntries(&entries); | 353 log.GetEntries(&entries); |
355 EXPECT_LT(0u, entries.size()); | 354 EXPECT_LT(0u, entries.size()); |
356 | 355 |
357 // Check that we logged SPDY_STREAM_ERROR correctly. | 356 // Check that we logged SPDY_STREAM_ERROR correctly. |
358 int pos = net::ExpectLogContainsSomewhere( | 357 int pos = net::ExpectLogContainsSomewhere( |
359 entries, 0, | 358 entries, 0, |
360 net::NetLog::TYPE_SPDY_STREAM_ERROR, | 359 net::NetLog::TYPE_SPDY_STREAM_ERROR, |
361 net::NetLog::PHASE_NONE); | 360 net::NetLog::PHASE_NONE); |
362 | 361 |
363 int stream_id2; | 362 int stream_id2; |
364 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); | 363 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); |
365 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); | 364 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); |
366 } | 365 } |
367 | 366 |
| 367 // Make sure that large blocks of data are properly split up into |
| 368 // frame-sized chunks for a request/response (i.e., an HTTP-like) |
| 369 // stream. |
| 370 TEST_F(SpdyStreamSpdy3Test, SendLargeDataAfterOpenRequestResponse) { |
| 371 GURL url(kStreamUrl); |
| 372 |
| 373 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 374 |
| 375 scoped_ptr<SpdyFrame> req( |
| 376 ConstructSpdyPost(kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 377 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 378 scoped_ptr<SpdyFrame> chunk( |
| 379 ConstructSpdyBodyFrame( |
| 380 1, chunk_data.data(), chunk_data.length(), false)); |
| 381 MockWrite writes[] = { |
| 382 CreateMockWrite(*req, 0), |
| 383 CreateMockWrite(*chunk, 1), |
| 384 CreateMockWrite(*chunk, 2), |
| 385 CreateMockWrite(*chunk, 3), |
| 386 }; |
| 387 |
| 388 scoped_ptr<SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); |
| 389 MockRead reads[] = { |
| 390 CreateMockRead(*resp, 4), |
| 391 MockRead(ASYNC, 0, 0, 5), // EOF |
| 392 }; |
| 393 |
| 394 OrderedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 395 MockConnect connect_data(SYNCHRONOUS, OK); |
| 396 data.set_connect_data(connect_data); |
| 397 |
| 398 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 399 |
| 400 scoped_refptr<SpdySession> session(CreateSpdySession()); |
| 401 |
| 402 InitializeSpdySession(session, host_port_pair_); |
| 403 |
| 404 base::WeakPtr<SpdyStream> stream = |
| 405 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); |
| 406 ASSERT_TRUE(stream.get() != NULL); |
| 407 |
| 408 std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x'); |
| 409 StreamDelegateWithBody delegate(stream, body_data); |
| 410 stream->SetDelegate(&delegate); |
| 411 |
| 412 EXPECT_FALSE(stream->HasUrl()); |
| 413 |
| 414 stream->set_spdy_headers( |
| 415 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
| 416 EXPECT_TRUE(stream->HasUrl()); |
| 417 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 418 |
| 419 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
| 420 |
| 421 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 422 |
| 423 EXPECT_TRUE(delegate.send_headers_completed()); |
| 424 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
| 425 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); |
| 426 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
| 427 EXPECT_TRUE(data.at_write_eof()); |
| 428 } |
| 429 |
| 430 // Make sure that large blocks of data are properly split up into |
| 431 // frame-sized chunks for a bidirectional (i.e., non-HTTP-like) |
| 432 // stream. |
| 433 TEST_F(SpdyStreamSpdy3Test, SendLargeDataAfterOpenBidirectional) { |
| 434 GURL url(kStreamUrl); |
| 435 |
| 436 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 437 |
| 438 scoped_ptr<SpdyFrame> req( |
| 439 ConstructSpdyPost(kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 440 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 441 scoped_ptr<SpdyFrame> chunk( |
| 442 ConstructSpdyBodyFrame( |
| 443 1, chunk_data.data(), chunk_data.length(), false)); |
| 444 MockWrite writes[] = { |
| 445 CreateMockWrite(*req, 0), |
| 446 CreateMockWrite(*chunk, 2), |
| 447 CreateMockWrite(*chunk, 3), |
| 448 CreateMockWrite(*chunk, 4), |
| 449 }; |
| 450 |
| 451 scoped_ptr<SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); |
| 452 MockRead reads[] = { |
| 453 CreateMockRead(*resp, 1), |
| 454 MockRead(ASYNC, 0, 0, 5), // EOF |
| 455 }; |
| 456 |
| 457 OrderedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 458 MockConnect connect_data(SYNCHRONOUS, OK); |
| 459 data.set_connect_data(connect_data); |
| 460 |
| 461 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 462 |
| 463 scoped_refptr<SpdySession> session(CreateSpdySession()); |
| 464 |
| 465 InitializeSpdySession(session, host_port_pair_); |
| 466 |
| 467 base::WeakPtr<SpdyStream> stream = |
| 468 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); |
| 469 ASSERT_TRUE(stream.get() != NULL); |
| 470 |
| 471 std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x'); |
| 472 StreamDelegateSendImmediate delegate( |
| 473 stream, scoped_ptr<SpdyHeaderBlock>(), body_data); |
| 474 stream->SetDelegate(&delegate); |
| 475 |
| 476 EXPECT_FALSE(stream->HasUrl()); |
| 477 |
| 478 stream->set_spdy_headers( |
| 479 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
| 480 EXPECT_TRUE(stream->HasUrl()); |
| 481 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 482 |
| 483 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
| 484 |
| 485 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 486 |
| 487 EXPECT_TRUE(delegate.send_headers_completed()); |
| 488 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
| 489 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); |
| 490 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
| 491 EXPECT_TRUE(data.at_write_eof()); |
| 492 } |
| 493 |
368 // Call IncreaseSendWindowSize on a stream with a large enough delta | 494 // Call IncreaseSendWindowSize on a stream with a large enough delta |
369 // to overflow an int32. The SpdyStream should handle that case | 495 // to overflow an int32. The SpdyStream should handle that case |
370 // gracefully. | 496 // gracefully. |
371 TEST_F(SpdyStreamSpdy3Test, IncreaseSendWindowSizeOverflow) { | 497 TEST_F(SpdyStreamSpdy3Test, IncreaseSendWindowSizeOverflow) { |
372 session_ = | 498 session_ = |
373 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 499 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
374 | 500 |
375 MockRead reads[] = { | 501 MockRead reads[] = { |
376 MockRead(ASYNC, 0, 2), // EOF | 502 MockRead(ASYNC, 0, 2), // EOF |
377 }; | 503 }; |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 649 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
524 | 650 |
525 data.RunFor(3); | 651 data.RunFor(3); |
526 | 652 |
527 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 653 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
528 | 654 |
529 EXPECT_TRUE(delegate.send_headers_completed()); | 655 EXPECT_TRUE(delegate.send_headers_completed()); |
530 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 656 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
531 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); | 657 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); |
532 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 658 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
533 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.body_data_sent()); | 659 EXPECT_TRUE(data.at_write_eof()); |
534 } | 660 } |
535 | 661 |
536 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeIncreaseRequestResponse) { | 662 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeIncreaseRequestResponse) { |
537 RunResumeAfterUnstallRequestResponseTest( | 663 RunResumeAfterUnstallRequestResponseTest( |
538 base::Bind(&IncreaseStreamSendWindowSize)); | 664 base::Bind(&IncreaseStreamSendWindowSize)); |
539 } | 665 } |
540 | 666 |
541 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeAdjustRequestResponse) { | 667 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeAdjustRequestResponse) { |
542 RunResumeAfterUnstallRequestResponseTest( | 668 RunResumeAfterUnstallRequestResponseTest( |
543 base::Bind(&AdjustStreamSendWindowSize)); | 669 base::Bind(&AdjustStreamSendWindowSize)); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 | 741 |
616 data.RunFor(3); | 742 data.RunFor(3); |
617 | 743 |
618 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 744 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
619 | 745 |
620 EXPECT_TRUE(delegate.send_headers_completed()); | 746 EXPECT_TRUE(delegate.send_headers_completed()); |
621 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 747 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
622 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); | 748 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); |
623 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 749 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
624 delegate.TakeReceivedData()); | 750 delegate.TakeReceivedData()); |
625 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent()); | 751 EXPECT_TRUE(data.at_write_eof()); |
626 } | 752 } |
627 | 753 |
628 // TODO(akalin): Re-enable these when http://crbug.com/242288 is | 754 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeIncreaseBidirectional) { |
629 // fixed. | |
630 TEST_F(SpdyStreamSpdy3Test, | |
631 DISABLED_ResumeAfterSendWindowSizeIncreaseBidirectional) { | |
632 RunResumeAfterUnstallBidirectionalTest( | 755 RunResumeAfterUnstallBidirectionalTest( |
633 base::Bind(&IncreaseStreamSendWindowSize)); | 756 base::Bind(&IncreaseStreamSendWindowSize)); |
634 } | 757 } |
635 | 758 |
636 TEST_F(SpdyStreamSpdy3Test, | 759 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeAdjustBidirectional) { |
637 DISABLED_ResumeAfterSendWindowSizeAdjustBidirectional) { | |
638 RunResumeAfterUnstallBidirectionalTest( | 760 RunResumeAfterUnstallBidirectionalTest( |
639 base::Bind(&AdjustStreamSendWindowSize)); | 761 base::Bind(&AdjustStreamSendWindowSize)); |
640 } | 762 } |
641 | 763 |
642 } // namespace | 764 } // namespace |
643 | 765 |
644 } // namespace test | 766 } // namespace test |
645 | 767 |
646 } // namespace net | 768 } // namespace net |
OLD | NEW |