renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 1 | // Copyright 2019 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "net/third_party/quiche/src/quic/core/qpack/qpack_send_stream.h" |
| 6 | |
bnc | 3fc60df | 2019-07-17 11:55:10 -0700 | [diff] [blame] | 7 | #include "net/third_party/quiche/src/quic/core/http/http_constants.h" |
bnc | 8464f31 | 2019-06-21 11:43:07 -0700 | [diff] [blame] | 8 | #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" |
renjietang | bb2e22a | 2019-09-12 15:46:39 -0700 | [diff] [blame] | 9 | #include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h" |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 10 | #include "net/third_party/quiche/src/quic/test_tools/quic_spdy_session_peer.h" |
| 11 | #include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h" |
| 12 | |
| 13 | namespace quic { |
| 14 | namespace test { |
| 15 | |
| 16 | namespace { |
| 17 | using ::testing::_; |
| 18 | using ::testing::Invoke; |
| 19 | using ::testing::StrictMock; |
| 20 | |
| 21 | struct TestParams { |
| 22 | TestParams(const ParsedQuicVersion& version, Perspective perspective) |
| 23 | : version(version), perspective(perspective) { |
| 24 | QUIC_LOG(INFO) << "TestParams: version: " |
| 25 | << ParsedQuicVersionToString(version) |
| 26 | << ", perspective: " << perspective; |
| 27 | } |
| 28 | |
| 29 | TestParams(const TestParams& other) |
| 30 | : version(other.version), perspective(other.perspective) {} |
| 31 | |
| 32 | ParsedQuicVersion version; |
| 33 | Perspective perspective; |
| 34 | }; |
| 35 | |
dschinazi | 88bd5b0 | 2019-10-10 00:52:20 -0700 | [diff] [blame] | 36 | // Used by ::testing::PrintToStringParamName(). |
| 37 | std::string PrintToString(const TestParams& tp) { |
| 38 | return QuicStrCat( |
| 39 | ParsedQuicVersionToString(tp.version), "_", |
| 40 | (tp.perspective == Perspective::IS_CLIENT ? "client" : "server")); |
| 41 | } |
| 42 | |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 43 | std::vector<TestParams> GetTestParams() { |
| 44 | std::vector<TestParams> params; |
| 45 | ParsedQuicVersionVector all_supported_versions = AllSupportedVersions(); |
| 46 | for (const auto& version : AllSupportedVersions()) { |
renjietang | a29a96a | 2019-10-10 12:47:50 -0700 | [diff] [blame] | 47 | if (!VersionUsesHttp3(version.transport_version)) { |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 48 | continue; |
| 49 | } |
| 50 | for (Perspective p : {Perspective::IS_SERVER, Perspective::IS_CLIENT}) { |
| 51 | params.emplace_back(version, p); |
| 52 | } |
| 53 | } |
| 54 | return params; |
| 55 | } |
| 56 | |
| 57 | class QpackSendStreamTest : public QuicTestWithParam<TestParams> { |
| 58 | public: |
| 59 | QpackSendStreamTest() |
| 60 | : connection_(new StrictMock<MockQuicConnection>( |
| 61 | &helper_, |
| 62 | &alarm_factory_, |
| 63 | perspective(), |
| 64 | SupportedVersions(GetParam().version))), |
| 65 | session_(connection_) { |
| 66 | session_.Initialize(); |
renjietang | bb2e22a | 2019-09-12 15:46:39 -0700 | [diff] [blame] | 67 | QuicConfigPeer::SetReceivedInitialSessionFlowControlWindow( |
| 68 | session_.config(), kMinimumFlowControlSendWindow); |
dschinazi | 18cdf13 | 2019-10-09 16:08:18 -0700 | [diff] [blame] | 69 | QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesUnidirectional( |
| 70 | session_.config(), kMinimumFlowControlSendWindow); |
renjietang | bb2e22a | 2019-09-12 15:46:39 -0700 | [diff] [blame] | 71 | QuicConfigPeer::SetReceivedMaxIncomingUnidirectionalStreams( |
| 72 | session_.config(), 3); |
| 73 | session_.OnConfigNegotiated(); |
renjietang | 77dd824 | 2019-08-09 13:00:42 -0700 | [diff] [blame] | 74 | |
renjietang | 578cf9f | 2019-08-23 11:57:52 -0700 | [diff] [blame] | 75 | qpack_send_stream_ = |
| 76 | QuicSpdySessionPeer::GetQpackDecoderSendStream(&session_); |
renjietang | 77dd824 | 2019-08-09 13:00:42 -0700 | [diff] [blame] | 77 | |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 78 | ON_CALL(session_, WritevData(_, _, _, _, _)) |
| 79 | .WillByDefault(Invoke(MockQuicSession::ConsumeData)); |
| 80 | } |
| 81 | |
| 82 | Perspective perspective() const { return GetParam().perspective; } |
| 83 | |
| 84 | MockQuicConnectionHelper helper_; |
| 85 | MockAlarmFactory alarm_factory_; |
| 86 | StrictMock<MockQuicConnection>* connection_; |
| 87 | StrictMock<MockQuicSpdySession> session_; |
renjietang | 77dd824 | 2019-08-09 13:00:42 -0700 | [diff] [blame] | 88 | QpackSendStream* qpack_send_stream_; |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 89 | }; |
| 90 | |
| 91 | INSTANTIATE_TEST_SUITE_P(Tests, |
| 92 | QpackSendStreamTest, |
dschinazi | 88bd5b0 | 2019-10-10 00:52:20 -0700 | [diff] [blame] | 93 | ::testing::ValuesIn(GetTestParams()), |
| 94 | ::testing::PrintToStringParamName()); |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 95 | |
| 96 | TEST_P(QpackSendStreamTest, WriteStreamTypeOnlyFirstTime) { |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 97 | std::string data = "data"; |
| 98 | EXPECT_CALL(session_, WritevData(_, _, 1, _, _)); |
| 99 | EXPECT_CALL(session_, WritevData(_, _, data.length(), _, _)); |
| 100 | qpack_send_stream_->WriteStreamData(QuicStringPiece(data)); |
| 101 | |
| 102 | EXPECT_CALL(session_, WritevData(_, _, data.length(), _, _)); |
| 103 | qpack_send_stream_->WriteStreamData(QuicStringPiece(data)); |
renjietang | d6f5afa | 2019-08-19 11:27:55 -0700 | [diff] [blame] | 104 | EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(0); |
renjietang | c8c02a5 | 2019-08-22 10:38:37 -0700 | [diff] [blame] | 105 | qpack_send_stream_->MaybeSendStreamType(); |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | TEST_P(QpackSendStreamTest, ResetQpackStream) { |
| 109 | QuicRstStreamFrame rst_frame(kInvalidControlFrameId, qpack_send_stream_->id(), |
| 110 | QUIC_STREAM_CANCELLED, 1234); |
| 111 | EXPECT_CALL(*connection_, CloseConnection(QUIC_INVALID_STREAM_ID, _, _)); |
| 112 | qpack_send_stream_->OnStreamReset(rst_frame); |
| 113 | } |
| 114 | |
| 115 | TEST_P(QpackSendStreamTest, ReceiveDataOnSendStream) { |
| 116 | QuicStreamFrame frame(qpack_send_stream_->id(), false, 0, "test"); |
| 117 | EXPECT_CALL( |
| 118 | *connection_, |
| 119 | CloseConnection(QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM, _, _)); |
| 120 | qpack_send_stream_->OnStreamFrame(frame); |
| 121 | } |
| 122 | |
| 123 | } // namespace |
| 124 | } // namespace test |
| 125 | } // namespace quic |