| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "spdy/core/spdy_pinnable_buffer_piece.h" | 
 |  | 
 | #include <string> | 
 |  | 
 | #include "common/platform/api/quiche_test.h" | 
 | #include "spdy/core/spdy_prefixed_buffer_reader.h" | 
 |  | 
 | namespace spdy { | 
 |  | 
 | namespace test { | 
 |  | 
 | class SpdyPinnableBufferPieceTest : public QuicheTest { | 
 |  protected: | 
 |   SpdyPrefixedBufferReader Build(const std::string& prefix, | 
 |                                  const std::string& suffix) { | 
 |     prefix_ = prefix; | 
 |     suffix_ = suffix; | 
 |     return SpdyPrefixedBufferReader(prefix_.data(), prefix_.length(), | 
 |                                     suffix_.data(), suffix_.length()); | 
 |   } | 
 |   std::string prefix_, suffix_; | 
 | }; | 
 |  | 
 | TEST_F(SpdyPinnableBufferPieceTest, Pin) { | 
 |   SpdyPrefixedBufferReader reader = Build("foobar", ""); | 
 |   SpdyPinnableBufferPiece piece; | 
 |   EXPECT_TRUE(reader.ReadN(6, &piece)); | 
 |  | 
 |   // Piece points to underlying prefix storage. | 
 |   EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece)); | 
 |   EXPECT_FALSE(piece.IsPinned()); | 
 |   EXPECT_EQ(prefix_.data(), piece.buffer()); | 
 |  | 
 |   piece.Pin(); | 
 |  | 
 |   // Piece now points to allocated storage. | 
 |   EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece)); | 
 |   EXPECT_TRUE(piece.IsPinned()); | 
 |   EXPECT_NE(prefix_.data(), piece.buffer()); | 
 |  | 
 |   // Pinning again has no effect. | 
 |   const char* buffer = piece.buffer(); | 
 |   piece.Pin(); | 
 |   EXPECT_EQ(buffer, piece.buffer()); | 
 | } | 
 |  | 
 | TEST_F(SpdyPinnableBufferPieceTest, Swap) { | 
 |   SpdyPrefixedBufferReader reader = Build("foobar", ""); | 
 |   SpdyPinnableBufferPiece piece1, piece2; | 
 |   EXPECT_TRUE(reader.ReadN(4, &piece1)); | 
 |   EXPECT_TRUE(reader.ReadN(2, &piece2)); | 
 |  | 
 |   piece1.Pin(); | 
 |  | 
 |   EXPECT_EQ(absl::string_view("foob"), absl::string_view(piece1)); | 
 |   EXPECT_TRUE(piece1.IsPinned()); | 
 |   EXPECT_EQ(absl::string_view("ar"), absl::string_view(piece2)); | 
 |   EXPECT_FALSE(piece2.IsPinned()); | 
 |  | 
 |   piece1.Swap(&piece2); | 
 |  | 
 |   EXPECT_EQ(absl::string_view("ar"), absl::string_view(piece1)); | 
 |   EXPECT_FALSE(piece1.IsPinned()); | 
 |   EXPECT_EQ(absl::string_view("foob"), absl::string_view(piece2)); | 
 |   EXPECT_TRUE(piece2.IsPinned()); | 
 |  | 
 |   SpdyPinnableBufferPiece empty; | 
 |   piece2.Swap(&empty); | 
 |  | 
 |   EXPECT_EQ(absl::string_view(""), absl::string_view(piece2)); | 
 |   EXPECT_FALSE(piece2.IsPinned()); | 
 | } | 
 |  | 
 | }  // namespace test | 
 |  | 
 | }  // namespace spdy |