blob: b2f47c16ecbe3f3df8d1fc683f6da80ca3f8d02b [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "rtc_base/buffer.h"
kwibergd3134032016-09-05 07:46:20 -070012
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "api/array_view.h"
14#include "rtc_base/gunit.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000015
kwiberga4ac4782016-04-29 08:00:22 -070016#include <type_traits>
17#include <utility>
Karl Wiberg94784372015-04-20 14:03:07 +020018
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000019namespace rtc {
20
Karl Wiberg94784372015-04-20 14:03:07 +020021namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000022
Karl Wiberg94784372015-04-20 14:03:07 +020023// clang-format off
24const uint8_t kTestData[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
25 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
26// clang-format on
27
28void TestBuf(const Buffer& b1, size_t size, size_t capacity) {
29 EXPECT_EQ(b1.size(), size);
30 EXPECT_EQ(b1.capacity(), capacity);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000031}
32
Karl Wiberg94784372015-04-20 14:03:07 +020033} // namespace
34
35TEST(BufferTest, TestConstructEmpty) {
36 TestBuf(Buffer(), 0, 0);
37 TestBuf(Buffer(Buffer()), 0, 0);
38 TestBuf(Buffer(0), 0, 0);
39
40 // We can't use a literal 0 for the first argument, because C++ will allow
41 // that to be considered a null pointer, which makes the call ambiguous.
42 TestBuf(Buffer(0 + 0, 10), 0, 10);
43
44 TestBuf(Buffer(kTestData, 0), 0, 0);
45 TestBuf(Buffer(kTestData, 0, 20), 0, 20);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000046}
47
48TEST(BufferTest, TestConstructData) {
Karl Wiberg94784372015-04-20 14:03:07 +020049 Buffer buf(kTestData, 7);
50 EXPECT_EQ(buf.size(), 7u);
51 EXPECT_EQ(buf.capacity(), 7u);
ossu5955e242016-08-31 08:40:04 -070052 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020053 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000054}
55
56TEST(BufferTest, TestConstructDataWithCapacity) {
Karl Wiberg94784372015-04-20 14:03:07 +020057 Buffer buf(kTestData, 7, 14);
58 EXPECT_EQ(buf.size(), 7u);
59 EXPECT_EQ(buf.capacity(), 14u);
ossu5955e242016-08-31 08:40:04 -070060 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020061 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
62}
63
64TEST(BufferTest, TestConstructArray) {
65 Buffer buf(kTestData);
66 EXPECT_EQ(buf.size(), 16u);
67 EXPECT_EQ(buf.capacity(), 16u);
ossu5955e242016-08-31 08:40:04 -070068 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020069 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 16));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000070}
71
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000072TEST(BufferTest, TestSetData) {
Karl Wiberg94784372015-04-20 14:03:07 +020073 Buffer buf(kTestData + 4, 7);
74 buf.SetData(kTestData, 9);
75 EXPECT_EQ(buf.size(), 9u);
kwibergc8535972016-06-20 04:47:39 -070076 EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
ossu5955e242016-08-31 08:40:04 -070077 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020078 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
kwibergd3134032016-09-05 07:46:20 -070079 Buffer buf2;
80 buf2.SetData(buf);
81 EXPECT_EQ(buf.size(), 9u);
82 EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
83 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000084}
85
86TEST(BufferTest, TestAppendData) {
Karl Wiberg94784372015-04-20 14:03:07 +020087 Buffer buf(kTestData + 4, 3);
88 buf.AppendData(kTestData + 10, 2);
89 const int8_t exp[] = {0x4, 0x5, 0x6, 0xa, 0xb};
90 EXPECT_EQ(buf, Buffer(exp));
kwibergd3134032016-09-05 07:46:20 -070091 Buffer buf2;
92 buf2.AppendData(buf);
93 buf2.AppendData(rtc::ArrayView<uint8_t>(buf));
94 const int8_t exp2[] = {0x4, 0x5, 0x6, 0xa, 0xb, 0x4, 0x5, 0x6, 0xa, 0xb};
95 EXPECT_EQ(buf2, Buffer(exp2));
96}
97
98TEST(BufferTest, TestSetAndAppendWithUnknownArg) {
99 struct TestDataContainer {
100 size_t size() const { return 3; }
101 const uint8_t* data() const { return kTestData; }
102 };
103 Buffer buf;
104 buf.SetData(TestDataContainer());
105 EXPECT_EQ(3u, buf.size());
106 EXPECT_EQ(Buffer(kTestData, 3), buf);
107 buf.AppendData(TestDataContainer());
108 EXPECT_EQ(6u, buf.size());
109 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 3));
110 EXPECT_EQ(0, memcmp(buf.data() + 3, kTestData, 3));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000111}
112
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +0000113TEST(BufferTest, TestSetSizeSmaller) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000114 Buffer buf;
Karl Wiberg94784372015-04-20 14:03:07 +0200115 buf.SetData(kTestData, 15);
116 buf.SetSize(10);
117 EXPECT_EQ(buf.size(), 10u);
118 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
ossu5955e242016-08-31 08:40:04 -0700119 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200120 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000121}
122
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +0000123TEST(BufferTest, TestSetSizeLarger) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000124 Buffer buf;
Karl Wiberg94784372015-04-20 14:03:07 +0200125 buf.SetData(kTestData, 15);
126 EXPECT_EQ(buf.size(), 15u);
127 EXPECT_EQ(buf.capacity(), 15u);
ossu5955e242016-08-31 08:40:04 -0700128 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200129 buf.SetSize(20);
130 EXPECT_EQ(buf.size(), 20u);
kwibergc8535972016-06-20 04:47:39 -0700131 EXPECT_EQ(buf.capacity(), 15u * 3 / 2); // Has grown.
ossu5955e242016-08-31 08:40:04 -0700132 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200133 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 15));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000134}
135
Karl Wiberg94784372015-04-20 14:03:07 +0200136TEST(BufferTest, TestEnsureCapacitySmaller) {
137 Buffer buf(kTestData);
138 const char* data = buf.data<char>();
139 buf.EnsureCapacity(4);
140 EXPECT_EQ(buf.capacity(), 16u); // Hasn't shrunk.
141 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
ossu5955e242016-08-31 08:40:04 -0700142 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200143 EXPECT_EQ(buf, Buffer(kTestData));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000144}
145
Karl Wiberg94784372015-04-20 14:03:07 +0200146TEST(BufferTest, TestEnsureCapacityLarger) {
147 Buffer buf(kTestData, 5);
148 buf.EnsureCapacity(10);
149 const int8_t* data = buf.data<int8_t>();
150 EXPECT_EQ(buf.capacity(), 10u);
151 buf.AppendData(kTestData + 5, 5);
152 EXPECT_EQ(buf.data<int8_t>(), data); // No reallocation.
ossu5955e242016-08-31 08:40:04 -0700153 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200154 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000155}
156
Karl Wiberg94784372015-04-20 14:03:07 +0200157TEST(BufferTest, TestMoveConstruct) {
158 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200159 const uint8_t* data = buf1.data();
kwiberg0149e752016-03-11 14:40:52 -0800160 Buffer buf2(std::move(buf1));
Karl Wiberg94784372015-04-20 14:03:07 +0200161 EXPECT_EQ(buf2.size(), 3u);
162 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200163 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 08:40:04 -0700164 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200165 buf1.Clear();
166 EXPECT_EQ(buf1.size(), 0u);
167 EXPECT_EQ(buf1.capacity(), 0u);
168 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700169 EXPECT_TRUE(buf1.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000170}
171
Karl Wiberg94784372015-04-20 14:03:07 +0200172TEST(BufferTest, TestMoveAssign) {
173 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200174 const uint8_t* data = buf1.data();
Karl Wiberg94784372015-04-20 14:03:07 +0200175 Buffer buf2(kTestData);
kwiberg0149e752016-03-11 14:40:52 -0800176 buf2 = std::move(buf1);
Karl Wiberg94784372015-04-20 14:03:07 +0200177 EXPECT_EQ(buf2.size(), 3u);
178 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200179 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 08:40:04 -0700180 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200181 buf1.Clear();
182 EXPECT_EQ(buf1.size(), 0u);
183 EXPECT_EQ(buf1.capacity(), 0u);
184 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700185 EXPECT_TRUE(buf1.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200186}
187
Karl Wiberg4f3ce272018-10-17 13:34:33 +0200188TEST(BufferTest, TestMoveAssignSelf) {
189 // Move self-assignment isn't required to produce a meaningful state, but
190 // should not leave the object in an inconsistent state. (Such inconsistent
191 // state could be caught by the DCHECKs and/or by the leak checker.) We need
192 // to be sneaky when testing this; if we're doing a too-obvious
193 // move-assign-to-self, clang's -Wself-move triggers at compile time.
194 Buffer buf(kTestData, 3, 40);
195 Buffer* buf_ptr = &buf;
196 buf = std::move(*buf_ptr);
197}
198
Karl Wiberg94784372015-04-20 14:03:07 +0200199TEST(BufferTest, TestSwap) {
200 Buffer buf1(kTestData, 3);
201 Buffer buf2(kTestData, 6, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200202 uint8_t* data1 = buf1.data();
203 uint8_t* data2 = buf2.data();
Karl Wiberg94784372015-04-20 14:03:07 +0200204 using std::swap;
205 swap(buf1, buf2);
206 EXPECT_EQ(buf1.size(), 6u);
207 EXPECT_EQ(buf1.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200208 EXPECT_EQ(buf1.data(), data2);
ossu5955e242016-08-31 08:40:04 -0700209 EXPECT_FALSE(buf1.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200210 EXPECT_EQ(buf2.size(), 3u);
211 EXPECT_EQ(buf2.capacity(), 3u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200212 EXPECT_EQ(buf2.data(), data1);
ossu5955e242016-08-31 08:40:04 -0700213 EXPECT_FALSE(buf2.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000214}
215
ossu728012e2016-02-19 02:38:32 -0800216TEST(BufferTest, TestClear) {
217 Buffer buf;
218 buf.SetData(kTestData, 15);
219 EXPECT_EQ(buf.size(), 15u);
220 EXPECT_EQ(buf.capacity(), 15u);
ossu5955e242016-08-31 08:40:04 -0700221 EXPECT_FALSE(buf.empty());
Yves Gerey665174f2018-06-19 15:03:05 +0200222 const char* data = buf.data<char>();
ossu728012e2016-02-19 02:38:32 -0800223 buf.Clear();
224 EXPECT_EQ(buf.size(), 0u);
Yves Gerey665174f2018-06-19 15:03:05 +0200225 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
226 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
ossu5955e242016-08-31 08:40:04 -0700227 EXPECT_TRUE(buf.empty());
ossu728012e2016-02-19 02:38:32 -0800228}
229
ossub01c7812016-02-24 01:05:56 -0800230TEST(BufferTest, TestLambdaSetAppend) {
Yves Gerey665174f2018-06-19 15:03:05 +0200231 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 01:05:56 -0800232 for (int i = 0; i != 15; ++i)
233 av[i] = kTestData[i];
234 return 15;
235 };
236
237 Buffer buf1;
238 buf1.SetData(kTestData, 15);
239 buf1.AppendData(kTestData, 15);
240
241 Buffer buf2;
242 EXPECT_EQ(buf2.SetData(15, setter), 15u);
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, TestLambdaSetAppendSigned) {
Yves Gerey665174f2018-06-19 15:03:05 +0200251 auto setter = [](rtc::ArrayView<int8_t> av) {
ossub01c7812016-02-24 01:05:56 -0800252 for (int i = 0; i != 15; ++i)
253 av[i] = kTestData[i];
254 return 15;
255 };
256
257 Buffer buf1;
258 buf1.SetData(kTestData, 15);
259 buf1.AppendData(kTestData, 15);
260
261 Buffer buf2;
262 EXPECT_EQ(buf2.SetData<int8_t>(15, setter), 15u);
263 EXPECT_EQ(buf2.AppendData<int8_t>(15, setter), 15u);
264 EXPECT_EQ(buf1, buf2);
265 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 08:40:04 -0700266 EXPECT_FALSE(buf1.empty());
267 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 01:05:56 -0800268}
269
270TEST(BufferTest, TestLambdaAppendEmpty) {
Yves Gerey665174f2018-06-19 15:03:05 +0200271 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 01:05:56 -0800272 for (int i = 0; i != 15; ++i)
273 av[i] = kTestData[i];
274 return 15;
275 };
276
277 Buffer buf1;
278 buf1.SetData(kTestData, 15);
279
280 Buffer buf2;
281 EXPECT_EQ(buf2.AppendData(15, setter), 15u);
282 EXPECT_EQ(buf1, buf2);
283 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 08:40:04 -0700284 EXPECT_FALSE(buf1.empty());
285 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 01:05:56 -0800286}
287
288TEST(BufferTest, TestLambdaAppendPartial) {
Yves Gerey665174f2018-06-19 15:03:05 +0200289 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 01:05:56 -0800290 for (int i = 0; i != 7; ++i)
291 av[i] = kTestData[i];
292 return 7;
293 };
294
295 Buffer buf;
296 EXPECT_EQ(buf.AppendData(15, setter), 7u);
Yves Gerey665174f2018-06-19 15:03:05 +0200297 EXPECT_EQ(buf.size(), 7u); // Size is exactly what we wrote.
298 EXPECT_GE(buf.capacity(), 7u); // Capacity is valid.
299 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
ossu5955e242016-08-31 08:40:04 -0700300 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 01:05:56 -0800301}
302
303TEST(BufferTest, TestMutableLambdaSetAppend) {
304 uint8_t magic_number = 17;
Yves Gerey665174f2018-06-19 15:03:05 +0200305 auto setter = [magic_number](rtc::ArrayView<uint8_t> av) mutable {
ossub01c7812016-02-24 01:05:56 -0800306 for (int i = 0; i != 15; ++i) {
307 av[i] = magic_number;
308 ++magic_number;
309 }
310 return 15;
311 };
312
313 EXPECT_EQ(magic_number, 17);
314
315 Buffer buf;
316 EXPECT_EQ(buf.SetData(15, setter), 15u);
317 EXPECT_EQ(buf.AppendData(15, setter), 15u);
Yves Gerey665174f2018-06-19 15:03:05 +0200318 EXPECT_EQ(buf.size(), 30u); // Size is exactly what we wrote.
319 EXPECT_GE(buf.capacity(), 30u); // Capacity is valid.
320 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
ossu5955e242016-08-31 08:40:04 -0700321 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 01:05:56 -0800322
323 for (uint8_t i = 0; i != buf.size(); ++i) {
324 EXPECT_EQ(buf.data()[i], magic_number + i);
325 }
326}
327
ossub9338ac2016-02-29 09:36:37 -0800328TEST(BufferTest, TestBracketRead) {
329 Buffer buf(kTestData, 7);
330 EXPECT_EQ(buf.size(), 7u);
331 EXPECT_EQ(buf.capacity(), 7u);
332 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700333 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 09:36:37 -0800334
335 for (size_t i = 0; i != 7u; ++i) {
336 EXPECT_EQ(buf[i], kTestData[i]);
337 }
338}
339
340TEST(BufferTest, TestBracketReadConst) {
341 Buffer buf(kTestData, 7);
342 EXPECT_EQ(buf.size(), 7u);
343 EXPECT_EQ(buf.capacity(), 7u);
344 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700345 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 09:36:37 -0800346
347 const Buffer& cbuf = buf;
348
349 for (size_t i = 0; i != 7u; ++i) {
350 EXPECT_EQ(cbuf[i], kTestData[i]);
351 }
352}
353
354TEST(BufferTest, TestBracketWrite) {
355 Buffer buf(7);
356 EXPECT_EQ(buf.size(), 7u);
357 EXPECT_EQ(buf.capacity(), 7u);
358 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700359 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 09:36:37 -0800360
361 for (size_t i = 0; i != 7u; ++i) {
362 buf[i] = kTestData[i];
363 }
364
365 for (size_t i = 0; i != 7u; ++i) {
366 EXPECT_EQ(buf[i], kTestData[i]);
367 }
368}
369
kwiberg1ba21eb2017-04-05 07:38:06 -0700370TEST(BufferTest, TestBeginEnd) {
371 const Buffer cbuf(kTestData);
372 Buffer buf(kTestData);
Steve Anton9de3aac2017-10-24 10:08:26 -0700373 auto* b1 = cbuf.begin();
kwiberg1ba21eb2017-04-05 07:38:06 -0700374 for (auto& x : buf) {
375 EXPECT_EQ(*b1, x);
376 ++b1;
377 ++x;
378 }
379 EXPECT_EQ(cbuf.end(), b1);
Steve Anton9de3aac2017-10-24 10:08:26 -0700380 auto* b2 = buf.begin();
kwiberg1ba21eb2017-04-05 07:38:06 -0700381 for (auto& y : cbuf) {
382 EXPECT_EQ(*b2, y + 1);
383 ++b2;
384 }
385 EXPECT_EQ(buf.end(), b2);
386}
387
kwiberga4ac4782016-04-29 08:00:22 -0700388TEST(BufferTest, TestInt16) {
389 static constexpr int16_t test_data[] = {14, 15, 16, 17, 18};
390 BufferT<int16_t> buf(test_data);
391 EXPECT_EQ(buf.size(), 5u);
392 EXPECT_EQ(buf.capacity(), 5u);
393 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700394 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700395 for (size_t i = 0; i != buf.size(); ++i) {
396 EXPECT_EQ(test_data[i], buf[i]);
397 }
398 BufferT<int16_t> buf2(test_data);
399 EXPECT_EQ(buf, buf2);
400 buf2[0] = 9;
401 EXPECT_NE(buf, buf2);
402}
403
404TEST(BufferTest, TestFloat) {
405 static constexpr float test_data[] = {14, 15, 16, 17, 18};
406 BufferT<float> buf;
407 EXPECT_EQ(buf.size(), 0u);
408 EXPECT_EQ(buf.capacity(), 0u);
409 EXPECT_EQ(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700410 EXPECT_TRUE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700411 buf.SetData(test_data);
412 EXPECT_EQ(buf.size(), 5u);
413 EXPECT_EQ(buf.capacity(), 5u);
414 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700415 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700416 float* p1 = buf.data();
417 while (buf.data() == p1) {
418 buf.AppendData(test_data);
419 }
420 EXPECT_EQ(buf.size(), buf.capacity());
421 EXPECT_GT(buf.size(), 5u);
422 EXPECT_EQ(buf.size() % 5, 0u);
423 EXPECT_NE(buf.data(), nullptr);
424 for (size_t i = 0; i != buf.size(); ++i) {
425 EXPECT_EQ(test_data[i % 5], buf[i]);
426 }
427}
428
429TEST(BufferTest, TestStruct) {
430 struct BloodStone {
431 bool blood;
432 const char* stone;
433 };
434 BufferT<BloodStone> buf(4);
435 EXPECT_EQ(buf.size(), 4u);
436 EXPECT_EQ(buf.capacity(), 4u);
437 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700438 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700439 BufferT<BloodStone*> buf2(4);
440 for (size_t i = 0; i < buf2.size(); ++i) {
441 buf2[i] = &buf[i];
442 }
443 static const char kObsidian[] = "obsidian";
444 buf2[2]->stone = kObsidian;
445 EXPECT_EQ(kObsidian, buf[2].stone);
446}
447
Karl Wibergb3b01792018-10-10 12:44:12 +0200448TEST(BufferTest, DieOnUseAfterMove) {
449 Buffer buf(17);
450 Buffer buf2 = std::move(buf);
451 EXPECT_EQ(buf2.size(), 17u);
452#if RTC_DCHECK_IS_ON
453#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
454 EXPECT_DEATH(buf.empty(), "");
455#endif
456#else
457 EXPECT_TRUE(buf.empty());
458#endif
459}
460
Joachim Bauch5b32f232018-03-07 20:02:26 +0100461TEST(ZeroOnFreeBufferTest, TestZeroOnSetData) {
462 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
463 const uint8_t* old_data = buf.data();
464 const size_t old_capacity = buf.capacity();
465 const size_t old_size = buf.size();
466 constexpr size_t offset = 1;
467 buf.SetData(kTestData + offset, 2);
468 // Sanity checks to make sure the underlying heap memory was not reallocated.
469 EXPECT_EQ(old_data, buf.data());
470 EXPECT_EQ(old_capacity, buf.capacity());
471 // The first two elements have been overwritten, and the remaining five have
472 // been zeroed.
473 EXPECT_EQ(kTestData[offset], buf[0]);
474 EXPECT_EQ(kTestData[offset + 1], buf[1]);
475 for (size_t i = 2; i < old_size; i++) {
476 EXPECT_EQ(0, old_data[i]);
477 }
478}
479
480TEST(ZeroOnFreeBufferTest, TestZeroOnSetDataFromSetter) {
481 static constexpr size_t offset = 1;
482 const auto setter = [](rtc::ArrayView<uint8_t> av) {
483 for (int i = 0; i != 2; ++i)
484 av[i] = kTestData[offset + i];
485 return 2;
486 };
487
488 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
489 const uint8_t* old_data = buf.data();
490 const size_t old_capacity = buf.capacity();
491 const size_t old_size = buf.size();
492 buf.SetData(2, setter);
493 // Sanity checks to make sure the underlying heap memory was not reallocated.
494 EXPECT_EQ(old_data, buf.data());
495 EXPECT_EQ(old_capacity, buf.capacity());
496 // The first two elements have been overwritten, and the remaining five have
497 // been zeroed.
498 EXPECT_EQ(kTestData[offset], buf[0]);
499 EXPECT_EQ(kTestData[offset + 1], buf[1]);
500 for (size_t i = 2; i < old_size; i++) {
501 EXPECT_EQ(0, old_data[i]);
502 }
503}
504
505TEST(ZeroOnFreeBufferTest, TestZeroOnSetSize) {
506 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
507 const uint8_t* old_data = buf.data();
508 const size_t old_capacity = buf.capacity();
509 const size_t old_size = buf.size();
510 buf.SetSize(2);
511 // Sanity checks to make sure the underlying heap memory was not reallocated.
512 EXPECT_EQ(old_data, buf.data());
513 EXPECT_EQ(old_capacity, buf.capacity());
514 // The first two elements have not been modified and the remaining five have
515 // been zeroed.
516 EXPECT_EQ(kTestData[0], buf[0]);
517 EXPECT_EQ(kTestData[1], buf[1]);
518 for (size_t i = 2; i < old_size; i++) {
519 EXPECT_EQ(0, old_data[i]);
520 }
521}
522
523TEST(ZeroOnFreeBufferTest, TestZeroOnClear) {
524 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
525 const uint8_t* old_data = buf.data();
526 const size_t old_capacity = buf.capacity();
527 const size_t old_size = buf.size();
528 buf.Clear();
529 // Sanity checks to make sure the underlying heap memory was not reallocated.
530 EXPECT_EQ(old_data, buf.data());
531 EXPECT_EQ(old_capacity, buf.capacity());
532 // The underlying memory was not released but cleared.
533 for (size_t i = 0; i < old_size; i++) {
534 EXPECT_EQ(0, old_data[i]);
535 }
536}
537
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000538} // namespace rtc