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_sender.h"
6 
7 #include <string>
8 
9 #include "absl/strings/escaping.h"
10 #include "quiche/quic/platform/api/quic_test.h"
11 #include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
12 
13 using ::testing::Eq;
14 using ::testing::StrictMock;
15 
16 namespace quic {
17 namespace test {
18 namespace {
19 
20 class QpackDecoderStreamSenderTest : public QuicTest {
21  protected:
QpackDecoderStreamSenderTest()22   QpackDecoderStreamSenderTest() {
23     stream_.set_qpack_stream_sender_delegate(&delegate_);
24   }
25   ~QpackDecoderStreamSenderTest() override = default;
26 
27   StrictMock<MockQpackStreamSenderDelegate> delegate_;
28   QpackDecoderStreamSender stream_;
29 };
30 
TEST_F(QpackDecoderStreamSenderTest,InsertCountIncrement)31 TEST_F(QpackDecoderStreamSenderTest, InsertCountIncrement) {
32   std::string stream_data;
33   ASSERT_TRUE(absl::HexStringToBytes("00", &stream_data));
34   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
35   stream_.SendInsertCountIncrement(0);
36   stream_.Flush();
37 
38   ASSERT_TRUE(absl::HexStringToBytes("0a", &stream_data));
39   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
40   stream_.SendInsertCountIncrement(10);
41   stream_.Flush();
42 
43   ASSERT_TRUE(absl::HexStringToBytes("3f00", &stream_data));
44   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
45   stream_.SendInsertCountIncrement(63);
46   stream_.Flush();
47 
48   ASSERT_TRUE(absl::HexStringToBytes("3f8901", &stream_data));
49   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
50   stream_.SendInsertCountIncrement(200);
51   stream_.Flush();
52 }
53 
TEST_F(QpackDecoderStreamSenderTest,HeaderAcknowledgement)54 TEST_F(QpackDecoderStreamSenderTest, HeaderAcknowledgement) {
55   std::string stream_data;
56   ASSERT_TRUE(absl::HexStringToBytes("80", &stream_data));
57   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
58   stream_.SendHeaderAcknowledgement(0);
59   stream_.Flush();
60 
61   ASSERT_TRUE(absl::HexStringToBytes("a5", &stream_data));
62   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
63   stream_.SendHeaderAcknowledgement(37);
64   stream_.Flush();
65 
66   ASSERT_TRUE(absl::HexStringToBytes("ff00", &stream_data));
67   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
68   stream_.SendHeaderAcknowledgement(127);
69   stream_.Flush();
70 
71   ASSERT_TRUE(absl::HexStringToBytes("fff802", &stream_data));
72   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
73   stream_.SendHeaderAcknowledgement(503);
74   stream_.Flush();
75 }
76 
TEST_F(QpackDecoderStreamSenderTest,StreamCancellation)77 TEST_F(QpackDecoderStreamSenderTest, StreamCancellation) {
78   std::string stream_data;
79   ASSERT_TRUE(absl::HexStringToBytes("40", &stream_data));
80   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
81   stream_.SendStreamCancellation(0);
82   stream_.Flush();
83 
84   ASSERT_TRUE(absl::HexStringToBytes("53", &stream_data));
85   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
86   stream_.SendStreamCancellation(19);
87   stream_.Flush();
88 
89   ASSERT_TRUE(absl::HexStringToBytes("7f00", &stream_data));
90   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
91   stream_.SendStreamCancellation(63);
92   stream_.Flush();
93 
94   ASSERT_TRUE(absl::HexStringToBytes("7f2f", &stream_data));
95   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
96   stream_.SendStreamCancellation(110);
97   stream_.Flush();
98 }
99 
TEST_F(QpackDecoderStreamSenderTest,Coalesce)100 TEST_F(QpackDecoderStreamSenderTest, Coalesce) {
101   std::string stream_data;
102   stream_.SendInsertCountIncrement(10);
103   stream_.SendHeaderAcknowledgement(37);
104   stream_.SendStreamCancellation(0);
105 
106   ASSERT_TRUE(absl::HexStringToBytes("0aa540", &stream_data));
107   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
108   stream_.Flush();
109 
110   stream_.SendInsertCountIncrement(63);
111   stream_.SendStreamCancellation(110);
112 
113   ASSERT_TRUE(absl::HexStringToBytes("3f007f2f", &stream_data));
114   EXPECT_CALL(delegate_, WriteStreamData(Eq(stream_data)));
115   stream_.Flush();
116 }
117 
118 }  // namespace
119 }  // namespace test
120 }  // namespace quic
121