blob: f13daad38177ecd1d620e5c9ccbfb3ad131b0aba [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);
ossu5955e242016-08-31 08:40:04 -070050 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020051 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000052}
53
54TEST(BufferTest, TestConstructDataWithCapacity) {
Karl Wiberg94784372015-04-20 14:03:07 +020055 Buffer buf(kTestData, 7, 14);
56 EXPECT_EQ(buf.size(), 7u);
57 EXPECT_EQ(buf.capacity(), 14u);
ossu5955e242016-08-31 08:40:04 -070058 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020059 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
60}
61
62TEST(BufferTest, TestConstructArray) {
63 Buffer buf(kTestData);
64 EXPECT_EQ(buf.size(), 16u);
65 EXPECT_EQ(buf.capacity(), 16u);
ossu5955e242016-08-31 08:40:04 -070066 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020067 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 16));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000068}
69
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000070TEST(BufferTest, TestSetData) {
Karl Wiberg94784372015-04-20 14:03:07 +020071 Buffer buf(kTestData + 4, 7);
72 buf.SetData(kTestData, 9);
73 EXPECT_EQ(buf.size(), 9u);
kwibergc8535972016-06-20 04:47:39 -070074 EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
ossu5955e242016-08-31 08:40:04 -070075 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020076 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000077}
78
79TEST(BufferTest, TestAppendData) {
Karl Wiberg94784372015-04-20 14:03:07 +020080 Buffer buf(kTestData + 4, 3);
81 buf.AppendData(kTestData + 10, 2);
82 const int8_t exp[] = {0x4, 0x5, 0x6, 0xa, 0xb};
83 EXPECT_EQ(buf, Buffer(exp));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000084}
85
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000086TEST(BufferTest, TestSetSizeSmaller) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000087 Buffer buf;
Karl Wiberg94784372015-04-20 14:03:07 +020088 buf.SetData(kTestData, 15);
89 buf.SetSize(10);
90 EXPECT_EQ(buf.size(), 10u);
91 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
ossu5955e242016-08-31 08:40:04 -070092 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020093 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000094}
95
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000096TEST(BufferTest, TestSetSizeLarger) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000097 Buffer buf;
Karl Wiberg94784372015-04-20 14:03:07 +020098 buf.SetData(kTestData, 15);
99 EXPECT_EQ(buf.size(), 15u);
100 EXPECT_EQ(buf.capacity(), 15u);
ossu5955e242016-08-31 08:40:04 -0700101 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200102 buf.SetSize(20);
103 EXPECT_EQ(buf.size(), 20u);
kwibergc8535972016-06-20 04:47:39 -0700104 EXPECT_EQ(buf.capacity(), 15u * 3 / 2); // Has grown.
ossu5955e242016-08-31 08:40:04 -0700105 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200106 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 15));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000107}
108
Karl Wiberg94784372015-04-20 14:03:07 +0200109TEST(BufferTest, TestEnsureCapacitySmaller) {
110 Buffer buf(kTestData);
111 const char* data = buf.data<char>();
112 buf.EnsureCapacity(4);
113 EXPECT_EQ(buf.capacity(), 16u); // Hasn't shrunk.
114 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
ossu5955e242016-08-31 08:40:04 -0700115 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200116 EXPECT_EQ(buf, Buffer(kTestData));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000117}
118
Karl Wiberg94784372015-04-20 14:03:07 +0200119TEST(BufferTest, TestEnsureCapacityLarger) {
120 Buffer buf(kTestData, 5);
121 buf.EnsureCapacity(10);
122 const int8_t* data = buf.data<int8_t>();
123 EXPECT_EQ(buf.capacity(), 10u);
124 buf.AppendData(kTestData + 5, 5);
125 EXPECT_EQ(buf.data<int8_t>(), data); // No reallocation.
ossu5955e242016-08-31 08:40:04 -0700126 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200127 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000128}
129
Karl Wiberg94784372015-04-20 14:03:07 +0200130TEST(BufferTest, TestMoveConstruct) {
131 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200132 const uint8_t* data = buf1.data();
kwiberg0149e752016-03-11 14:40:52 -0800133 Buffer buf2(std::move(buf1));
Karl Wiberg94784372015-04-20 14:03:07 +0200134 EXPECT_EQ(buf2.size(), 3u);
135 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200136 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 08:40:04 -0700137 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200138 buf1.Clear();
139 EXPECT_EQ(buf1.size(), 0u);
140 EXPECT_EQ(buf1.capacity(), 0u);
141 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700142 EXPECT_TRUE(buf1.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000143}
144
Karl Wiberg94784372015-04-20 14:03:07 +0200145TEST(BufferTest, TestMoveAssign) {
146 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200147 const uint8_t* data = buf1.data();
Karl Wiberg94784372015-04-20 14:03:07 +0200148 Buffer buf2(kTestData);
kwiberg0149e752016-03-11 14:40:52 -0800149 buf2 = std::move(buf1);
Karl Wiberg94784372015-04-20 14:03:07 +0200150 EXPECT_EQ(buf2.size(), 3u);
151 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200152 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 08:40:04 -0700153 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200154 buf1.Clear();
155 EXPECT_EQ(buf1.size(), 0u);
156 EXPECT_EQ(buf1.capacity(), 0u);
157 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700158 EXPECT_TRUE(buf1.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200159}
160
161TEST(BufferTest, TestSwap) {
162 Buffer buf1(kTestData, 3);
163 Buffer buf2(kTestData, 6, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200164 uint8_t* data1 = buf1.data();
165 uint8_t* data2 = buf2.data();
Karl Wiberg94784372015-04-20 14:03:07 +0200166 using std::swap;
167 swap(buf1, buf2);
168 EXPECT_EQ(buf1.size(), 6u);
169 EXPECT_EQ(buf1.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200170 EXPECT_EQ(buf1.data(), data2);
ossu5955e242016-08-31 08:40:04 -0700171 EXPECT_FALSE(buf1.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200172 EXPECT_EQ(buf2.size(), 3u);
173 EXPECT_EQ(buf2.capacity(), 3u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200174 EXPECT_EQ(buf2.data(), data1);
ossu5955e242016-08-31 08:40:04 -0700175 EXPECT_FALSE(buf2.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000176}
177
ossu728012e2016-02-19 02:38:32 -0800178TEST(BufferTest, TestClear) {
179 Buffer buf;
180 buf.SetData(kTestData, 15);
181 EXPECT_EQ(buf.size(), 15u);
182 EXPECT_EQ(buf.capacity(), 15u);
ossu5955e242016-08-31 08:40:04 -0700183 EXPECT_FALSE(buf.empty());
ossu728012e2016-02-19 02:38:32 -0800184 const char *data = buf.data<char>();
185 buf.Clear();
186 EXPECT_EQ(buf.size(), 0u);
187 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
188 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
ossu5955e242016-08-31 08:40:04 -0700189 EXPECT_TRUE(buf.empty());
ossu728012e2016-02-19 02:38:32 -0800190}
191
ossub01c7812016-02-24 01:05:56 -0800192TEST(BufferTest, TestLambdaSetAppend) {
193 auto setter = [] (rtc::ArrayView<uint8_t> av) {
194 for (int i = 0; i != 15; ++i)
195 av[i] = kTestData[i];
196 return 15;
197 };
198
199 Buffer buf1;
200 buf1.SetData(kTestData, 15);
201 buf1.AppendData(kTestData, 15);
202
203 Buffer buf2;
204 EXPECT_EQ(buf2.SetData(15, setter), 15u);
205 EXPECT_EQ(buf2.AppendData(15, setter), 15u);
206 EXPECT_EQ(buf1, buf2);
207 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 08:40:04 -0700208 EXPECT_FALSE(buf1.empty());
209 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 01:05:56 -0800210}
211
212TEST(BufferTest, TestLambdaSetAppendSigned) {
213 auto setter = [] (rtc::ArrayView<int8_t> av) {
214 for (int i = 0; i != 15; ++i)
215 av[i] = kTestData[i];
216 return 15;
217 };
218
219 Buffer buf1;
220 buf1.SetData(kTestData, 15);
221 buf1.AppendData(kTestData, 15);
222
223 Buffer buf2;
224 EXPECT_EQ(buf2.SetData<int8_t>(15, setter), 15u);
225 EXPECT_EQ(buf2.AppendData<int8_t>(15, setter), 15u);
226 EXPECT_EQ(buf1, buf2);
227 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 08:40:04 -0700228 EXPECT_FALSE(buf1.empty());
229 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 01:05:56 -0800230}
231
232TEST(BufferTest, TestLambdaAppendEmpty) {
233 auto setter = [] (rtc::ArrayView<uint8_t> av) {
234 for (int i = 0; i != 15; ++i)
235 av[i] = kTestData[i];
236 return 15;
237 };
238
239 Buffer buf1;
240 buf1.SetData(kTestData, 15);
241
242 Buffer buf2;
243 EXPECT_EQ(buf2.AppendData(15, setter), 15u);
244 EXPECT_EQ(buf1, buf2);
245 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 08:40:04 -0700246 EXPECT_FALSE(buf1.empty());
247 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 01:05:56 -0800248}
249
250TEST(BufferTest, TestLambdaAppendPartial) {
251 auto setter = [] (rtc::ArrayView<uint8_t> av) {
252 for (int i = 0; i != 7; ++i)
253 av[i] = kTestData[i];
254 return 7;
255 };
256
257 Buffer buf;
258 EXPECT_EQ(buf.AppendData(15, setter), 7u);
259 EXPECT_EQ(buf.size(), 7u); // Size is exactly what we wrote.
260 EXPECT_GE(buf.capacity(), 7u); // Capacity is valid.
261 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
ossu5955e242016-08-31 08:40:04 -0700262 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 01:05:56 -0800263}
264
265TEST(BufferTest, TestMutableLambdaSetAppend) {
266 uint8_t magic_number = 17;
267 auto setter = [magic_number] (rtc::ArrayView<uint8_t> av) mutable {
268 for (int i = 0; i != 15; ++i) {
269 av[i] = magic_number;
270 ++magic_number;
271 }
272 return 15;
273 };
274
275 EXPECT_EQ(magic_number, 17);
276
277 Buffer buf;
278 EXPECT_EQ(buf.SetData(15, setter), 15u);
279 EXPECT_EQ(buf.AppendData(15, setter), 15u);
280 EXPECT_EQ(buf.size(), 30u); // Size is exactly what we wrote.
281 EXPECT_GE(buf.capacity(), 30u); // Capacity is valid.
282 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
ossu5955e242016-08-31 08:40:04 -0700283 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 01:05:56 -0800284
285 for (uint8_t i = 0; i != buf.size(); ++i) {
286 EXPECT_EQ(buf.data()[i], magic_number + i);
287 }
288}
289
ossub9338ac2016-02-29 09:36:37 -0800290TEST(BufferTest, TestBracketRead) {
291 Buffer buf(kTestData, 7);
292 EXPECT_EQ(buf.size(), 7u);
293 EXPECT_EQ(buf.capacity(), 7u);
294 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700295 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 09:36:37 -0800296
297 for (size_t i = 0; i != 7u; ++i) {
298 EXPECT_EQ(buf[i], kTestData[i]);
299 }
300}
301
302TEST(BufferTest, TestBracketReadConst) {
303 Buffer buf(kTestData, 7);
304 EXPECT_EQ(buf.size(), 7u);
305 EXPECT_EQ(buf.capacity(), 7u);
306 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700307 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 09:36:37 -0800308
309 const Buffer& cbuf = buf;
310
311 for (size_t i = 0; i != 7u; ++i) {
312 EXPECT_EQ(cbuf[i], kTestData[i]);
313 }
314}
315
316TEST(BufferTest, TestBracketWrite) {
317 Buffer buf(7);
318 EXPECT_EQ(buf.size(), 7u);
319 EXPECT_EQ(buf.capacity(), 7u);
320 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700321 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 09:36:37 -0800322
323 for (size_t i = 0; i != 7u; ++i) {
324 buf[i] = kTestData[i];
325 }
326
327 for (size_t i = 0; i != 7u; ++i) {
328 EXPECT_EQ(buf[i], kTestData[i]);
329 }
330}
331
kwiberga4ac4782016-04-29 08:00:22 -0700332TEST(BufferTest, TestInt16) {
333 static constexpr int16_t test_data[] = {14, 15, 16, 17, 18};
334 BufferT<int16_t> buf(test_data);
335 EXPECT_EQ(buf.size(), 5u);
336 EXPECT_EQ(buf.capacity(), 5u);
337 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700338 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700339 for (size_t i = 0; i != buf.size(); ++i) {
340 EXPECT_EQ(test_data[i], buf[i]);
341 }
342 BufferT<int16_t> buf2(test_data);
343 EXPECT_EQ(buf, buf2);
344 buf2[0] = 9;
345 EXPECT_NE(buf, buf2);
346}
347
348TEST(BufferTest, TestFloat) {
349 static constexpr float test_data[] = {14, 15, 16, 17, 18};
350 BufferT<float> buf;
351 EXPECT_EQ(buf.size(), 0u);
352 EXPECT_EQ(buf.capacity(), 0u);
353 EXPECT_EQ(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700354 EXPECT_TRUE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700355 buf.SetData(test_data);
356 EXPECT_EQ(buf.size(), 5u);
357 EXPECT_EQ(buf.capacity(), 5u);
358 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700359 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700360 float* p1 = buf.data();
361 while (buf.data() == p1) {
362 buf.AppendData(test_data);
363 }
364 EXPECT_EQ(buf.size(), buf.capacity());
365 EXPECT_GT(buf.size(), 5u);
366 EXPECT_EQ(buf.size() % 5, 0u);
367 EXPECT_NE(buf.data(), nullptr);
368 for (size_t i = 0; i != buf.size(); ++i) {
369 EXPECT_EQ(test_data[i % 5], buf[i]);
370 }
371}
372
373TEST(BufferTest, TestStruct) {
374 struct BloodStone {
375 bool blood;
376 const char* stone;
377 };
378 BufferT<BloodStone> buf(4);
379 EXPECT_EQ(buf.size(), 4u);
380 EXPECT_EQ(buf.capacity(), 4u);
381 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700382 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700383 BufferT<BloodStone*> buf2(4);
384 for (size_t i = 0; i < buf2.size(); ++i) {
385 buf2[i] = &buf[i];
386 }
387 static const char kObsidian[] = "obsidian";
388 buf2[2]->stone = kObsidian;
389 EXPECT_EQ(kObsidian, buf[2].stone);
390}
391
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000392} // namespace rtc