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