blob: bd095a6b0954a5a9dc907ba7aeb4e9db38bc5ae3 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
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
kwiberga4ac4782016-04-29 08:00:22 -070014#include <type_traits>
15#include <utility>
Karl Wiberg94784372015-04-20 14:03:07 +020016
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000017namespace rtc {
18
Karl Wiberg94784372015-04-20 14:03:07 +020019namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000020
Karl Wiberg94784372015-04-20 14:03:07 +020021// clang-format off
22const uint8_t kTestData[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
23 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
24// clang-format on
25
26void TestBuf(const Buffer& b1, size_t size, size_t capacity) {
27 EXPECT_EQ(b1.size(), size);
28 EXPECT_EQ(b1.capacity(), capacity);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000029}
30
Karl Wiberg94784372015-04-20 14:03:07 +020031} // namespace
32
33TEST(BufferTest, TestConstructEmpty) {
34 TestBuf(Buffer(), 0, 0);
35 TestBuf(Buffer(Buffer()), 0, 0);
36 TestBuf(Buffer(0), 0, 0);
37
38 // We can't use a literal 0 for the first argument, because C++ will allow
39 // that to be considered a null pointer, which makes the call ambiguous.
40 TestBuf(Buffer(0 + 0, 10), 0, 10);
41
42 TestBuf(Buffer(kTestData, 0), 0, 0);
43 TestBuf(Buffer(kTestData, 0, 20), 0, 20);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000044}
45
46TEST(BufferTest, TestConstructData) {
Karl Wiberg94784372015-04-20 14:03:07 +020047 Buffer buf(kTestData, 7);
48 EXPECT_EQ(buf.size(), 7u);
49 EXPECT_EQ(buf.capacity(), 7u);
50 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000051}
52
53TEST(BufferTest, TestConstructDataWithCapacity) {
Karl Wiberg94784372015-04-20 14:03:07 +020054 Buffer buf(kTestData, 7, 14);
55 EXPECT_EQ(buf.size(), 7u);
56 EXPECT_EQ(buf.capacity(), 14u);
57 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
58}
59
60TEST(BufferTest, TestConstructArray) {
61 Buffer buf(kTestData);
62 EXPECT_EQ(buf.size(), 16u);
63 EXPECT_EQ(buf.capacity(), 16u);
64 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 16));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000065}
66
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000067TEST(BufferTest, TestSetData) {
Karl Wiberg94784372015-04-20 14:03:07 +020068 Buffer buf(kTestData + 4, 7);
69 buf.SetData(kTestData, 9);
70 EXPECT_EQ(buf.size(), 9u);
kwibergc8535972016-06-20 04:47:39 -070071 EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
Karl Wiberg94784372015-04-20 14:03:07 +020072 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000073}
74
75TEST(BufferTest, TestAppendData) {
Karl Wiberg94784372015-04-20 14:03:07 +020076 Buffer buf(kTestData + 4, 3);
77 buf.AppendData(kTestData + 10, 2);
78 const int8_t exp[] = {0x4, 0x5, 0x6, 0xa, 0xb};
79 EXPECT_EQ(buf, Buffer(exp));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000080}
81
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000082TEST(BufferTest, TestSetSizeSmaller) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000083 Buffer buf;
Karl Wiberg94784372015-04-20 14:03:07 +020084 buf.SetData(kTestData, 15);
85 buf.SetSize(10);
86 EXPECT_EQ(buf.size(), 10u);
87 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
88 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089}
90
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000091TEST(BufferTest, TestSetSizeLarger) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000092 Buffer buf;
Karl Wiberg94784372015-04-20 14:03:07 +020093 buf.SetData(kTestData, 15);
94 EXPECT_EQ(buf.size(), 15u);
95 EXPECT_EQ(buf.capacity(), 15u);
96 buf.SetSize(20);
97 EXPECT_EQ(buf.size(), 20u);
kwibergc8535972016-06-20 04:47:39 -070098 EXPECT_EQ(buf.capacity(), 15u * 3 / 2); // Has grown.
Karl Wiberg94784372015-04-20 14:03:07 +020099 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 15));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000100}
101
Karl Wiberg94784372015-04-20 14:03:07 +0200102TEST(BufferTest, TestEnsureCapacitySmaller) {
103 Buffer buf(kTestData);
104 const char* data = buf.data<char>();
105 buf.EnsureCapacity(4);
106 EXPECT_EQ(buf.capacity(), 16u); // Hasn't shrunk.
107 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
108 EXPECT_EQ(buf, Buffer(kTestData));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000109}
110
Karl Wiberg94784372015-04-20 14:03:07 +0200111TEST(BufferTest, TestEnsureCapacityLarger) {
112 Buffer buf(kTestData, 5);
113 buf.EnsureCapacity(10);
114 const int8_t* data = buf.data<int8_t>();
115 EXPECT_EQ(buf.capacity(), 10u);
116 buf.AppendData(kTestData + 5, 5);
117 EXPECT_EQ(buf.data<int8_t>(), data); // No reallocation.
118 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000119}
120
Karl Wiberg94784372015-04-20 14:03:07 +0200121TEST(BufferTest, TestMoveConstruct) {
122 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200123 const uint8_t* data = buf1.data();
kwiberg0149e752016-03-11 14:40:52 -0800124 Buffer buf2(std::move(buf1));
Karl Wiberg94784372015-04-20 14:03:07 +0200125 EXPECT_EQ(buf2.size(), 3u);
126 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200127 EXPECT_EQ(buf2.data(), data);
Karl Wiberg94784372015-04-20 14:03:07 +0200128 buf1.Clear();
129 EXPECT_EQ(buf1.size(), 0u);
130 EXPECT_EQ(buf1.capacity(), 0u);
131 EXPECT_EQ(buf1.data(), nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000132}
133
Karl Wiberg94784372015-04-20 14:03:07 +0200134TEST(BufferTest, TestMoveAssign) {
135 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200136 const uint8_t* data = buf1.data();
Karl Wiberg94784372015-04-20 14:03:07 +0200137 Buffer buf2(kTestData);
kwiberg0149e752016-03-11 14:40:52 -0800138 buf2 = std::move(buf1);
Karl Wiberg94784372015-04-20 14:03:07 +0200139 EXPECT_EQ(buf2.size(), 3u);
140 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200141 EXPECT_EQ(buf2.data(), data);
Karl Wiberg94784372015-04-20 14:03:07 +0200142 buf1.Clear();
143 EXPECT_EQ(buf1.size(), 0u);
144 EXPECT_EQ(buf1.capacity(), 0u);
145 EXPECT_EQ(buf1.data(), nullptr);
146}
147
148TEST(BufferTest, TestSwap) {
149 Buffer buf1(kTestData, 3);
150 Buffer buf2(kTestData, 6, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200151 uint8_t* data1 = buf1.data();
152 uint8_t* data2 = buf2.data();
Karl Wiberg94784372015-04-20 14:03:07 +0200153 using std::swap;
154 swap(buf1, buf2);
155 EXPECT_EQ(buf1.size(), 6u);
156 EXPECT_EQ(buf1.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200157 EXPECT_EQ(buf1.data(), data2);
Karl Wiberg94784372015-04-20 14:03:07 +0200158 EXPECT_EQ(buf2.size(), 3u);
159 EXPECT_EQ(buf2.capacity(), 3u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200160 EXPECT_EQ(buf2.data(), data1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000161}
162
ossu728012e2016-02-19 02:38:32 -0800163TEST(BufferTest, TestClear) {
164 Buffer buf;
165 buf.SetData(kTestData, 15);
166 EXPECT_EQ(buf.size(), 15u);
167 EXPECT_EQ(buf.capacity(), 15u);
168 const char *data = buf.data<char>();
169 buf.Clear();
170 EXPECT_EQ(buf.size(), 0u);
171 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
172 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
173}
174
ossub01c7812016-02-24 01:05:56 -0800175TEST(BufferTest, TestLambdaSetAppend) {
176 auto setter = [] (rtc::ArrayView<uint8_t> av) {
177 for (int i = 0; i != 15; ++i)
178 av[i] = kTestData[i];
179 return 15;
180 };
181
182 Buffer buf1;
183 buf1.SetData(kTestData, 15);
184 buf1.AppendData(kTestData, 15);
185
186 Buffer buf2;
187 EXPECT_EQ(buf2.SetData(15, setter), 15u);
188 EXPECT_EQ(buf2.AppendData(15, setter), 15u);
189 EXPECT_EQ(buf1, buf2);
190 EXPECT_EQ(buf1.capacity(), buf2.capacity());
191}
192
193TEST(BufferTest, TestLambdaSetAppendSigned) {
194 auto setter = [] (rtc::ArrayView<int8_t> av) {
195 for (int i = 0; i != 15; ++i)
196 av[i] = kTestData[i];
197 return 15;
198 };
199
200 Buffer buf1;
201 buf1.SetData(kTestData, 15);
202 buf1.AppendData(kTestData, 15);
203
204 Buffer buf2;
205 EXPECT_EQ(buf2.SetData<int8_t>(15, setter), 15u);
206 EXPECT_EQ(buf2.AppendData<int8_t>(15, setter), 15u);
207 EXPECT_EQ(buf1, buf2);
208 EXPECT_EQ(buf1.capacity(), buf2.capacity());
209}
210
211TEST(BufferTest, TestLambdaAppendEmpty) {
212 auto setter = [] (rtc::ArrayView<uint8_t> av) {
213 for (int i = 0; i != 15; ++i)
214 av[i] = kTestData[i];
215 return 15;
216 };
217
218 Buffer buf1;
219 buf1.SetData(kTestData, 15);
220
221 Buffer buf2;
222 EXPECT_EQ(buf2.AppendData(15, setter), 15u);
223 EXPECT_EQ(buf1, buf2);
224 EXPECT_EQ(buf1.capacity(), buf2.capacity());
225}
226
227TEST(BufferTest, TestLambdaAppendPartial) {
228 auto setter = [] (rtc::ArrayView<uint8_t> av) {
229 for (int i = 0; i != 7; ++i)
230 av[i] = kTestData[i];
231 return 7;
232 };
233
234 Buffer buf;
235 EXPECT_EQ(buf.AppendData(15, setter), 7u);
236 EXPECT_EQ(buf.size(), 7u); // Size is exactly what we wrote.
237 EXPECT_GE(buf.capacity(), 7u); // Capacity is valid.
238 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
239}
240
241TEST(BufferTest, TestMutableLambdaSetAppend) {
242 uint8_t magic_number = 17;
243 auto setter = [magic_number] (rtc::ArrayView<uint8_t> av) mutable {
244 for (int i = 0; i != 15; ++i) {
245 av[i] = magic_number;
246 ++magic_number;
247 }
248 return 15;
249 };
250
251 EXPECT_EQ(magic_number, 17);
252
253 Buffer buf;
254 EXPECT_EQ(buf.SetData(15, setter), 15u);
255 EXPECT_EQ(buf.AppendData(15, setter), 15u);
256 EXPECT_EQ(buf.size(), 30u); // Size is exactly what we wrote.
257 EXPECT_GE(buf.capacity(), 30u); // Capacity is valid.
258 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
259
260 for (uint8_t i = 0; i != buf.size(); ++i) {
261 EXPECT_EQ(buf.data()[i], magic_number + i);
262 }
263}
264
ossub9338ac2016-02-29 09:36:37 -0800265TEST(BufferTest, TestBracketRead) {
266 Buffer buf(kTestData, 7);
267 EXPECT_EQ(buf.size(), 7u);
268 EXPECT_EQ(buf.capacity(), 7u);
269 EXPECT_NE(buf.data(), nullptr);
270
271 for (size_t i = 0; i != 7u; ++i) {
272 EXPECT_EQ(buf[i], kTestData[i]);
273 }
274}
275
276TEST(BufferTest, TestBracketReadConst) {
277 Buffer buf(kTestData, 7);
278 EXPECT_EQ(buf.size(), 7u);
279 EXPECT_EQ(buf.capacity(), 7u);
280 EXPECT_NE(buf.data(), nullptr);
281
282 const Buffer& cbuf = buf;
283
284 for (size_t i = 0; i != 7u; ++i) {
285 EXPECT_EQ(cbuf[i], kTestData[i]);
286 }
287}
288
289TEST(BufferTest, TestBracketWrite) {
290 Buffer buf(7);
291 EXPECT_EQ(buf.size(), 7u);
292 EXPECT_EQ(buf.capacity(), 7u);
293 EXPECT_NE(buf.data(), nullptr);
294
295 for (size_t i = 0; i != 7u; ++i) {
296 buf[i] = kTestData[i];
297 }
298
299 for (size_t i = 0; i != 7u; ++i) {
300 EXPECT_EQ(buf[i], kTestData[i]);
301 }
302}
303
kwiberga4ac4782016-04-29 08:00:22 -0700304TEST(BufferTest, TestInt16) {
305 static constexpr int16_t test_data[] = {14, 15, 16, 17, 18};
306 BufferT<int16_t> buf(test_data);
307 EXPECT_EQ(buf.size(), 5u);
308 EXPECT_EQ(buf.capacity(), 5u);
309 EXPECT_NE(buf.data(), nullptr);
310 for (size_t i = 0; i != buf.size(); ++i) {
311 EXPECT_EQ(test_data[i], buf[i]);
312 }
313 BufferT<int16_t> buf2(test_data);
314 EXPECT_EQ(buf, buf2);
315 buf2[0] = 9;
316 EXPECT_NE(buf, buf2);
317}
318
319TEST(BufferTest, TestFloat) {
320 static constexpr float test_data[] = {14, 15, 16, 17, 18};
321 BufferT<float> buf;
322 EXPECT_EQ(buf.size(), 0u);
323 EXPECT_EQ(buf.capacity(), 0u);
324 EXPECT_EQ(buf.data(), nullptr);
325 buf.SetData(test_data);
326 EXPECT_EQ(buf.size(), 5u);
327 EXPECT_EQ(buf.capacity(), 5u);
328 EXPECT_NE(buf.data(), nullptr);
329 float* p1 = buf.data();
330 while (buf.data() == p1) {
331 buf.AppendData(test_data);
332 }
333 EXPECT_EQ(buf.size(), buf.capacity());
334 EXPECT_GT(buf.size(), 5u);
335 EXPECT_EQ(buf.size() % 5, 0u);
336 EXPECT_NE(buf.data(), nullptr);
337 for (size_t i = 0; i != buf.size(); ++i) {
338 EXPECT_EQ(test_data[i % 5], buf[i]);
339 }
340}
341
342TEST(BufferTest, TestStruct) {
343 struct BloodStone {
344 bool blood;
345 const char* stone;
346 };
347 BufferT<BloodStone> buf(4);
348 EXPECT_EQ(buf.size(), 4u);
349 EXPECT_EQ(buf.capacity(), 4u);
350 EXPECT_NE(buf.data(), nullptr);
351 BufferT<BloodStone*> buf2(4);
352 for (size_t i = 0; i < buf2.size(); ++i) {
353 buf2[i] = &buf[i];
354 }
355 static const char kObsidian[] = "obsidian";
356 buf2[2]->stone = kObsidian;
357 EXPECT_EQ(kObsidian, buf[2].stone);
358}
359
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000360} // namespace rtc