1 // Copyright (c) 2018 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_decoder_stream_receiver.h"
6
7 #include "absl/strings/escaping.h"
8 #include "absl/strings/string_view.h"
9 #include "quiche/quic/platform/api/quic_test.h"
10
11 using testing::Eq;
12 using testing::StrictMock;
13
14 namespace quic {
15 namespace test {
16 namespace {
17
18 class MockDelegate : public QpackDecoderStreamReceiver::Delegate {
19 public:
20 ~MockDelegate() override = default;
21
22 MOCK_METHOD(void, OnInsertCountIncrement, (uint64_t increment), (override));
23 MOCK_METHOD(void, OnHeaderAcknowledgement, (QuicStreamId stream_id),
24 (override));
25 MOCK_METHOD(void, OnStreamCancellation, (QuicStreamId stream_id), (override));
26 MOCK_METHOD(void, OnErrorDetected,
27 (QuicErrorCode error_code, absl::string_view error_message),
28 (override));
29 };
30
31 class QpackDecoderStreamReceiverTest : public QuicTest {
32 protected:
QpackDecoderStreamReceiverTest()33 QpackDecoderStreamReceiverTest() : stream_(&delegate_) {}
34 ~QpackDecoderStreamReceiverTest() override = default;
35
36 QpackDecoderStreamReceiver stream_;
37 StrictMock<MockDelegate> delegate_;
38 };
39
TEST_F(QpackDecoderStreamReceiverTest,InsertCountIncrement)40 TEST_F(QpackDecoderStreamReceiverTest, InsertCountIncrement) {
41 EXPECT_CALL(delegate_, OnInsertCountIncrement(0));
42 stream_.Decode(absl::HexStringToBytes("00"));
43
44 EXPECT_CALL(delegate_, OnInsertCountIncrement(10));
45 stream_.Decode(absl::HexStringToBytes("0a"));
46
47 EXPECT_CALL(delegate_, OnInsertCountIncrement(63));
48 stream_.Decode(absl::HexStringToBytes("3f00"));
49
50 EXPECT_CALL(delegate_, OnInsertCountIncrement(200));
51 stream_.Decode(absl::HexStringToBytes("3f8901"));
52
53 EXPECT_CALL(delegate_,
54 OnErrorDetected(QUIC_QPACK_DECODER_STREAM_INTEGER_TOO_LARGE,
55 Eq("Encoded integer too large.")));
56 stream_.Decode(absl::HexStringToBytes("3fffffffffffffffffffff"));
57 }
58
TEST_F(QpackDecoderStreamReceiverTest,HeaderAcknowledgement)59 TEST_F(QpackDecoderStreamReceiverTest, HeaderAcknowledgement) {
60 EXPECT_CALL(delegate_, OnHeaderAcknowledgement(0));
61 stream_.Decode(absl::HexStringToBytes("80"));
62
63 EXPECT_CALL(delegate_, OnHeaderAcknowledgement(37));
64 stream_.Decode(absl::HexStringToBytes("a5"));
65
66 EXPECT_CALL(delegate_, OnHeaderAcknowledgement(127));
67 stream_.Decode(absl::HexStringToBytes("ff00"));
68
69 EXPECT_CALL(delegate_, OnHeaderAcknowledgement(503));
70 stream_.Decode(absl::HexStringToBytes("fff802"));
71
72 EXPECT_CALL(delegate_,
73 OnErrorDetected(QUIC_QPACK_DECODER_STREAM_INTEGER_TOO_LARGE,
74 Eq("Encoded integer too large.")));
75 stream_.Decode(absl::HexStringToBytes("ffffffffffffffffffffff"));
76 }
77
TEST_F(QpackDecoderStreamReceiverTest,StreamCancellation)78 TEST_F(QpackDecoderStreamReceiverTest, StreamCancellation) {
79 EXPECT_CALL(delegate_, OnStreamCancellation(0));
80 stream_.Decode(absl::HexStringToBytes("40"));
81
82 EXPECT_CALL(delegate_, OnStreamCancellation(19));
83 stream_.Decode(absl::HexStringToBytes("53"));
84
85 EXPECT_CALL(delegate_, OnStreamCancellation(63));
86 stream_.Decode(absl::HexStringToBytes("7f00"));
87
88 EXPECT_CALL(delegate_, OnStreamCancellation(110));
89 stream_.Decode(absl::HexStringToBytes("7f2f"));
90
91 EXPECT_CALL(delegate_,
92 OnErrorDetected(QUIC_QPACK_DECODER_STREAM_INTEGER_TOO_LARGE,
93 Eq("Encoded integer too large.")));
94 stream_.Decode(absl::HexStringToBytes("7fffffffffffffffffffff"));
95 }
96
97 } // namespace
98 } // namespace test
99 } // namespace quic
100