1/*
2 *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/base/buffer.h"
12#include "webrtc/base/gunit.h"
13
14namespace rtc {
15
16static const char kTestData[] = {
17  0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF
18};
19
20TEST(BufferTest, TestConstructDefault) {
21  Buffer buf;
22  EXPECT_EQ(0U, buf.length());
23  EXPECT_EQ(0U, buf.capacity());
24  EXPECT_EQ(Buffer(), buf);
25}
26
27TEST(BufferTest, TestConstructEmptyWithCapacity) {
28  Buffer buf(NULL, 0, 256U);
29  EXPECT_EQ(0U, buf.length());
30  EXPECT_EQ(256U, buf.capacity());
31  EXPECT_EQ(Buffer(), buf);
32}
33
34TEST(BufferTest, TestConstructData) {
35  Buffer buf(kTestData, sizeof(kTestData));
36  EXPECT_EQ(sizeof(kTestData), buf.length());
37  EXPECT_EQ(sizeof(kTestData), buf.capacity());
38  EXPECT_EQ(0, memcmp(buf.data(), kTestData, sizeof(kTestData)));
39  EXPECT_EQ(Buffer(kTestData, sizeof(kTestData)), buf);
40}
41
42TEST(BufferTest, TestConstructDataWithCapacity) {
43  Buffer buf(kTestData, sizeof(kTestData), 256U);
44  EXPECT_EQ(sizeof(kTestData), buf.length());
45  EXPECT_EQ(256U, buf.capacity());
46  EXPECT_EQ(0, memcmp(buf.data(), kTestData, sizeof(kTestData)));
47  EXPECT_EQ(Buffer(kTestData, sizeof(kTestData)), buf);
48}
49
50TEST(BufferTest, TestConstructCopy) {
51  Buffer buf1(kTestData, sizeof(kTestData), 256), buf2(buf1);
52  EXPECT_EQ(sizeof(kTestData), buf2.length());
53  EXPECT_EQ(sizeof(kTestData), buf2.capacity());  // capacity isn't copied
54  EXPECT_EQ(0, memcmp(buf2.data(), kTestData, sizeof(kTestData)));
55  EXPECT_EQ(buf1, buf2);
56}
57
58TEST(BufferTest, TestAssign) {
59  Buffer buf1, buf2(kTestData, sizeof(kTestData), 256);
60  EXPECT_NE(buf1, buf2);
61  buf1 = buf2;
62  EXPECT_EQ(sizeof(kTestData), buf1.length());
63  EXPECT_EQ(sizeof(kTestData), buf1.capacity());  // capacity isn't copied
64  EXPECT_EQ(0, memcmp(buf1.data(), kTestData, sizeof(kTestData)));
65  EXPECT_EQ(buf1, buf2);
66}
67
68TEST(BufferTest, TestSetData) {
69  Buffer buf;
70  buf.SetData(kTestData, sizeof(kTestData));
71  EXPECT_EQ(sizeof(kTestData), buf.length());
72  EXPECT_EQ(sizeof(kTestData), buf.capacity());
73  EXPECT_EQ(0, memcmp(buf.data(), kTestData, sizeof(kTestData)));
74}
75
76TEST(BufferTest, TestAppendData) {
77  Buffer buf(kTestData, sizeof(kTestData));
78  buf.AppendData(kTestData, sizeof(kTestData));
79  EXPECT_EQ(2 * sizeof(kTestData), buf.length());
80  EXPECT_EQ(2 * sizeof(kTestData), buf.capacity());
81  EXPECT_EQ(0, memcmp(buf.data(), kTestData, sizeof(kTestData)));
82  EXPECT_EQ(0, memcmp(buf.data() + sizeof(kTestData),
83                      kTestData, sizeof(kTestData)));
84}
85
86TEST(BufferTest, TestSetLengthSmaller) {
87  Buffer buf;
88  buf.SetData(kTestData, sizeof(kTestData));
89  buf.SetLength(sizeof(kTestData) / 2);
90  EXPECT_EQ(sizeof(kTestData) / 2, buf.length());
91  EXPECT_EQ(sizeof(kTestData), buf.capacity());
92  EXPECT_EQ(0, memcmp(buf.data(), kTestData, sizeof(kTestData) / 2));
93}
94
95TEST(BufferTest, TestSetLengthLarger) {
96  Buffer buf;
97  buf.SetData(kTestData, sizeof(kTestData));
98  buf.SetLength(sizeof(kTestData) * 2);
99  EXPECT_EQ(sizeof(kTestData) * 2, buf.length());
100  EXPECT_EQ(sizeof(kTestData) * 2, buf.capacity());
101  EXPECT_EQ(0, memcmp(buf.data(), kTestData, sizeof(kTestData)));
102}
103
104TEST(BufferTest, TestSetCapacitySmaller) {
105  Buffer buf;
106  buf.SetData(kTestData, sizeof(kTestData));
107  buf.SetCapacity(sizeof(kTestData) / 2);  // should be ignored
108  EXPECT_EQ(sizeof(kTestData), buf.length());
109  EXPECT_EQ(sizeof(kTestData), buf.capacity());
110  EXPECT_EQ(0, memcmp(buf.data(), kTestData, sizeof(kTestData)));
111}
112
113TEST(BufferTest, TestSetCapacityLarger) {
114  Buffer buf(kTestData, sizeof(kTestData));
115  buf.SetCapacity(sizeof(kTestData) * 2);
116  EXPECT_EQ(sizeof(kTestData), buf.length());
117  EXPECT_EQ(sizeof(kTestData) * 2, buf.capacity());
118  EXPECT_EQ(0, memcmp(buf.data(), kTestData, sizeof(kTestData)));
119}
120
121TEST(BufferTest, TestSetCapacityThenSetLength) {
122  Buffer buf(kTestData, sizeof(kTestData));
123  buf.SetCapacity(sizeof(kTestData) * 4);
124  memcpy(buf.data() + sizeof(kTestData), kTestData, sizeof(kTestData));
125  buf.SetLength(sizeof(kTestData) * 2);
126  EXPECT_EQ(sizeof(kTestData) * 2, buf.length());
127  EXPECT_EQ(sizeof(kTestData) * 4, buf.capacity());
128  EXPECT_EQ(0, memcmp(buf.data(), kTestData, sizeof(kTestData)));
129  EXPECT_EQ(0, memcmp(buf.data() + sizeof(kTestData),
130                      kTestData, sizeof(kTestData)));
131}
132
133TEST(BufferTest, TestTransfer) {
134  Buffer buf1(kTestData, sizeof(kTestData), 256U), buf2;
135  buf1.TransferTo(&buf2);
136  EXPECT_EQ(0U, buf1.length());
137  EXPECT_EQ(0U, buf1.capacity());
138  EXPECT_EQ(sizeof(kTestData), buf2.length());
139  EXPECT_EQ(256U, buf2.capacity());  // capacity does transfer
140  EXPECT_EQ(0, memcmp(buf2.data(), kTestData, sizeof(kTestData)));
141}
142
143}  // namespace rtc
144