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 "quiche/quic/core/qpack/qpack_receive_stream.h"
6
7 #include "absl/strings/string_view.h"
8 #include "quiche/quic/core/quic_utils.h"
9 #include "quiche/quic/platform/api/quic_test.h"
10 #include "quiche/quic/test_tools/quic_spdy_session_peer.h"
11 #include "quiche/quic/test_tools/quic_test_utils.h"
12
13 namespace quic {
14 namespace test {
15
16 namespace {
17 using ::testing::_;
18 using ::testing::AnyNumber;
19 using ::testing::StrictMock;
20
21 struct TestParams {
TestParamsquic::test::__anon78834b0b0111::TestParams22 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
TestParamsquic::test::__anon78834b0b0111::TestParams29 TestParams(const TestParams& other)
30 : version(other.version), perspective(other.perspective) {}
31
32 ParsedQuicVersion version;
33 Perspective perspective;
34 };
35
GetTestParams()36 std::vector<TestParams> GetTestParams() {
37 std::vector<TestParams> params;
38 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
39 for (const auto& version : AllSupportedVersions()) {
40 if (!VersionUsesHttp3(version.transport_version)) {
41 continue;
42 }
43 for (Perspective p : {Perspective::IS_SERVER, Perspective::IS_CLIENT}) {
44 params.emplace_back(version, p);
45 }
46 }
47 return params;
48 }
49
50 class QpackReceiveStreamTest : public QuicTestWithParam<TestParams> {
51 public:
QpackReceiveStreamTest()52 QpackReceiveStreamTest()
53 : connection_(new StrictMock<MockQuicConnection>(
54 &helper_, &alarm_factory_, perspective(),
55 SupportedVersions(GetParam().version))),
56 session_(connection_) {
57 EXPECT_CALL(session_, OnCongestionWindowChange(_)).Times(AnyNumber());
58 session_.Initialize();
59 EXPECT_CALL(
60 static_cast<const MockQuicCryptoStream&>(*session_.GetCryptoStream()),
61 encryption_established())
62 .WillRepeatedly(testing::Return(true));
63 QuicStreamId id = perspective() == Perspective::IS_SERVER
64 ? GetNthClientInitiatedUnidirectionalStreamId(
65 session_.transport_version(), 3)
66 : GetNthServerInitiatedUnidirectionalStreamId(
67 session_.transport_version(), 3);
68 char type[] = {0x03};
69 QuicStreamFrame data1(id, false, 0, absl::string_view(type, 1));
70 session_.OnStreamFrame(data1);
71 qpack_receive_stream_ =
72 QuicSpdySessionPeer::GetQpackDecoderReceiveStream(&session_);
73 }
74
perspective() const75 Perspective perspective() const { return GetParam().perspective; }
76
77 MockQuicConnectionHelper helper_;
78 MockAlarmFactory alarm_factory_;
79 StrictMock<MockQuicConnection>* connection_;
80 StrictMock<MockQuicSpdySession> session_;
81 QpackReceiveStream* qpack_receive_stream_;
82 };
83
84 INSTANTIATE_TEST_SUITE_P(Tests, QpackReceiveStreamTest,
85 ::testing::ValuesIn(GetTestParams()));
86
TEST_P(QpackReceiveStreamTest,ResetQpackReceiveStream)87 TEST_P(QpackReceiveStreamTest, ResetQpackReceiveStream) {
88 EXPECT_TRUE(qpack_receive_stream_->is_static());
89 QuicRstStreamFrame rst_frame(kInvalidControlFrameId,
90 qpack_receive_stream_->id(),
91 QUIC_STREAM_CANCELLED, 1234);
92 EXPECT_CALL(*connection_,
93 CloseConnection(QUIC_HTTP_CLOSED_CRITICAL_STREAM, _, _));
94 qpack_receive_stream_->OnStreamReset(rst_frame);
95 }
96
97 } // namespace
98 } // namespace test
99 } // namespace quic
100