1 // Copyright 2014 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/spdy/core/spdy_prefixed_buffer_reader.h"
6
7 #include <string>
8
9 #include "absl/strings/string_view.h"
10 #include "quiche/common/platform/api/quiche_test.h"
11 #include "quiche/spdy/core/spdy_pinnable_buffer_piece.h"
12
13 namespace spdy {
14
15 namespace test {
16
17 using testing::ElementsAreArray;
18
19 class SpdyPrefixedBufferReaderTest : public quiche::test::QuicheTest {
20 protected:
Build(const std::string & prefix,const std::string & suffix)21 SpdyPrefixedBufferReader Build(const std::string& prefix,
22 const std::string& suffix) {
23 prefix_ = prefix;
24 suffix_ = suffix;
25 return SpdyPrefixedBufferReader(prefix_.data(), prefix_.length(),
26 suffix_.data(), suffix_.length());
27 }
28 std::string prefix_, suffix_;
29 };
30
TEST_F(SpdyPrefixedBufferReaderTest,ReadRawFromPrefix)31 TEST_F(SpdyPrefixedBufferReaderTest, ReadRawFromPrefix) {
32 SpdyPrefixedBufferReader reader = Build("foobar", "");
33 EXPECT_EQ(6u, reader.Available());
34
35 char buffer[] = "123456";
36 EXPECT_FALSE(reader.ReadN(10, buffer)); // Not enough buffer.
37 EXPECT_TRUE(reader.ReadN(6, buffer));
38 EXPECT_THAT(buffer, ElementsAreArray("foobar"));
39 EXPECT_EQ(0u, reader.Available());
40 }
41
TEST_F(SpdyPrefixedBufferReaderTest,ReadPieceFromPrefix)42 TEST_F(SpdyPrefixedBufferReaderTest, ReadPieceFromPrefix) {
43 SpdyPrefixedBufferReader reader = Build("foobar", "");
44 EXPECT_EQ(6u, reader.Available());
45
46 SpdyPinnableBufferPiece piece;
47 EXPECT_FALSE(reader.ReadN(10, &piece)); // Not enough buffer.
48 EXPECT_TRUE(reader.ReadN(6, &piece));
49 EXPECT_FALSE(piece.IsPinned());
50 EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
51 EXPECT_EQ(0u, reader.Available());
52 }
53
TEST_F(SpdyPrefixedBufferReaderTest,ReadRawFromSuffix)54 TEST_F(SpdyPrefixedBufferReaderTest, ReadRawFromSuffix) {
55 SpdyPrefixedBufferReader reader = Build("", "foobar");
56 EXPECT_EQ(6u, reader.Available());
57
58 char buffer[] = "123456";
59 EXPECT_FALSE(reader.ReadN(10, buffer)); // Not enough buffer.
60 EXPECT_TRUE(reader.ReadN(6, buffer));
61 EXPECT_THAT(buffer, ElementsAreArray("foobar"));
62 EXPECT_EQ(0u, reader.Available());
63 }
64
TEST_F(SpdyPrefixedBufferReaderTest,ReadPieceFromSuffix)65 TEST_F(SpdyPrefixedBufferReaderTest, ReadPieceFromSuffix) {
66 SpdyPrefixedBufferReader reader = Build("", "foobar");
67 EXPECT_EQ(6u, reader.Available());
68
69 SpdyPinnableBufferPiece piece;
70 EXPECT_FALSE(reader.ReadN(10, &piece)); // Not enough buffer.
71 EXPECT_TRUE(reader.ReadN(6, &piece));
72 EXPECT_FALSE(piece.IsPinned());
73 EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
74 EXPECT_EQ(0u, reader.Available());
75 }
76
TEST_F(SpdyPrefixedBufferReaderTest,ReadRawSpanning)77 TEST_F(SpdyPrefixedBufferReaderTest, ReadRawSpanning) {
78 SpdyPrefixedBufferReader reader = Build("foob", "ar");
79 EXPECT_EQ(6u, reader.Available());
80
81 char buffer[] = "123456";
82 EXPECT_FALSE(reader.ReadN(10, buffer)); // Not enough buffer.
83 EXPECT_TRUE(reader.ReadN(6, buffer));
84 EXPECT_THAT(buffer, ElementsAreArray("foobar"));
85 EXPECT_EQ(0u, reader.Available());
86 }
87
TEST_F(SpdyPrefixedBufferReaderTest,ReadPieceSpanning)88 TEST_F(SpdyPrefixedBufferReaderTest, ReadPieceSpanning) {
89 SpdyPrefixedBufferReader reader = Build("foob", "ar");
90 EXPECT_EQ(6u, reader.Available());
91
92 SpdyPinnableBufferPiece piece;
93 EXPECT_FALSE(reader.ReadN(10, &piece)); // Not enough buffer.
94 EXPECT_TRUE(reader.ReadN(6, &piece));
95 EXPECT_TRUE(piece.IsPinned());
96 EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
97 EXPECT_EQ(0u, reader.Available());
98 }
99
TEST_F(SpdyPrefixedBufferReaderTest,ReadMixed)100 TEST_F(SpdyPrefixedBufferReaderTest, ReadMixed) {
101 SpdyPrefixedBufferReader reader = Build("abcdef", "hijkl");
102 EXPECT_EQ(11u, reader.Available());
103
104 char buffer[] = "1234";
105 SpdyPinnableBufferPiece piece;
106
107 EXPECT_TRUE(reader.ReadN(3, buffer));
108 EXPECT_THAT(buffer, ElementsAreArray("abc4"));
109 EXPECT_EQ(8u, reader.Available());
110
111 EXPECT_TRUE(reader.ReadN(2, buffer));
112 EXPECT_THAT(buffer, ElementsAreArray("dec4"));
113 EXPECT_EQ(6u, reader.Available());
114
115 EXPECT_TRUE(reader.ReadN(3, &piece));
116 EXPECT_EQ(absl::string_view("fhi"), absl::string_view(piece));
117 EXPECT_TRUE(piece.IsPinned());
118 EXPECT_EQ(3u, reader.Available());
119
120 EXPECT_TRUE(reader.ReadN(2, &piece));
121 EXPECT_EQ(absl::string_view("jk"), absl::string_view(piece));
122 EXPECT_FALSE(piece.IsPinned());
123 EXPECT_EQ(1u, reader.Available());
124
125 EXPECT_TRUE(reader.ReadN(1, buffer));
126 EXPECT_THAT(buffer, ElementsAreArray("lec4"));
127 EXPECT_EQ(0u, reader.Available());
128 }
129
130 } // namespace test
131
132 } // namespace spdy
133