blob: 8beae43cf9488c5569fa7e8c96a9d50fcc6382e7 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:261/*
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 04:47:3111#include "rtc_base/buffer.h"
kwibergd3134032016-09-05 14:46:2012
Yves Gerey3e707812018-11-28 15:47:4913#include <cstdint>
kwiberga4ac4782016-04-29 15:00:2214#include <utility>
Karl Wiberg94784372015-04-20 12:03:0715
Yves Gerey3e707812018-11-28 15:47:4916#include "api/array_view.h"
Karl Wiberg215963c2020-02-04 13:31:3917#include "test/gmock.h"
Yves Gerey3e707812018-11-28 15:47:4918#include "test/gtest.h"
19
henrike@webrtc.orgf0488722014-05-13 18:00:2620namespace rtc {
21
Karl Wiberg94784372015-04-20 12:03:0722namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:2623
Karl Wiberg215963c2020-02-04 13:31:3924using ::testing::ElementsAre;
25using ::testing::ElementsAreArray;
26
Karl Wiberg94784372015-04-20 12:03:0727// clang-format off
28const uint8_t kTestData[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
29 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
30// clang-format on
31
32void TestBuf(const Buffer& b1, size_t size, size_t capacity) {
33 EXPECT_EQ(b1.size(), size);
34 EXPECT_EQ(b1.capacity(), capacity);
henrike@webrtc.orgf0488722014-05-13 18:00:2635}
36
Karl Wiberg94784372015-04-20 12:03:0737} // namespace
38
39TEST(BufferTest, TestConstructEmpty) {
40 TestBuf(Buffer(), 0, 0);
41 TestBuf(Buffer(Buffer()), 0, 0);
42 TestBuf(Buffer(0), 0, 0);
43
44 // We can't use a literal 0 for the first argument, because C++ will allow
45 // that to be considered a null pointer, which makes the call ambiguous.
46 TestBuf(Buffer(0 + 0, 10), 0, 10);
47
48 TestBuf(Buffer(kTestData, 0), 0, 0);
49 TestBuf(Buffer(kTestData, 0, 20), 0, 20);
henrike@webrtc.orgf0488722014-05-13 18:00:2650}
51
52TEST(BufferTest, TestConstructData) {
Karl Wiberg94784372015-04-20 12:03:0753 Buffer buf(kTestData, 7);
54 EXPECT_EQ(buf.size(), 7u);
55 EXPECT_EQ(buf.capacity(), 7u);
ossu5955e242016-08-31 15:40:0456 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:0757 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
henrike@webrtc.orgf0488722014-05-13 18:00:2658}
59
60TEST(BufferTest, TestConstructDataWithCapacity) {
Karl Wiberg94784372015-04-20 12:03:0761 Buffer buf(kTestData, 7, 14);
62 EXPECT_EQ(buf.size(), 7u);
63 EXPECT_EQ(buf.capacity(), 14u);
ossu5955e242016-08-31 15:40:0464 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:0765 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
66}
67
68TEST(BufferTest, TestConstructArray) {
69 Buffer buf(kTestData);
70 EXPECT_EQ(buf.size(), 16u);
71 EXPECT_EQ(buf.capacity(), 16u);
ossu5955e242016-08-31 15:40:0472 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:0773 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 16));
henrike@webrtc.orgf0488722014-05-13 18:00:2674}
75
henrike@webrtc.orgf0488722014-05-13 18:00:2676TEST(BufferTest, TestSetData) {
Karl Wiberg94784372015-04-20 12:03:0777 Buffer buf(kTestData + 4, 7);
78 buf.SetData(kTestData, 9);
79 EXPECT_EQ(buf.size(), 9u);
kwibergc8535972016-06-20 11:47:3980 EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
ossu5955e242016-08-31 15:40:0481 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:0782 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
kwibergd3134032016-09-05 14:46:2083 Buffer buf2;
84 buf2.SetData(buf);
85 EXPECT_EQ(buf.size(), 9u);
86 EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
87 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
henrike@webrtc.orgf0488722014-05-13 18:00:2688}
89
90TEST(BufferTest, TestAppendData) {
Karl Wiberg94784372015-04-20 12:03:0791 Buffer buf(kTestData + 4, 3);
92 buf.AppendData(kTestData + 10, 2);
93 const int8_t exp[] = {0x4, 0x5, 0x6, 0xa, 0xb};
94 EXPECT_EQ(buf, Buffer(exp));
kwibergd3134032016-09-05 14:46:2095 Buffer buf2;
96 buf2.AppendData(buf);
97 buf2.AppendData(rtc::ArrayView<uint8_t>(buf));
98 const int8_t exp2[] = {0x4, 0x5, 0x6, 0xa, 0xb, 0x4, 0x5, 0x6, 0xa, 0xb};
99 EXPECT_EQ(buf2, Buffer(exp2));
100}
101
102TEST(BufferTest, TestSetAndAppendWithUnknownArg) {
103 struct TestDataContainer {
104 size_t size() const { return 3; }
105 const uint8_t* data() const { return kTestData; }
106 };
107 Buffer buf;
108 buf.SetData(TestDataContainer());
109 EXPECT_EQ(3u, buf.size());
110 EXPECT_EQ(Buffer(kTestData, 3), buf);
Karl Wiberg215963c2020-02-04 13:31:39111 EXPECT_THAT(buf, ElementsAre(0, 1, 2));
kwibergd3134032016-09-05 14:46:20112 buf.AppendData(TestDataContainer());
113 EXPECT_EQ(6u, buf.size());
114 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 3));
115 EXPECT_EQ(0, memcmp(buf.data() + 3, kTestData, 3));
Karl Wiberg215963c2020-02-04 13:31:39116 EXPECT_THAT(buf, ElementsAre(0, 1, 2, 0, 1, 2));
henrike@webrtc.orgf0488722014-05-13 18:00:26117}
118
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06119TEST(BufferTest, TestSetSizeSmaller) {
henrike@webrtc.orgf0488722014-05-13 18:00:26120 Buffer buf;
Karl Wiberg94784372015-04-20 12:03:07121 buf.SetData(kTestData, 15);
122 buf.SetSize(10);
123 EXPECT_EQ(buf.size(), 10u);
124 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
ossu5955e242016-08-31 15:40:04125 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07126 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26127}
128
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06129TEST(BufferTest, TestSetSizeLarger) {
henrike@webrtc.orgf0488722014-05-13 18:00:26130 Buffer buf;
Karl Wiberg94784372015-04-20 12:03:07131 buf.SetData(kTestData, 15);
132 EXPECT_EQ(buf.size(), 15u);
133 EXPECT_EQ(buf.capacity(), 15u);
ossu5955e242016-08-31 15:40:04134 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07135 buf.SetSize(20);
136 EXPECT_EQ(buf.size(), 20u);
kwibergc8535972016-06-20 11:47:39137 EXPECT_EQ(buf.capacity(), 15u * 3 / 2); // Has grown.
ossu5955e242016-08-31 15:40:04138 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07139 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 15));
henrike@webrtc.orgf0488722014-05-13 18:00:26140}
141
Karl Wiberg94784372015-04-20 12:03:07142TEST(BufferTest, TestEnsureCapacitySmaller) {
143 Buffer buf(kTestData);
144 const char* data = buf.data<char>();
145 buf.EnsureCapacity(4);
146 EXPECT_EQ(buf.capacity(), 16u); // Hasn't shrunk.
147 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
ossu5955e242016-08-31 15:40:04148 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07149 EXPECT_EQ(buf, Buffer(kTestData));
henrike@webrtc.orgf0488722014-05-13 18:00:26150}
151
Karl Wiberg94784372015-04-20 12:03:07152TEST(BufferTest, TestEnsureCapacityLarger) {
153 Buffer buf(kTestData, 5);
154 buf.EnsureCapacity(10);
155 const int8_t* data = buf.data<int8_t>();
156 EXPECT_EQ(buf.capacity(), 10u);
157 buf.AppendData(kTestData + 5, 5);
158 EXPECT_EQ(buf.data<int8_t>(), data); // No reallocation.
ossu5955e242016-08-31 15:40:04159 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07160 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26161}
162
Karl Wiberg94784372015-04-20 12:03:07163TEST(BufferTest, TestMoveConstruct) {
164 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 12:54:55165 const uint8_t* data = buf1.data();
kwiberg0149e752016-03-11 22:40:52166 Buffer buf2(std::move(buf1));
Karl Wiberg94784372015-04-20 12:03:07167 EXPECT_EQ(buf2.size(), 3u);
168 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 12:54:55169 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 15:40:04170 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 12:03:07171 buf1.Clear();
172 EXPECT_EQ(buf1.size(), 0u);
173 EXPECT_EQ(buf1.capacity(), 0u);
174 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 15:40:04175 EXPECT_TRUE(buf1.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26176}
177
Karl Wiberg94784372015-04-20 12:03:07178TEST(BufferTest, TestMoveAssign) {
179 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 12:54:55180 const uint8_t* data = buf1.data();
Karl Wiberg94784372015-04-20 12:03:07181 Buffer buf2(kTestData);
kwiberg0149e752016-03-11 22:40:52182 buf2 = std::move(buf1);
Karl Wiberg94784372015-04-20 12:03:07183 EXPECT_EQ(buf2.size(), 3u);
184 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 12:54:55185 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 15:40:04186 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 12:03:07187 buf1.Clear();
188 EXPECT_EQ(buf1.size(), 0u);
189 EXPECT_EQ(buf1.capacity(), 0u);
190 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 15:40:04191 EXPECT_TRUE(buf1.empty());
Karl Wiberg94784372015-04-20 12:03:07192}
193
Karl Wiberg4f3ce272018-10-17 11:34:33194TEST(BufferTest, TestMoveAssignSelf) {
195 // Move self-assignment isn't required to produce a meaningful state, but
196 // should not leave the object in an inconsistent state. (Such inconsistent
197 // state could be caught by the DCHECKs and/or by the leak checker.) We need
198 // to be sneaky when testing this; if we're doing a too-obvious
199 // move-assign-to-self, clang's -Wself-move triggers at compile time.
200 Buffer buf(kTestData, 3, 40);
201 Buffer* buf_ptr = &buf;
202 buf = std::move(*buf_ptr);
203}
204
Karl Wiberg94784372015-04-20 12:03:07205TEST(BufferTest, TestSwap) {
206 Buffer buf1(kTestData, 3);
207 Buffer buf2(kTestData, 6, 40);
Karl Wibergc56ac1e2015-05-04 12:54:55208 uint8_t* data1 = buf1.data();
209 uint8_t* data2 = buf2.data();
Karl Wiberg94784372015-04-20 12:03:07210 using std::swap;
211 swap(buf1, buf2);
212 EXPECT_EQ(buf1.size(), 6u);
213 EXPECT_EQ(buf1.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 12:54:55214 EXPECT_EQ(buf1.data(), data2);
ossu5955e242016-08-31 15:40:04215 EXPECT_FALSE(buf1.empty());
Karl Wiberg94784372015-04-20 12:03:07216 EXPECT_EQ(buf2.size(), 3u);
217 EXPECT_EQ(buf2.capacity(), 3u);
Karl Wibergc56ac1e2015-05-04 12:54:55218 EXPECT_EQ(buf2.data(), data1);
ossu5955e242016-08-31 15:40:04219 EXPECT_FALSE(buf2.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26220}
221
ossu728012e2016-02-19 10:38:32222TEST(BufferTest, TestClear) {
223 Buffer buf;
224 buf.SetData(kTestData, 15);
225 EXPECT_EQ(buf.size(), 15u);
226 EXPECT_EQ(buf.capacity(), 15u);
ossu5955e242016-08-31 15:40:04227 EXPECT_FALSE(buf.empty());
Yves Gerey665174f2018-06-19 13:03:05228 const char* data = buf.data<char>();
ossu728012e2016-02-19 10:38:32229 buf.Clear();
230 EXPECT_EQ(buf.size(), 0u);
Yves Gerey665174f2018-06-19 13:03:05231 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
232 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
ossu5955e242016-08-31 15:40:04233 EXPECT_TRUE(buf.empty());
ossu728012e2016-02-19 10:38:32234}
235
ossub01c7812016-02-24 09:05:56236TEST(BufferTest, TestLambdaSetAppend) {
Yves Gerey665174f2018-06-19 13:03:05237 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 09:05:56238 for (int i = 0; i != 15; ++i)
239 av[i] = kTestData[i];
240 return 15;
241 };
242
243 Buffer buf1;
244 buf1.SetData(kTestData, 15);
245 buf1.AppendData(kTestData, 15);
246
247 Buffer buf2;
248 EXPECT_EQ(buf2.SetData(15, setter), 15u);
249 EXPECT_EQ(buf2.AppendData(15, setter), 15u);
250 EXPECT_EQ(buf1, buf2);
251 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 15:40:04252 EXPECT_FALSE(buf1.empty());
253 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 09:05:56254}
255
256TEST(BufferTest, TestLambdaSetAppendSigned) {
Yves Gerey665174f2018-06-19 13:03:05257 auto setter = [](rtc::ArrayView<int8_t> av) {
ossub01c7812016-02-24 09:05:56258 for (int i = 0; i != 15; ++i)
259 av[i] = kTestData[i];
260 return 15;
261 };
262
263 Buffer buf1;
264 buf1.SetData(kTestData, 15);
265 buf1.AppendData(kTestData, 15);
266
267 Buffer buf2;
268 EXPECT_EQ(buf2.SetData<int8_t>(15, setter), 15u);
269 EXPECT_EQ(buf2.AppendData<int8_t>(15, setter), 15u);
270 EXPECT_EQ(buf1, buf2);
271 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 15:40:04272 EXPECT_FALSE(buf1.empty());
273 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 09:05:56274}
275
276TEST(BufferTest, TestLambdaAppendEmpty) {
Yves Gerey665174f2018-06-19 13:03:05277 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 09:05:56278 for (int i = 0; i != 15; ++i)
279 av[i] = kTestData[i];
280 return 15;
281 };
282
283 Buffer buf1;
284 buf1.SetData(kTestData, 15);
285
286 Buffer buf2;
287 EXPECT_EQ(buf2.AppendData(15, setter), 15u);
288 EXPECT_EQ(buf1, buf2);
289 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 15:40:04290 EXPECT_FALSE(buf1.empty());
291 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 09:05:56292}
293
294TEST(BufferTest, TestLambdaAppendPartial) {
Yves Gerey665174f2018-06-19 13:03:05295 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 09:05:56296 for (int i = 0; i != 7; ++i)
297 av[i] = kTestData[i];
298 return 7;
299 };
300
301 Buffer buf;
302 EXPECT_EQ(buf.AppendData(15, setter), 7u);
Yves Gerey665174f2018-06-19 13:03:05303 EXPECT_EQ(buf.size(), 7u); // Size is exactly what we wrote.
304 EXPECT_GE(buf.capacity(), 7u); // Capacity is valid.
305 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
ossu5955e242016-08-31 15:40:04306 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 09:05:56307}
308
309TEST(BufferTest, TestMutableLambdaSetAppend) {
310 uint8_t magic_number = 17;
Yves Gerey665174f2018-06-19 13:03:05311 auto setter = [magic_number](rtc::ArrayView<uint8_t> av) mutable {
ossub01c7812016-02-24 09:05:56312 for (int i = 0; i != 15; ++i) {
313 av[i] = magic_number;
314 ++magic_number;
315 }
316 return 15;
317 };
318
319 EXPECT_EQ(magic_number, 17);
320
321 Buffer buf;
322 EXPECT_EQ(buf.SetData(15, setter), 15u);
323 EXPECT_EQ(buf.AppendData(15, setter), 15u);
Yves Gerey665174f2018-06-19 13:03:05324 EXPECT_EQ(buf.size(), 30u); // Size is exactly what we wrote.
325 EXPECT_GE(buf.capacity(), 30u); // Capacity is valid.
326 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
ossu5955e242016-08-31 15:40:04327 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 09:05:56328
329 for (uint8_t i = 0; i != buf.size(); ++i) {
330 EXPECT_EQ(buf.data()[i], magic_number + i);
331 }
332}
333
ossub9338ac2016-02-29 17:36:37334TEST(BufferTest, TestBracketRead) {
335 Buffer buf(kTestData, 7);
336 EXPECT_EQ(buf.size(), 7u);
337 EXPECT_EQ(buf.capacity(), 7u);
338 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04339 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 17:36:37340
341 for (size_t i = 0; i != 7u; ++i) {
342 EXPECT_EQ(buf[i], kTestData[i]);
343 }
344}
345
346TEST(BufferTest, TestBracketReadConst) {
347 Buffer buf(kTestData, 7);
348 EXPECT_EQ(buf.size(), 7u);
349 EXPECT_EQ(buf.capacity(), 7u);
350 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04351 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 17:36:37352
353 const Buffer& cbuf = buf;
354
355 for (size_t i = 0; i != 7u; ++i) {
356 EXPECT_EQ(cbuf[i], kTestData[i]);
357 }
358}
359
360TEST(BufferTest, TestBracketWrite) {
361 Buffer buf(7);
362 EXPECT_EQ(buf.size(), 7u);
363 EXPECT_EQ(buf.capacity(), 7u);
364 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04365 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 17:36:37366
367 for (size_t i = 0; i != 7u; ++i) {
368 buf[i] = kTestData[i];
369 }
370
Karl Wiberg215963c2020-02-04 13:31:39371 EXPECT_THAT(buf, ElementsAreArray(kTestData, 7));
ossub9338ac2016-02-29 17:36:37372}
373
kwiberg1ba21eb2017-04-05 14:38:06374TEST(BufferTest, TestBeginEnd) {
375 const Buffer cbuf(kTestData);
376 Buffer buf(kTestData);
Steve Anton9de3aac2017-10-24 17:08:26377 auto* b1 = cbuf.begin();
kwiberg1ba21eb2017-04-05 14:38:06378 for (auto& x : buf) {
379 EXPECT_EQ(*b1, x);
380 ++b1;
381 ++x;
382 }
383 EXPECT_EQ(cbuf.end(), b1);
Steve Anton9de3aac2017-10-24 17:08:26384 auto* b2 = buf.begin();
kwiberg1ba21eb2017-04-05 14:38:06385 for (auto& y : cbuf) {
386 EXPECT_EQ(*b2, y + 1);
387 ++b2;
388 }
389 EXPECT_EQ(buf.end(), b2);
390}
391
kwiberga4ac4782016-04-29 15:00:22392TEST(BufferTest, TestInt16) {
393 static constexpr int16_t test_data[] = {14, 15, 16, 17, 18};
394 BufferT<int16_t> buf(test_data);
395 EXPECT_EQ(buf.size(), 5u);
396 EXPECT_EQ(buf.capacity(), 5u);
397 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04398 EXPECT_FALSE(buf.empty());
Karl Wiberg215963c2020-02-04 13:31:39399 EXPECT_THAT(buf, ElementsAreArray(test_data));
kwiberga4ac4782016-04-29 15:00:22400 BufferT<int16_t> buf2(test_data);
401 EXPECT_EQ(buf, buf2);
402 buf2[0] = 9;
403 EXPECT_NE(buf, buf2);
404}
405
406TEST(BufferTest, TestFloat) {
407 static constexpr float test_data[] = {14, 15, 16, 17, 18};
408 BufferT<float> buf;
409 EXPECT_EQ(buf.size(), 0u);
410 EXPECT_EQ(buf.capacity(), 0u);
411 EXPECT_EQ(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04412 EXPECT_TRUE(buf.empty());
kwiberga4ac4782016-04-29 15:00:22413 buf.SetData(test_data);
414 EXPECT_EQ(buf.size(), 5u);
415 EXPECT_EQ(buf.capacity(), 5u);
416 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04417 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 15:00:22418 float* p1 = buf.data();
419 while (buf.data() == p1) {
420 buf.AppendData(test_data);
421 }
422 EXPECT_EQ(buf.size(), buf.capacity());
423 EXPECT_GT(buf.size(), 5u);
424 EXPECT_EQ(buf.size() % 5, 0u);
425 EXPECT_NE(buf.data(), nullptr);
426 for (size_t i = 0; i != buf.size(); ++i) {
427 EXPECT_EQ(test_data[i % 5], buf[i]);
428 }
429}
430
431TEST(BufferTest, TestStruct) {
432 struct BloodStone {
433 bool blood;
434 const char* stone;
435 };
436 BufferT<BloodStone> buf(4);
437 EXPECT_EQ(buf.size(), 4u);
438 EXPECT_EQ(buf.capacity(), 4u);
439 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04440 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 15:00:22441 BufferT<BloodStone*> buf2(4);
442 for (size_t i = 0; i < buf2.size(); ++i) {
443 buf2[i] = &buf[i];
444 }
445 static const char kObsidian[] = "obsidian";
446 buf2[2]->stone = kObsidian;
447 EXPECT_EQ(kObsidian, buf[2].stone);
448}
449
Tommia5e07cc2020-05-26 19:40:37450TEST(BufferDeathTest, DieOnUseAfterMove) {
Karl Wibergb3b01792018-10-10 10:44:12451 Buffer buf(17);
452 Buffer buf2 = std::move(buf);
453 EXPECT_EQ(buf2.size(), 17u);
454#if RTC_DCHECK_IS_ON
455#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
456 EXPECT_DEATH(buf.empty(), "");
457#endif
458#else
459 EXPECT_TRUE(buf.empty());
460#endif
461}
462
Joachim Bauch5b32f232018-03-07 19:02:26463TEST(ZeroOnFreeBufferTest, TestZeroOnSetData) {
464 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
465 const uint8_t* old_data = buf.data();
466 const size_t old_capacity = buf.capacity();
467 const size_t old_size = buf.size();
468 constexpr size_t offset = 1;
469 buf.SetData(kTestData + offset, 2);
470 // Sanity checks to make sure the underlying heap memory was not reallocated.
471 EXPECT_EQ(old_data, buf.data());
472 EXPECT_EQ(old_capacity, buf.capacity());
473 // The first two elements have been overwritten, and the remaining five have
474 // been zeroed.
475 EXPECT_EQ(kTestData[offset], buf[0]);
476 EXPECT_EQ(kTestData[offset + 1], buf[1]);
477 for (size_t i = 2; i < old_size; i++) {
478 EXPECT_EQ(0, old_data[i]);
479 }
480}
481
482TEST(ZeroOnFreeBufferTest, TestZeroOnSetDataFromSetter) {
483 static constexpr size_t offset = 1;
484 const auto setter = [](rtc::ArrayView<uint8_t> av) {
485 for (int i = 0; i != 2; ++i)
486 av[i] = kTestData[offset + i];
487 return 2;
488 };
489
490 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
491 const uint8_t* old_data = buf.data();
492 const size_t old_capacity = buf.capacity();
493 const size_t old_size = buf.size();
494 buf.SetData(2, setter);
495 // Sanity checks to make sure the underlying heap memory was not reallocated.
496 EXPECT_EQ(old_data, buf.data());
497 EXPECT_EQ(old_capacity, buf.capacity());
498 // The first two elements have been overwritten, and the remaining five have
499 // been zeroed.
500 EXPECT_EQ(kTestData[offset], buf[0]);
501 EXPECT_EQ(kTestData[offset + 1], buf[1]);
502 for (size_t i = 2; i < old_size; i++) {
503 EXPECT_EQ(0, old_data[i]);
504 }
505}
506
507TEST(ZeroOnFreeBufferTest, TestZeroOnSetSize) {
508 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
509 const uint8_t* old_data = buf.data();
510 const size_t old_capacity = buf.capacity();
511 const size_t old_size = buf.size();
512 buf.SetSize(2);
513 // Sanity checks to make sure the underlying heap memory was not reallocated.
514 EXPECT_EQ(old_data, buf.data());
515 EXPECT_EQ(old_capacity, buf.capacity());
516 // The first two elements have not been modified and the remaining five have
517 // been zeroed.
518 EXPECT_EQ(kTestData[0], buf[0]);
519 EXPECT_EQ(kTestData[1], buf[1]);
520 for (size_t i = 2; i < old_size; i++) {
521 EXPECT_EQ(0, old_data[i]);
522 }
523}
524
525TEST(ZeroOnFreeBufferTest, TestZeroOnClear) {
526 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
527 const uint8_t* old_data = buf.data();
528 const size_t old_capacity = buf.capacity();
529 const size_t old_size = buf.size();
530 buf.Clear();
531 // Sanity checks to make sure the underlying heap memory was not reallocated.
532 EXPECT_EQ(old_data, buf.data());
533 EXPECT_EQ(old_capacity, buf.capacity());
534 // The underlying memory was not released but cleared.
535 for (size_t i = 0; i < old_size; i++) {
536 EXPECT_EQ(0, old_data[i]);
537 }
538}
539
henrike@webrtc.orgf0488722014-05-13 18:00:26540} // namespace rtc