| // Copyright (c) 2012 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 "remoting/base/typed_buffer.h" |
| |
| #include <utility> |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace remoting { |
| |
| namespace { |
| |
| struct Data { |
| // A variable size vector. |
| int data[1]; |
| }; |
| |
| } // namespace |
| |
| // Check that the default constructor does not allocate the buffer. |
| TEST(TypedBufferTest, Empty) { |
| TypedBuffer<Data> buffer; |
| EXPECT_FALSE(buffer.get()); |
| EXPECT_FALSE(buffer); |
| EXPECT_EQ(buffer.length(), 0u); |
| } |
| |
| // Check that allocating zero-size structure does not allocate the buffer. |
| TEST(TypedBufferTest, ZeroSize) { |
| TypedBuffer<Data> buffer(0); |
| EXPECT_FALSE(buffer.get()); |
| EXPECT_FALSE(buffer); |
| EXPECT_EQ(buffer.length(), 0u); |
| } |
| |
| // Test creation of a buffer and verify that the buffer accessors work. |
| TEST(TypedBufferTest, Basic) { |
| TypedBuffer<Data> buffer(sizeof(int) * 10); |
| EXPECT_TRUE(buffer.get()); |
| EXPECT_TRUE(buffer); |
| EXPECT_EQ(buffer.length(), sizeof(int) * 10); |
| |
| // Make sure that operator*() syntax works. |
| (*buffer).data[9] = 0x12345678; |
| |
| // Make sure that operator->() syntax works. |
| EXPECT_EQ(buffer->data[9], 0x12345678); |
| } |
| |
| // Test passing ownership. |
| TEST(TypedBufferTest, Pass) { |
| TypedBuffer<Data> left; |
| TypedBuffer<Data> right(sizeof(int)); |
| |
| EXPECT_FALSE(left.get()); |
| EXPECT_EQ(left.length(), 0u); |
| EXPECT_TRUE(right.get()); |
| EXPECT_EQ(right.length(), sizeof(int)); |
| |
| Data* raw_ptr = right.get(); |
| left = std::move(right); |
| |
| // Verify that passing ownership transfers both the buffer pointer and its |
| // length. |
| EXPECT_EQ(left.get(), raw_ptr); |
| EXPECT_EQ(left.length(), sizeof(int)); |
| |
| // Verify that the original object was cleared. |
| EXPECT_FALSE(right.get()); |
| EXPECT_EQ(right.length(), 0u); |
| } |
| |
| // Test swapping ownership. |
| TEST(TypedBufferTest, Swap) { |
| TypedBuffer<Data> left(sizeof(int)); |
| TypedBuffer<Data> right(sizeof(int) * 2); |
| |
| EXPECT_TRUE(left.get()); |
| EXPECT_EQ(left.length(), sizeof(int)); |
| EXPECT_TRUE(right.get()); |
| EXPECT_EQ(right.length(), sizeof(int) * 2); |
| |
| Data* raw_left = left.get(); |
| Data* raw_right = right.get(); |
| left.Swap(right); |
| |
| // Verify that swapping simply exchange contents of two objects. |
| // length. |
| EXPECT_EQ(left.get(), raw_right); |
| EXPECT_EQ(left.length(), sizeof(int) * 2); |
| EXPECT_EQ(right.get(), raw_left); |
| EXPECT_EQ(right.length(), sizeof(int)); |
| } |
| |
| TEST(TypedBufferTest, GetAtOffset) { |
| TypedBuffer<Data> buffer(sizeof(int) * 10); |
| EXPECT_EQ(buffer.get(), buffer.GetAtOffset(0)); |
| EXPECT_EQ(reinterpret_cast<Data*>(&buffer->data[9]), |
| buffer.GetAtOffset(sizeof(int) * 9)); |
| } |
| |
| } // namespace remoting |