blob: cd6d15e7555ad56dbf74e1902d27e91e2f92b5c0 [file] [log] [blame]
QUICHE team82dee2f2019-01-18 12:35:12 -05001// 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
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "spdy/core/spdy_prefixed_buffer_reader.h"
QUICHE team82dee2f2019-01-18 12:35:12 -05006
bnc44712912019-08-15 18:58:14 -07007#include <string>
8
vasilvvc8ccdb22020-10-12 16:42:34 -07009#include "absl/strings/string_view.h"
QUICHE team5be974e2020-12-29 18:35:24 -050010#include "common/platform/api/quiche_test.h"
QUICHE team82dee2f2019-01-18 12:35:12 -050011
12namespace spdy {
13
14namespace test {
15
16using testing::ElementsAreArray;
17
QUICHE teamf3c80c92020-02-12 09:47:55 -080018class SpdyPrefixedBufferReaderTest : public QuicheTest {
QUICHE team82dee2f2019-01-18 12:35:12 -050019 protected:
bnc44712912019-08-15 18:58:14 -070020 SpdyPrefixedBufferReader Build(const std::string& prefix,
21 const std::string& suffix) {
QUICHE team82dee2f2019-01-18 12:35:12 -050022 prefix_ = prefix;
23 suffix_ = suffix;
24 return SpdyPrefixedBufferReader(prefix_.data(), prefix_.length(),
25 suffix_.data(), suffix_.length());
26 }
bnc44712912019-08-15 18:58:14 -070027 std::string prefix_, suffix_;
QUICHE team82dee2f2019-01-18 12:35:12 -050028};
29
30TEST_F(SpdyPrefixedBufferReaderTest, ReadRawFromPrefix) {
31 SpdyPrefixedBufferReader reader = Build("foobar", "");
32 EXPECT_EQ(6u, reader.Available());
33
34 char buffer[] = "123456";
35 EXPECT_FALSE(reader.ReadN(10, buffer)); // Not enough buffer.
36 EXPECT_TRUE(reader.ReadN(6, buffer));
37 EXPECT_THAT(buffer, ElementsAreArray("foobar"));
38 EXPECT_EQ(0u, reader.Available());
39}
40
41TEST_F(SpdyPrefixedBufferReaderTest, ReadPieceFromPrefix) {
42 SpdyPrefixedBufferReader reader = Build("foobar", "");
43 EXPECT_EQ(6u, reader.Available());
44
45 SpdyPinnableBufferPiece piece;
46 EXPECT_FALSE(reader.ReadN(10, &piece)); // Not enough buffer.
47 EXPECT_TRUE(reader.ReadN(6, &piece));
48 EXPECT_FALSE(piece.IsPinned());
vasilvvc8ccdb22020-10-12 16:42:34 -070049 EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
QUICHE team82dee2f2019-01-18 12:35:12 -050050 EXPECT_EQ(0u, reader.Available());
51}
52
53TEST_F(SpdyPrefixedBufferReaderTest, ReadRawFromSuffix) {
54 SpdyPrefixedBufferReader reader = Build("", "foobar");
55 EXPECT_EQ(6u, reader.Available());
56
57 char buffer[] = "123456";
58 EXPECT_FALSE(reader.ReadN(10, buffer)); // Not enough buffer.
59 EXPECT_TRUE(reader.ReadN(6, buffer));
60 EXPECT_THAT(buffer, ElementsAreArray("foobar"));
61 EXPECT_EQ(0u, reader.Available());
62}
63
64TEST_F(SpdyPrefixedBufferReaderTest, ReadPieceFromSuffix) {
65 SpdyPrefixedBufferReader reader = Build("", "foobar");
66 EXPECT_EQ(6u, reader.Available());
67
68 SpdyPinnableBufferPiece piece;
69 EXPECT_FALSE(reader.ReadN(10, &piece)); // Not enough buffer.
70 EXPECT_TRUE(reader.ReadN(6, &piece));
71 EXPECT_FALSE(piece.IsPinned());
vasilvvc8ccdb22020-10-12 16:42:34 -070072 EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
QUICHE team82dee2f2019-01-18 12:35:12 -050073 EXPECT_EQ(0u, reader.Available());
74}
75
76TEST_F(SpdyPrefixedBufferReaderTest, ReadRawSpanning) {
77 SpdyPrefixedBufferReader reader = Build("foob", "ar");
78 EXPECT_EQ(6u, reader.Available());
79
80 char buffer[] = "123456";
81 EXPECT_FALSE(reader.ReadN(10, buffer)); // Not enough buffer.
82 EXPECT_TRUE(reader.ReadN(6, buffer));
83 EXPECT_THAT(buffer, ElementsAreArray("foobar"));
84 EXPECT_EQ(0u, reader.Available());
85}
86
87TEST_F(SpdyPrefixedBufferReaderTest, ReadPieceSpanning) {
88 SpdyPrefixedBufferReader reader = Build("foob", "ar");
89 EXPECT_EQ(6u, reader.Available());
90
91 SpdyPinnableBufferPiece piece;
92 EXPECT_FALSE(reader.ReadN(10, &piece)); // Not enough buffer.
93 EXPECT_TRUE(reader.ReadN(6, &piece));
94 EXPECT_TRUE(piece.IsPinned());
vasilvvc8ccdb22020-10-12 16:42:34 -070095 EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
QUICHE team82dee2f2019-01-18 12:35:12 -050096 EXPECT_EQ(0u, reader.Available());
97}
98
99TEST_F(SpdyPrefixedBufferReaderTest, ReadMixed) {
100 SpdyPrefixedBufferReader reader = Build("abcdef", "hijkl");
101 EXPECT_EQ(11u, reader.Available());
102
103 char buffer[] = "1234";
104 SpdyPinnableBufferPiece piece;
105
106 EXPECT_TRUE(reader.ReadN(3, buffer));
107 EXPECT_THAT(buffer, ElementsAreArray("abc4"));
108 EXPECT_EQ(8u, reader.Available());
109
110 EXPECT_TRUE(reader.ReadN(2, buffer));
111 EXPECT_THAT(buffer, ElementsAreArray("dec4"));
112 EXPECT_EQ(6u, reader.Available());
113
114 EXPECT_TRUE(reader.ReadN(3, &piece));
vasilvvc8ccdb22020-10-12 16:42:34 -0700115 EXPECT_EQ(absl::string_view("fhi"), absl::string_view(piece));
QUICHE team82dee2f2019-01-18 12:35:12 -0500116 EXPECT_TRUE(piece.IsPinned());
117 EXPECT_EQ(3u, reader.Available());
118
119 EXPECT_TRUE(reader.ReadN(2, &piece));
vasilvvc8ccdb22020-10-12 16:42:34 -0700120 EXPECT_EQ(absl::string_view("jk"), absl::string_view(piece));
QUICHE team82dee2f2019-01-18 12:35:12 -0500121 EXPECT_FALSE(piece.IsPinned());
122 EXPECT_EQ(1u, reader.Available());
123
124 EXPECT_TRUE(reader.ReadN(1, buffer));
125 EXPECT_THAT(buffer, ElementsAreArray("lec4"));
126 EXPECT_EQ(0u, reader.Available());
127}
128
129} // namespace test
130
131} // namespace spdy