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_pinnable_buffer_piece.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_prefixed_buffer_reader.h"
12
13 namespace spdy {
14
15 namespace test {
16
17 class SpdyPinnableBufferPieceTest : public quiche::test::QuicheTest {
18 protected:
Build(const std::string & prefix,const std::string & suffix)19 SpdyPrefixedBufferReader Build(const std::string& prefix,
20 const std::string& suffix) {
21 prefix_ = prefix;
22 suffix_ = suffix;
23 return SpdyPrefixedBufferReader(prefix_.data(), prefix_.length(),
24 suffix_.data(), suffix_.length());
25 }
26 std::string prefix_, suffix_;
27 };
28
TEST_F(SpdyPinnableBufferPieceTest,Pin)29 TEST_F(SpdyPinnableBufferPieceTest, Pin) {
30 SpdyPrefixedBufferReader reader = Build("foobar", "");
31 SpdyPinnableBufferPiece piece;
32 EXPECT_TRUE(reader.ReadN(6, &piece));
33
34 // Piece points to underlying prefix storage.
35 EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
36 EXPECT_FALSE(piece.IsPinned());
37 EXPECT_EQ(prefix_.data(), piece.buffer());
38
39 piece.Pin();
40
41 // Piece now points to allocated storage.
42 EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
43 EXPECT_TRUE(piece.IsPinned());
44 EXPECT_NE(prefix_.data(), piece.buffer());
45
46 // Pinning again has no effect.
47 const char* buffer = piece.buffer();
48 piece.Pin();
49 EXPECT_EQ(buffer, piece.buffer());
50 }
51
TEST_F(SpdyPinnableBufferPieceTest,Swap)52 TEST_F(SpdyPinnableBufferPieceTest, Swap) {
53 SpdyPrefixedBufferReader reader = Build("foobar", "");
54 SpdyPinnableBufferPiece piece1, piece2;
55 EXPECT_TRUE(reader.ReadN(4, &piece1));
56 EXPECT_TRUE(reader.ReadN(2, &piece2));
57
58 piece1.Pin();
59
60 EXPECT_EQ(absl::string_view("foob"), absl::string_view(piece1));
61 EXPECT_TRUE(piece1.IsPinned());
62 EXPECT_EQ(absl::string_view("ar"), absl::string_view(piece2));
63 EXPECT_FALSE(piece2.IsPinned());
64
65 piece1.Swap(&piece2);
66
67 EXPECT_EQ(absl::string_view("ar"), absl::string_view(piece1));
68 EXPECT_FALSE(piece1.IsPinned());
69 EXPECT_EQ(absl::string_view("foob"), absl::string_view(piece2));
70 EXPECT_TRUE(piece2.IsPinned());
71
72 SpdyPinnableBufferPiece empty;
73 piece2.Swap(&empty);
74
75 EXPECT_EQ(absl::string_view(""), absl::string_view(piece2));
76 EXPECT_FALSE(piece2.IsPinned());
77 }
78
79 } // namespace test
80
81 } // namespace spdy
82