| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "quic/core/qpack/qpack_receive_stream.h" |
| |
| #include "absl/strings/string_view.h" |
| #include "quic/core/quic_utils.h" |
| #include "quic/platform/api/quic_test.h" |
| #include "quic/test_tools/quic_spdy_session_peer.h" |
| #include "quic/test_tools/quic_test_utils.h" |
| |
| namespace quic { |
| namespace test { |
| |
| namespace { |
| using ::testing::_; |
| using ::testing::AnyNumber; |
| using ::testing::StrictMock; |
| |
| struct TestParams { |
| TestParams(const ParsedQuicVersion& version, Perspective perspective) |
| : version(version), perspective(perspective) { |
| QUIC_LOG(INFO) << "TestParams: version: " |
| << ParsedQuicVersionToString(version) |
| << ", perspective: " << perspective; |
| } |
| |
| TestParams(const TestParams& other) |
| : version(other.version), perspective(other.perspective) {} |
| |
| ParsedQuicVersion version; |
| Perspective perspective; |
| }; |
| |
| std::vector<TestParams> GetTestParams() { |
| std::vector<TestParams> params; |
| ParsedQuicVersionVector all_supported_versions = AllSupportedVersions(); |
| for (const auto& version : AllSupportedVersions()) { |
| if (!VersionUsesHttp3(version.transport_version)) { |
| continue; |
| } |
| for (Perspective p : {Perspective::IS_SERVER, Perspective::IS_CLIENT}) { |
| params.emplace_back(version, p); |
| } |
| } |
| return params; |
| } |
| |
| class QpackReceiveStreamTest : public QuicTestWithParam<TestParams> { |
| public: |
| QpackReceiveStreamTest() |
| : connection_(new StrictMock<MockQuicConnection>( |
| &helper_, |
| &alarm_factory_, |
| perspective(), |
| SupportedVersions(GetParam().version))), |
| session_(connection_) { |
| EXPECT_CALL(session_, OnCongestionWindowChange(_)).Times(AnyNumber()); |
| session_.Initialize(); |
| QuicStreamId id = perspective() == Perspective::IS_SERVER |
| ? GetNthClientInitiatedUnidirectionalStreamId( |
| session_.transport_version(), 3) |
| : GetNthServerInitiatedUnidirectionalStreamId( |
| session_.transport_version(), 3); |
| char type[] = {0x03}; |
| QuicStreamFrame data1(id, false, 0, absl::string_view(type, 1)); |
| session_.OnStreamFrame(data1); |
| qpack_receive_stream_ = |
| QuicSpdySessionPeer::GetQpackDecoderReceiveStream(&session_); |
| } |
| |
| Perspective perspective() const { return GetParam().perspective; } |
| |
| MockQuicConnectionHelper helper_; |
| MockAlarmFactory alarm_factory_; |
| StrictMock<MockQuicConnection>* connection_; |
| StrictMock<MockQuicSpdySession> session_; |
| QpackReceiveStream* qpack_receive_stream_; |
| }; |
| |
| INSTANTIATE_TEST_SUITE_P(Tests, |
| QpackReceiveStreamTest, |
| ::testing::ValuesIn(GetTestParams())); |
| |
| TEST_P(QpackReceiveStreamTest, ResetQpackReceiveStream) { |
| EXPECT_TRUE(qpack_receive_stream_->is_static()); |
| QuicRstStreamFrame rst_frame(kInvalidControlFrameId, |
| qpack_receive_stream_->id(), |
| QUIC_STREAM_CANCELLED, 1234); |
| EXPECT_CALL(*connection_, |
| CloseConnection(QUIC_HTTP_CLOSED_CRITICAL_STREAM, _, _)); |
| qpack_receive_stream_->OnStreamReset(rst_frame); |
| } |
| |
| } // namespace |
| } // namespace test |
| } // namespace quic |