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