Index: webrtc/base/buffer_unittest.cc |
diff --git a/webrtc/base/buffer_unittest.cc b/webrtc/base/buffer_unittest.cc |
index 0b93b9b56e8d54afdd4b5d89964023f75c0cbb5f..a1f97d71151e657ef063467e897dd621de2e2f6f 100644 |
--- a/webrtc/base/buffer_unittest.cc |
+++ b/webrtc/base/buffer_unittest.cc |
@@ -177,4 +177,108 @@ TEST(BufferTest, TestSwap) { |
EXPECT_EQ(buf2.data(), data1); |
} |
+void EnsureBuffersEqual(const Buffer& buf1, const Buffer& buf2) { |
+ // Data is shared between buffers. |
+ EXPECT_EQ(buf1.size(), buf2.size()); |
+ EXPECT_EQ(buf1.capacity(), buf2.capacity()); |
+ const uint8_t* data1 = buf1.data(); |
+ const uint8_t* data2 = buf2.data(); |
+ EXPECT_EQ(data1, data2); |
+ EXPECT_EQ(buf1, buf2); |
+} |
+ |
+// Move comparison to own function to have const buffers and prevent cloning |
+// from calling non-const "data()". |
+void EnsureBufferDataNotEqual(const Buffer& buf1, const Buffer& buf2) { |
+ // Data is not shared between buffers. |
+ const uint8_t* data1 = buf1.data(); |
+ const uint8_t* data2 = buf2.data(); |
+ EXPECT_NE(data1, data2); |
+} |
+ |
+TEST(BufferTest, TestSharedAppendData) { |
+ Buffer buf1(kTestData, 3, 10); |
+ Buffer buf2(buf1); |
+ |
+ EnsureBuffersEqual(buf1, buf2); |
+ |
+ // AppendData copies the underlying buffer. |
+ buf2.AppendData("foo"); |
+ EXPECT_EQ(buf2.size(), buf1.size() + 4); // "foo" + trailing 0x00 |
+ EXPECT_EQ(buf2.capacity(), buf1.capacity()); |
+ EXPECT_NE(buf2.data(), buf1.data()); |
+ |
+ EXPECT_EQ(buf1, Buffer(kTestData, 3)); |
+ const int8_t exp[] = {0x0, 0x1, 0x2, 'f', 'o', 'o', 0x0}; |
+ EXPECT_EQ(buf2, Buffer(exp)); |
+} |
+ |
+TEST(BufferTest, TestSharedSetData) { |
+ Buffer buf1(kTestData, 3, 10); |
+ Buffer buf2; |
+ |
+ buf2.SetData(buf1); |
+ // buf2 shares the same data as buf1 now. |
+ EnsureBuffersEqual(buf1, buf2); |
+ |
+ Buffer buf3(buf1); |
+ // buf3 is re-allocated with new data, existing buffers are not modified. |
+ buf3.SetData("foo"); |
+ EXPECT_EQ(buf1, Buffer(kTestData, 3)); |
+ EnsureBuffersEqual(buf1, buf2); |
+ EnsureBufferDataNotEqual(buf1, buf3); |
+ const int8_t exp[] = {'f', 'o', 'o', 0x0}; |
+ EXPECT_EQ(buf3, Buffer(exp)); |
+} |
+ |
+TEST(BufferTest, TestSharedEnsureCapacity) { |
+ Buffer buf1(kTestData, 3, 10); |
+ Buffer buf2(buf1); |
+ |
+ // Smaller than existing capacity -> no change and still same contents. |
+ buf2.EnsureCapacity(8); |
+ EnsureBuffersEqual(buf1, buf2); |
+ EXPECT_EQ(buf1.size(), 3u); |
+ EXPECT_EQ(buf1.capacity(), 10u); |
+ EXPECT_EQ(buf2.size(), 3u); |
+ EXPECT_EQ(buf2.capacity(), 10u); |
+ |
+ // Lager than existing capacity -> data is cloned. |
+ buf2.EnsureCapacity(16); |
+ EnsureBufferDataNotEqual(buf1, buf2); |
+ EXPECT_EQ(buf1.size(), 3u); |
+ EXPECT_EQ(buf1.capacity(), 10u); |
+ EXPECT_EQ(buf2.size(), 3u); |
+ EXPECT_EQ(buf2.capacity(), 16u); |
+ // The size and contents are still the same. |
+ EXPECT_EQ(buf1, buf2); |
+} |
+ |
+TEST(BufferTest, TestSharedSetSize) { |
+ Buffer buf1(kTestData, 3, 10); |
+ Buffer buf2(buf1); |
+ |
+ buf2.SetSize(16); |
+ EnsureBufferDataNotEqual(buf1, buf2); |
+ EXPECT_EQ(buf1.size(), 3u); |
+ EXPECT_EQ(buf1.capacity(), 10u); |
+ EXPECT_EQ(buf2.size(), 16u); |
+ EXPECT_EQ(buf2.capacity(), 16u); |
+ // The contents got cloned. |
+ EXPECT_EQ(0, memcmp(buf2.data(), kTestData, 3)); |
+} |
+ |
+TEST(BufferTest, TestSharedClear) { |
+ Buffer buf1(kTestData, 3, 10); |
+ Buffer buf2(buf1); |
+ |
+ buf2.Clear(); |
+ EnsureBufferDataNotEqual(buf1, buf2); |
+ EXPECT_EQ(buf1.size(), 3u); |
+ EXPECT_EQ(buf1.capacity(), 10u); |
+ EXPECT_EQ(0, memcmp(buf1.data(), kTestData, 3)); |
+ EXPECT_EQ(buf2.size(), 0u); |
+ EXPECT_EQ(buf2.capacity(), 0u); |
+} |
+ |
} // namespace rtc |