• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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