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