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/tools/quic/quic_simple_server_session.h" | 5 #include "net/tools/quic/quic_simple_server_session.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 namespace test { | 59 namespace test { |
60 namespace { | 60 namespace { |
61 typedef QuicSimpleServerSession::PromisedStreamInfo PromisedStreamInfo; | 61 typedef QuicSimpleServerSession::PromisedStreamInfo PromisedStreamInfo; |
62 } // namespace | 62 } // namespace |
63 | 63 |
64 class MockQuicHeadersStream : public QuicHeadersStream { | 64 class MockQuicHeadersStream : public QuicHeadersStream { |
65 public: | 65 public: |
66 explicit MockQuicHeadersStream(QuicSpdySession* session) | 66 explicit MockQuicHeadersStream(QuicSpdySession* session) |
67 : QuicHeadersStream(session) {} | 67 : QuicHeadersStream(session) {} |
68 | 68 |
69 MOCK_METHOD4(WritePushPromise, | 69 // Methods taking non-copyable types like SpdyHeaderBlock by value cannot be |
| 70 // mocked directly. |
| 71 size_t WritePushPromise(QuicStreamId original_stream_id, |
| 72 QuicStreamId promised_stream_id, |
| 73 SpdyHeaderBlock headers, |
| 74 QuicAckListenerInterface* ack_listener) override { |
| 75 return WritePushPromiseMock(original_stream_id, promised_stream_id, headers, |
| 76 ack_listener); |
| 77 } |
| 78 MOCK_METHOD4(WritePushPromiseMock, |
70 size_t(QuicStreamId original_stream_id, | 79 size_t(QuicStreamId original_stream_id, |
71 QuicStreamId promised_stream_id, | 80 QuicStreamId promised_stream_id, |
72 SpdyHeaderBlock headers, | 81 const SpdyHeaderBlock& headers, |
73 QuicAckListenerInterface* ack_listener)); | 82 QuicAckListenerInterface* ack_listener)); |
74 | 83 |
75 MOCK_METHOD5(WriteHeaders, | 84 size_t WriteHeaders(QuicStreamId stream_id, |
| 85 SpdyHeaderBlock headers, |
| 86 bool fin, |
| 87 SpdyPriority priority, |
| 88 QuicAckListenerInterface* ack_listener) override { |
| 89 return WriteHeadersMock(stream_id, headers, fin, priority, ack_listener); |
| 90 } |
| 91 MOCK_METHOD5(WriteHeadersMock, |
76 size_t(QuicStreamId stream_id, | 92 size_t(QuicStreamId stream_id, |
77 SpdyHeaderBlock headers, | 93 const SpdyHeaderBlock& headers, |
78 bool fin, | 94 bool fin, |
79 SpdyPriority priority, | 95 SpdyPriority priority, |
80 QuicAckListenerInterface* ack_listener)); | 96 QuicAckListenerInterface* ack_listener)); |
81 }; | 97 }; |
82 | 98 |
83 class MockQuicCryptoServerStream : public QuicCryptoServerStream { | 99 class MockQuicCryptoServerStream : public QuicCryptoServerStream { |
84 public: | 100 public: |
85 explicit MockQuicCryptoServerStream( | 101 explicit MockQuicCryptoServerStream( |
86 const QuicCryptoServerConfig* crypto_config, | 102 const QuicCryptoServerConfig* crypto_config, |
87 QuicCompressedCertsCache* compressed_certs_cache, | 103 QuicCompressedCertsCache* compressed_certs_cache, |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 string partial_push_resource_path = "/server_push_src"; | 471 string partial_push_resource_path = "/server_push_src"; |
456 std::list<QuicInMemoryCache::ServerPushInfo> push_resources; | 472 std::list<QuicInMemoryCache::ServerPushInfo> push_resources; |
457 string scheme = "http"; | 473 string scheme = "http"; |
458 for (unsigned int i = 1; i <= num_resources; ++i) { | 474 for (unsigned int i = 1; i <= num_resources; ++i) { |
459 QuicStreamId stream_id = i * 2; | 475 QuicStreamId stream_id = i * 2; |
460 string path = partial_push_resource_path + base::UintToString(i); | 476 string path = partial_push_resource_path + base::UintToString(i); |
461 string url = scheme + "://" + resource_host + path; | 477 string url = scheme + "://" + resource_host + path; |
462 GURL resource_url = GURL(url); | 478 GURL resource_url = GURL(url); |
463 string body; | 479 string body; |
464 GenerateBody(&body, body_size); | 480 GenerateBody(&body, body_size); |
465 SpdyHeaderBlock response_headers; | |
466 QuicInMemoryCache::GetInstance()->AddSimpleResponse(resource_host, path, | 481 QuicInMemoryCache::GetInstance()->AddSimpleResponse(resource_host, path, |
467 200, body); | 482 200, body); |
468 push_resources.push_back(QuicInMemoryCache::ServerPushInfo( | 483 push_resources.push_back(QuicInMemoryCache::ServerPushInfo( |
469 resource_url, response_headers, kDefaultPriority, body)); | 484 resource_url, SpdyHeaderBlock(), kDefaultPriority, body)); |
470 // PUSH_PROMISED are sent for all the resources. | 485 // PUSH_PROMISED are sent for all the resources. |
471 EXPECT_CALL(*headers_stream_, WritePushPromise(kClientDataStreamId1, | 486 EXPECT_CALL( |
472 stream_id, _, nullptr)); | 487 *headers_stream_, |
| 488 WritePushPromiseMock(kClientDataStreamId1, stream_id, _, nullptr)); |
473 if (i <= kMaxStreamsForTest) { | 489 if (i <= kMaxStreamsForTest) { |
474 // |kMaxStreamsForTest| promised responses should be sent. | 490 // |kMaxStreamsForTest| promised responses should be sent. |
475 EXPECT_CALL(*headers_stream_, WriteHeaders(stream_id, _, false, | 491 EXPECT_CALL( |
476 kDefaultPriority, nullptr)); | 492 *headers_stream_, |
| 493 WriteHeadersMock(stream_id, _, false, kDefaultPriority, nullptr)); |
477 // Since flow control window is smaller than response body, not the | 494 // Since flow control window is smaller than response body, not the |
478 // whole body will be sent. | 495 // whole body will be sent. |
479 EXPECT_CALL(*connection_, | 496 EXPECT_CALL(*connection_, |
480 SendStreamData(stream_id, _, 0, false, nullptr)) | 497 SendStreamData(stream_id, _, 0, false, nullptr)) |
481 .WillOnce( | 498 .WillOnce( |
482 Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); | 499 Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); |
483 EXPECT_CALL(*connection_, SendBlocked(stream_id)); | 500 EXPECT_CALL(*connection_, SendBlocked(stream_id)); |
484 } | 501 } |
485 } | 502 } |
486 session_->PromisePushResources(request_url, push_resources, | 503 session_->PromisePushResources(request_url, push_resources, |
(...skipping 17 matching lines...) Expand all Loading... |
504 TEST_P(QuicSimpleServerSessionServerPushTest, | 521 TEST_P(QuicSimpleServerSessionServerPushTest, |
505 HandlePromisedPushRequestsAfterStreamDraining) { | 522 HandlePromisedPushRequestsAfterStreamDraining) { |
506 // Tests that after promised stream queued up, when an opened stream is marked | 523 // Tests that after promised stream queued up, when an opened stream is marked |
507 // draining, a queued promised stream will become open and send push response. | 524 // draining, a queued promised stream will become open and send push response. |
508 size_t num_resources = kMaxStreamsForTest + 1; | 525 size_t num_resources = kMaxStreamsForTest + 1; |
509 PromisePushResources(num_resources); | 526 PromisePushResources(num_resources); |
510 QuicStreamId next_out_going_stream_id = num_resources * 2; | 527 QuicStreamId next_out_going_stream_id = num_resources * 2; |
511 | 528 |
512 // After an open stream is marked draining, a new stream is expected to be | 529 // After an open stream is marked draining, a new stream is expected to be |
513 // created and a response sent on the stream. | 530 // created and a response sent on the stream. |
514 EXPECT_CALL(*headers_stream_, WriteHeaders(next_out_going_stream_id, _, false, | 531 EXPECT_CALL(*headers_stream_, |
515 kDefaultPriority, nullptr)); | 532 WriteHeadersMock(next_out_going_stream_id, _, false, |
| 533 kDefaultPriority, nullptr)); |
516 EXPECT_CALL(*connection_, | 534 EXPECT_CALL(*connection_, |
517 SendStreamData(next_out_going_stream_id, _, 0, false, nullptr)) | 535 SendStreamData(next_out_going_stream_id, _, 0, false, nullptr)) |
518 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); | 536 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); |
519 EXPECT_CALL(*connection_, SendBlocked(next_out_going_stream_id)); | 537 EXPECT_CALL(*connection_, SendBlocked(next_out_going_stream_id)); |
520 session_->StreamDraining(2); | 538 session_->StreamDraining(2); |
521 // Number of open outgoing streams should still be the same, because a new | 539 // Number of open outgoing streams should still be the same, because a new |
522 // stream is opened. And the queue should be empty. | 540 // stream is opened. And the queue should be empty. |
523 EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams()); | 541 EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams()); |
524 } | 542 } |
525 | 543 |
(...skipping 12 matching lines...) Expand all Loading... |
538 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0); | 556 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0); |
539 EXPECT_CALL(*connection_, | 557 EXPECT_CALL(*connection_, |
540 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, 0)); | 558 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, 0)); |
541 visitor_->OnRstStream(rst); | 559 visitor_->OnRstStream(rst); |
542 | 560 |
543 // When the first 2 streams becomes draining, the two queued up stream could | 561 // When the first 2 streams becomes draining, the two queued up stream could |
544 // be created. But since one of them was marked cancelled due to RST frame, | 562 // be created. But since one of them was marked cancelled due to RST frame, |
545 // only one queued resource will be sent out. | 563 // only one queued resource will be sent out. |
546 QuicStreamId stream_not_reset = (kMaxStreamsForTest + 1) * 2; | 564 QuicStreamId stream_not_reset = (kMaxStreamsForTest + 1) * 2; |
547 InSequence s; | 565 InSequence s; |
548 EXPECT_CALL(*headers_stream_, WriteHeaders(stream_not_reset, _, false, | 566 EXPECT_CALL(*headers_stream_, WriteHeadersMock(stream_not_reset, _, false, |
549 kDefaultPriority, nullptr)); | 567 kDefaultPriority, nullptr)); |
550 EXPECT_CALL(*connection_, | 568 EXPECT_CALL(*connection_, |
551 SendStreamData(stream_not_reset, _, 0, false, nullptr)) | 569 SendStreamData(stream_not_reset, _, 0, false, nullptr)) |
552 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); | 570 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); |
553 EXPECT_CALL(*connection_, SendBlocked(stream_not_reset)); | 571 EXPECT_CALL(*connection_, SendBlocked(stream_not_reset)); |
554 EXPECT_CALL(*headers_stream_, WriteHeaders(stream_got_reset, _, false, | 572 EXPECT_CALL(*headers_stream_, WriteHeadersMock(stream_got_reset, _, false, |
555 kDefaultPriority, nullptr)) | 573 kDefaultPriority, nullptr)) |
556 .Times(0); | 574 .Times(0); |
557 | 575 |
558 session_->StreamDraining(2); | 576 session_->StreamDraining(2); |
559 session_->StreamDraining(4); | 577 session_->StreamDraining(4); |
560 } | 578 } |
561 | 579 |
562 TEST_P(QuicSimpleServerSessionServerPushTest, | 580 TEST_P(QuicSimpleServerSessionServerPushTest, |
563 CloseStreamToHandleMorePromisedStream) { | 581 CloseStreamToHandleMorePromisedStream) { |
564 // Tests that closing a open outgoing stream can trigger a promised resource | 582 // Tests that closing a open outgoing stream can trigger a promised resource |
565 // in the queue to be send out. | 583 // in the queue to be send out. |
566 size_t num_resources = kMaxStreamsForTest + 1; | 584 size_t num_resources = kMaxStreamsForTest + 1; |
567 PromisePushResources(num_resources); | 585 PromisePushResources(num_resources); |
568 QuicStreamId stream_to_open = num_resources * 2; | 586 QuicStreamId stream_to_open = num_resources * 2; |
569 | 587 |
570 // Resetting 1st open stream will close the stream and give space for extra | 588 // Resetting 1st open stream will close the stream and give space for extra |
571 // stream to be opened. | 589 // stream to be opened. |
572 QuicStreamId stream_got_reset = 2; | 590 QuicStreamId stream_got_reset = 2; |
573 EXPECT_CALL(*connection_, | 591 EXPECT_CALL(*connection_, |
574 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, _)); | 592 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, _)); |
575 EXPECT_CALL(*headers_stream_, WriteHeaders(stream_to_open, _, false, | 593 EXPECT_CALL(*headers_stream_, WriteHeadersMock(stream_to_open, _, false, |
576 kDefaultPriority, nullptr)); | 594 kDefaultPriority, nullptr)); |
577 EXPECT_CALL(*connection_, | 595 EXPECT_CALL(*connection_, |
578 SendStreamData(stream_to_open, _, 0, false, nullptr)) | 596 SendStreamData(stream_to_open, _, 0, false, nullptr)) |
579 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); | 597 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); |
580 | 598 |
581 EXPECT_CALL(*connection_, SendBlocked(stream_to_open)); | 599 EXPECT_CALL(*connection_, SendBlocked(stream_to_open)); |
582 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0); | 600 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0); |
583 visitor_->OnRstStream(rst); | 601 visitor_->OnRstStream(rst); |
584 } | 602 } |
585 | 603 |
586 } // namespace | 604 } // namespace |
587 } // namespace test | 605 } // namespace test |
588 } // namespace net | 606 } // namespace net |
OLD | NEW |