blob: b56118afde672dace71d2abdea1aa96f77d822f0 [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
Ali Tofighfd6a4d62022-03-31 08:36:4816#include "absl/strings/string_view.h"
Yves Gerey3e707812018-11-28 15:47:4917#include "api/array_view.h"
Karl Wiberg215963c2020-02-04 13:31:3918#include "test/gmock.h"
Yves Gerey3e707812018-11-28 15:47:4919#include "test/gtest.h"
20
henrike@webrtc.orgf0488722014-05-13 18:00:2621namespace rtc {
22
Karl Wiberg94784372015-04-20 12:03:0723namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:2624
Karl Wiberg215963c2020-02-04 13:31:3925using ::testing::ElementsAre;
26using ::testing::ElementsAreArray;
27
Karl Wiberg94784372015-04-20 12:03:0728// clang-format off
29const uint8_t kTestData[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
30 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
31// clang-format on
32
33void TestBuf(const Buffer& b1, size_t size, size_t capacity) {
34 EXPECT_EQ(b1.size(), size);
35 EXPECT_EQ(b1.capacity(), capacity);
henrike@webrtc.orgf0488722014-05-13 18:00:2636}
37
Karl Wiberg94784372015-04-20 12:03:0738} // namespace
39
40TEST(BufferTest, TestConstructEmpty) {
41 TestBuf(Buffer(), 0, 0);
42 TestBuf(Buffer(Buffer()), 0, 0);
43 TestBuf(Buffer(0), 0, 0);
44
45 // We can't use a literal 0 for the first argument, because C++ will allow
46 // that to be considered a null pointer, which makes the call ambiguous.
47 TestBuf(Buffer(0 + 0, 10), 0, 10);
48
49 TestBuf(Buffer(kTestData, 0), 0, 0);
50 TestBuf(Buffer(kTestData, 0, 20), 0, 20);
henrike@webrtc.orgf0488722014-05-13 18:00:2651}
52
53TEST(BufferTest, TestConstructData) {
Karl Wiberg94784372015-04-20 12:03:0754 Buffer buf(kTestData, 7);
55 EXPECT_EQ(buf.size(), 7u);
56 EXPECT_EQ(buf.capacity(), 7u);
ossu5955e242016-08-31 15:40:0457 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:0758 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
henrike@webrtc.orgf0488722014-05-13 18:00:2659}
60
61TEST(BufferTest, TestConstructDataWithCapacity) {
Karl Wiberg94784372015-04-20 12:03:0762 Buffer buf(kTestData, 7, 14);
63 EXPECT_EQ(buf.size(), 7u);
64 EXPECT_EQ(buf.capacity(), 14u);
ossu5955e242016-08-31 15:40:0465 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:0766 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
67}
68
69TEST(BufferTest, TestConstructArray) {
70 Buffer buf(kTestData);
71 EXPECT_EQ(buf.size(), 16u);
72 EXPECT_EQ(buf.capacity(), 16u);
ossu5955e242016-08-31 15:40:0473 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:0774 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 16));
henrike@webrtc.orgf0488722014-05-13 18:00:2675}
76
Ali Tofighfd6a4d62022-03-31 08:36:4877TEST(BufferTest, TestStringViewConversion) {
78 Buffer buf(kTestData);
79 absl::string_view view = buf;
80 EXPECT_EQ(view,
81 absl::string_view(reinterpret_cast<const char*>(kTestData), 16u));
82}
83
henrike@webrtc.orgf0488722014-05-13 18:00:2684TEST(BufferTest, TestSetData) {
Karl Wiberg94784372015-04-20 12:03:0785 Buffer buf(kTestData + 4, 7);
86 buf.SetData(kTestData, 9);
87 EXPECT_EQ(buf.size(), 9u);
kwibergc8535972016-06-20 11:47:3988 EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
ossu5955e242016-08-31 15:40:0489 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:0790 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
kwibergd3134032016-09-05 14:46:2091 Buffer buf2;
92 buf2.SetData(buf);
93 EXPECT_EQ(buf.size(), 9u);
94 EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
95 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
henrike@webrtc.orgf0488722014-05-13 18:00:2696}
97
98TEST(BufferTest, TestAppendData) {
Karl Wiberg94784372015-04-20 12:03:0799 Buffer buf(kTestData + 4, 3);
100 buf.AppendData(kTestData + 10, 2);
101 const int8_t exp[] = {0x4, 0x5, 0x6, 0xa, 0xb};
102 EXPECT_EQ(buf, Buffer(exp));
kwibergd3134032016-09-05 14:46:20103 Buffer buf2;
104 buf2.AppendData(buf);
105 buf2.AppendData(rtc::ArrayView<uint8_t>(buf));
106 const int8_t exp2[] = {0x4, 0x5, 0x6, 0xa, 0xb, 0x4, 0x5, 0x6, 0xa, 0xb};
107 EXPECT_EQ(buf2, Buffer(exp2));
108}
109
110TEST(BufferTest, TestSetAndAppendWithUnknownArg) {
111 struct TestDataContainer {
112 size_t size() const { return 3; }
113 const uint8_t* data() const { return kTestData; }
114 };
115 Buffer buf;
116 buf.SetData(TestDataContainer());
117 EXPECT_EQ(3u, buf.size());
118 EXPECT_EQ(Buffer(kTestData, 3), buf);
Karl Wiberg215963c2020-02-04 13:31:39119 EXPECT_THAT(buf, ElementsAre(0, 1, 2));
kwibergd3134032016-09-05 14:46:20120 buf.AppendData(TestDataContainer());
121 EXPECT_EQ(6u, buf.size());
122 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 3));
123 EXPECT_EQ(0, memcmp(buf.data() + 3, kTestData, 3));
Karl Wiberg215963c2020-02-04 13:31:39124 EXPECT_THAT(buf, ElementsAre(0, 1, 2, 0, 1, 2));
henrike@webrtc.orgf0488722014-05-13 18:00:26125}
126
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06127TEST(BufferTest, TestSetSizeSmaller) {
henrike@webrtc.orgf0488722014-05-13 18:00:26128 Buffer buf;
Karl Wiberg94784372015-04-20 12:03:07129 buf.SetData(kTestData, 15);
130 buf.SetSize(10);
131 EXPECT_EQ(buf.size(), 10u);
132 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
ossu5955e242016-08-31 15:40:04133 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07134 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26135}
136
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06137TEST(BufferTest, TestSetSizeLarger) {
henrike@webrtc.orgf0488722014-05-13 18:00:26138 Buffer buf;
Karl Wiberg94784372015-04-20 12:03:07139 buf.SetData(kTestData, 15);
140 EXPECT_EQ(buf.size(), 15u);
141 EXPECT_EQ(buf.capacity(), 15u);
ossu5955e242016-08-31 15:40:04142 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07143 buf.SetSize(20);
144 EXPECT_EQ(buf.size(), 20u);
kwibergc8535972016-06-20 11:47:39145 EXPECT_EQ(buf.capacity(), 15u * 3 / 2); // Has grown.
ossu5955e242016-08-31 15:40:04146 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07147 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 15));
henrike@webrtc.orgf0488722014-05-13 18:00:26148}
149
Karl Wiberg94784372015-04-20 12:03:07150TEST(BufferTest, TestEnsureCapacitySmaller) {
151 Buffer buf(kTestData);
152 const char* data = buf.data<char>();
153 buf.EnsureCapacity(4);
154 EXPECT_EQ(buf.capacity(), 16u); // Hasn't shrunk.
155 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
ossu5955e242016-08-31 15:40:04156 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07157 EXPECT_EQ(buf, Buffer(kTestData));
henrike@webrtc.orgf0488722014-05-13 18:00:26158}
159
Karl Wiberg94784372015-04-20 12:03:07160TEST(BufferTest, TestEnsureCapacityLarger) {
161 Buffer buf(kTestData, 5);
162 buf.EnsureCapacity(10);
163 const int8_t* data = buf.data<int8_t>();
164 EXPECT_EQ(buf.capacity(), 10u);
165 buf.AppendData(kTestData + 5, 5);
166 EXPECT_EQ(buf.data<int8_t>(), data); // No reallocation.
ossu5955e242016-08-31 15:40:04167 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 12:03:07168 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26169}
170
Karl Wiberg94784372015-04-20 12:03:07171TEST(BufferTest, TestMoveConstruct) {
172 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 12:54:55173 const uint8_t* data = buf1.data();
kwiberg0149e752016-03-11 22:40:52174 Buffer buf2(std::move(buf1));
Karl Wiberg94784372015-04-20 12:03:07175 EXPECT_EQ(buf2.size(), 3u);
176 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 12:54:55177 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 15:40:04178 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 12:03:07179 buf1.Clear();
180 EXPECT_EQ(buf1.size(), 0u);
181 EXPECT_EQ(buf1.capacity(), 0u);
182 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 15:40:04183 EXPECT_TRUE(buf1.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26184}
185
Karl Wiberg94784372015-04-20 12:03:07186TEST(BufferTest, TestMoveAssign) {
187 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 12:54:55188 const uint8_t* data = buf1.data();
Karl Wiberg94784372015-04-20 12:03:07189 Buffer buf2(kTestData);
kwiberg0149e752016-03-11 22:40:52190 buf2 = std::move(buf1);
Karl Wiberg94784372015-04-20 12:03:07191 EXPECT_EQ(buf2.size(), 3u);
192 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 12:54:55193 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 15:40:04194 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 12:03:07195 buf1.Clear();
196 EXPECT_EQ(buf1.size(), 0u);
197 EXPECT_EQ(buf1.capacity(), 0u);
198 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 15:40:04199 EXPECT_TRUE(buf1.empty());
Karl Wiberg94784372015-04-20 12:03:07200}
201
Karl Wiberg4f3ce272018-10-17 11:34:33202TEST(BufferTest, TestMoveAssignSelf) {
203 // Move self-assignment isn't required to produce a meaningful state, but
204 // should not leave the object in an inconsistent state. (Such inconsistent
205 // state could be caught by the DCHECKs and/or by the leak checker.) We need
206 // to be sneaky when testing this; if we're doing a too-obvious
207 // move-assign-to-self, clang's -Wself-move triggers at compile time.
208 Buffer buf(kTestData, 3, 40);
209 Buffer* buf_ptr = &buf;
210 buf = std::move(*buf_ptr);
211}
212
Karl Wiberg94784372015-04-20 12:03:07213TEST(BufferTest, TestSwap) {
214 Buffer buf1(kTestData, 3);
215 Buffer buf2(kTestData, 6, 40);
Karl Wibergc56ac1e2015-05-04 12:54:55216 uint8_t* data1 = buf1.data();
217 uint8_t* data2 = buf2.data();
Karl Wiberg94784372015-04-20 12:03:07218 using std::swap;
219 swap(buf1, buf2);
220 EXPECT_EQ(buf1.size(), 6u);
221 EXPECT_EQ(buf1.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 12:54:55222 EXPECT_EQ(buf1.data(), data2);
ossu5955e242016-08-31 15:40:04223 EXPECT_FALSE(buf1.empty());
Karl Wiberg94784372015-04-20 12:03:07224 EXPECT_EQ(buf2.size(), 3u);
225 EXPECT_EQ(buf2.capacity(), 3u);
Karl Wibergc56ac1e2015-05-04 12:54:55226 EXPECT_EQ(buf2.data(), data1);
ossu5955e242016-08-31 15:40:04227 EXPECT_FALSE(buf2.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26228}
229
ossu728012e2016-02-19 10:38:32230TEST(BufferTest, TestClear) {
231 Buffer buf;
232 buf.SetData(kTestData, 15);
233 EXPECT_EQ(buf.size(), 15u);
234 EXPECT_EQ(buf.capacity(), 15u);
ossu5955e242016-08-31 15:40:04235 EXPECT_FALSE(buf.empty());
Yves Gerey665174f2018-06-19 13:03:05236 const char* data = buf.data<char>();
ossu728012e2016-02-19 10:38:32237 buf.Clear();
238 EXPECT_EQ(buf.size(), 0u);
Yves Gerey665174f2018-06-19 13:03:05239 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
240 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
ossu5955e242016-08-31 15:40:04241 EXPECT_TRUE(buf.empty());
ossu728012e2016-02-19 10:38:32242}
243
ossub01c7812016-02-24 09:05:56244TEST(BufferTest, TestLambdaSetAppend) {
Yves Gerey665174f2018-06-19 13:03:05245 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 09:05:56246 for (int i = 0; i != 15; ++i)
247 av[i] = kTestData[i];
248 return 15;
249 };
250
251 Buffer buf1;
252 buf1.SetData(kTestData, 15);
253 buf1.AppendData(kTestData, 15);
254
255 Buffer buf2;
256 EXPECT_EQ(buf2.SetData(15, setter), 15u);
257 EXPECT_EQ(buf2.AppendData(15, setter), 15u);
258 EXPECT_EQ(buf1, buf2);
259 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 15:40:04260 EXPECT_FALSE(buf1.empty());
261 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 09:05:56262}
263
264TEST(BufferTest, TestLambdaSetAppendSigned) {
Yves Gerey665174f2018-06-19 13:03:05265 auto setter = [](rtc::ArrayView<int8_t> av) {
ossub01c7812016-02-24 09:05:56266 for (int i = 0; i != 15; ++i)
267 av[i] = kTestData[i];
268 return 15;
269 };
270
271 Buffer buf1;
272 buf1.SetData(kTestData, 15);
273 buf1.AppendData(kTestData, 15);
274
275 Buffer buf2;
276 EXPECT_EQ(buf2.SetData<int8_t>(15, setter), 15u);
277 EXPECT_EQ(buf2.AppendData<int8_t>(15, setter), 15u);
278 EXPECT_EQ(buf1, buf2);
279 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 15:40:04280 EXPECT_FALSE(buf1.empty());
281 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 09:05:56282}
283
284TEST(BufferTest, TestLambdaAppendEmpty) {
Yves Gerey665174f2018-06-19 13:03:05285 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 09:05:56286 for (int i = 0; i != 15; ++i)
287 av[i] = kTestData[i];
288 return 15;
289 };
290
291 Buffer buf1;
292 buf1.SetData(kTestData, 15);
293
294 Buffer buf2;
295 EXPECT_EQ(buf2.AppendData(15, setter), 15u);
296 EXPECT_EQ(buf1, buf2);
297 EXPECT_EQ(buf1.capacity(), buf2.capacity());
ossu5955e242016-08-31 15:40:04298 EXPECT_FALSE(buf1.empty());
299 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 09:05:56300}
301
302TEST(BufferTest, TestLambdaAppendPartial) {
Yves Gerey665174f2018-06-19 13:03:05303 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 09:05:56304 for (int i = 0; i != 7; ++i)
305 av[i] = kTestData[i];
306 return 7;
307 };
308
309 Buffer buf;
310 EXPECT_EQ(buf.AppendData(15, setter), 7u);
Yves Gerey665174f2018-06-19 13:03:05311 EXPECT_EQ(buf.size(), 7u); // Size is exactly what we wrote.
312 EXPECT_GE(buf.capacity(), 7u); // Capacity is valid.
313 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
ossu5955e242016-08-31 15:40:04314 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 09:05:56315}
316
317TEST(BufferTest, TestMutableLambdaSetAppend) {
318 uint8_t magic_number = 17;
Yves Gerey665174f2018-06-19 13:03:05319 auto setter = [magic_number](rtc::ArrayView<uint8_t> av) mutable {
ossub01c7812016-02-24 09:05:56320 for (int i = 0; i != 15; ++i) {
321 av[i] = magic_number;
322 ++magic_number;
323 }
324 return 15;
325 };
326
327 EXPECT_EQ(magic_number, 17);
328
329 Buffer buf;
330 EXPECT_EQ(buf.SetData(15, setter), 15u);
331 EXPECT_EQ(buf.AppendData(15, setter), 15u);
Yves Gerey665174f2018-06-19 13:03:05332 EXPECT_EQ(buf.size(), 30u); // Size is exactly what we wrote.
333 EXPECT_GE(buf.capacity(), 30u); // Capacity is valid.
334 EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
ossu5955e242016-08-31 15:40:04335 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 09:05:56336
337 for (uint8_t i = 0; i != buf.size(); ++i) {
338 EXPECT_EQ(buf.data()[i], magic_number + i);
339 }
340}
341
ossub9338ac2016-02-29 17:36:37342TEST(BufferTest, TestBracketRead) {
343 Buffer buf(kTestData, 7);
344 EXPECT_EQ(buf.size(), 7u);
345 EXPECT_EQ(buf.capacity(), 7u);
346 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04347 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 17:36:37348
349 for (size_t i = 0; i != 7u; ++i) {
350 EXPECT_EQ(buf[i], kTestData[i]);
351 }
352}
353
354TEST(BufferTest, TestBracketReadConst) {
355 Buffer buf(kTestData, 7);
356 EXPECT_EQ(buf.size(), 7u);
357 EXPECT_EQ(buf.capacity(), 7u);
358 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04359 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 17:36:37360
361 const Buffer& cbuf = buf;
362
363 for (size_t i = 0; i != 7u; ++i) {
364 EXPECT_EQ(cbuf[i], kTestData[i]);
365 }
366}
367
368TEST(BufferTest, TestBracketWrite) {
369 Buffer buf(7);
370 EXPECT_EQ(buf.size(), 7u);
371 EXPECT_EQ(buf.capacity(), 7u);
372 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04373 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 17:36:37374
375 for (size_t i = 0; i != 7u; ++i) {
376 buf[i] = kTestData[i];
377 }
378
Karl Wiberg215963c2020-02-04 13:31:39379 EXPECT_THAT(buf, ElementsAreArray(kTestData, 7));
ossub9338ac2016-02-29 17:36:37380}
381
kwiberg1ba21eb2017-04-05 14:38:06382TEST(BufferTest, TestBeginEnd) {
383 const Buffer cbuf(kTestData);
384 Buffer buf(kTestData);
Steve Anton9de3aac2017-10-24 17:08:26385 auto* b1 = cbuf.begin();
kwiberg1ba21eb2017-04-05 14:38:06386 for (auto& x : buf) {
387 EXPECT_EQ(*b1, x);
388 ++b1;
389 ++x;
390 }
391 EXPECT_EQ(cbuf.end(), b1);
Steve Anton9de3aac2017-10-24 17:08:26392 auto* b2 = buf.begin();
kwiberg1ba21eb2017-04-05 14:38:06393 for (auto& y : cbuf) {
394 EXPECT_EQ(*b2, y + 1);
395 ++b2;
396 }
397 EXPECT_EQ(buf.end(), b2);
398}
399
kwiberga4ac4782016-04-29 15:00:22400TEST(BufferTest, TestInt16) {
401 static constexpr int16_t test_data[] = {14, 15, 16, 17, 18};
402 BufferT<int16_t> buf(test_data);
403 EXPECT_EQ(buf.size(), 5u);
404 EXPECT_EQ(buf.capacity(), 5u);
405 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04406 EXPECT_FALSE(buf.empty());
Karl Wiberg215963c2020-02-04 13:31:39407 EXPECT_THAT(buf, ElementsAreArray(test_data));
kwiberga4ac4782016-04-29 15:00:22408 BufferT<int16_t> buf2(test_data);
409 EXPECT_EQ(buf, buf2);
410 buf2[0] = 9;
411 EXPECT_NE(buf, buf2);
412}
413
414TEST(BufferTest, TestFloat) {
415 static constexpr float test_data[] = {14, 15, 16, 17, 18};
416 BufferT<float> buf;
417 EXPECT_EQ(buf.size(), 0u);
418 EXPECT_EQ(buf.capacity(), 0u);
419 EXPECT_EQ(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04420 EXPECT_TRUE(buf.empty());
kwiberga4ac4782016-04-29 15:00:22421 buf.SetData(test_data);
422 EXPECT_EQ(buf.size(), 5u);
423 EXPECT_EQ(buf.capacity(), 5u);
424 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04425 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 15:00:22426 float* p1 = buf.data();
427 while (buf.data() == p1) {
428 buf.AppendData(test_data);
429 }
430 EXPECT_EQ(buf.size(), buf.capacity());
431 EXPECT_GT(buf.size(), 5u);
432 EXPECT_EQ(buf.size() % 5, 0u);
433 EXPECT_NE(buf.data(), nullptr);
434 for (size_t i = 0; i != buf.size(); ++i) {
435 EXPECT_EQ(test_data[i % 5], buf[i]);
436 }
437}
438
439TEST(BufferTest, TestStruct) {
440 struct BloodStone {
441 bool blood;
442 const char* stone;
443 };
444 BufferT<BloodStone> buf(4);
445 EXPECT_EQ(buf.size(), 4u);
446 EXPECT_EQ(buf.capacity(), 4u);
447 EXPECT_NE(buf.data(), nullptr);
ossu5955e242016-08-31 15:40:04448 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 15:00:22449 BufferT<BloodStone*> buf2(4);
450 for (size_t i = 0; i < buf2.size(); ++i) {
451 buf2[i] = &buf[i];
452 }
453 static const char kObsidian[] = "obsidian";
454 buf2[2]->stone = kObsidian;
455 EXPECT_EQ(kObsidian, buf[2].stone);
456}
457
Tommia5e07cc2020-05-26 19:40:37458TEST(BufferDeathTest, DieOnUseAfterMove) {
Karl Wibergb3b01792018-10-10 10:44:12459 Buffer buf(17);
460 Buffer buf2 = std::move(buf);
461 EXPECT_EQ(buf2.size(), 17u);
462#if RTC_DCHECK_IS_ON
463#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
464 EXPECT_DEATH(buf.empty(), "");
465#endif
466#else
467 EXPECT_TRUE(buf.empty());
468#endif
469}
470
Joachim Bauch5b32f232018-03-07 19:02:26471TEST(ZeroOnFreeBufferTest, TestZeroOnSetData) {
472 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
473 const uint8_t* old_data = buf.data();
474 const size_t old_capacity = buf.capacity();
475 const size_t old_size = buf.size();
476 constexpr size_t offset = 1;
477 buf.SetData(kTestData + offset, 2);
478 // Sanity checks to make sure the underlying heap memory was not reallocated.
479 EXPECT_EQ(old_data, buf.data());
480 EXPECT_EQ(old_capacity, buf.capacity());
481 // The first two elements have been overwritten, and the remaining five have
482 // been zeroed.
483 EXPECT_EQ(kTestData[offset], buf[0]);
484 EXPECT_EQ(kTestData[offset + 1], buf[1]);
485 for (size_t i = 2; i < old_size; i++) {
486 EXPECT_EQ(0, old_data[i]);
487 }
488}
489
490TEST(ZeroOnFreeBufferTest, TestZeroOnSetDataFromSetter) {
491 static constexpr size_t offset = 1;
492 const auto setter = [](rtc::ArrayView<uint8_t> av) {
493 for (int i = 0; i != 2; ++i)
494 av[i] = kTestData[offset + i];
495 return 2;
496 };
497
498 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
499 const uint8_t* old_data = buf.data();
500 const size_t old_capacity = buf.capacity();
501 const size_t old_size = buf.size();
502 buf.SetData(2, setter);
503 // Sanity checks to make sure the underlying heap memory was not reallocated.
504 EXPECT_EQ(old_data, buf.data());
505 EXPECT_EQ(old_capacity, buf.capacity());
506 // The first two elements have been overwritten, and the remaining five have
507 // been zeroed.
508 EXPECT_EQ(kTestData[offset], buf[0]);
509 EXPECT_EQ(kTestData[offset + 1], buf[1]);
510 for (size_t i = 2; i < old_size; i++) {
511 EXPECT_EQ(0, old_data[i]);
512 }
513}
514
515TEST(ZeroOnFreeBufferTest, TestZeroOnSetSize) {
516 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
517 const uint8_t* old_data = buf.data();
518 const size_t old_capacity = buf.capacity();
519 const size_t old_size = buf.size();
520 buf.SetSize(2);
521 // Sanity checks to make sure the underlying heap memory was not reallocated.
522 EXPECT_EQ(old_data, buf.data());
523 EXPECT_EQ(old_capacity, buf.capacity());
524 // The first two elements have not been modified and the remaining five have
525 // been zeroed.
526 EXPECT_EQ(kTestData[0], buf[0]);
527 EXPECT_EQ(kTestData[1], buf[1]);
528 for (size_t i = 2; i < old_size; i++) {
529 EXPECT_EQ(0, old_data[i]);
530 }
531}
532
533TEST(ZeroOnFreeBufferTest, TestZeroOnClear) {
534 ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
535 const uint8_t* old_data = buf.data();
536 const size_t old_capacity = buf.capacity();
537 const size_t old_size = buf.size();
538 buf.Clear();
539 // Sanity checks to make sure the underlying heap memory was not reallocated.
540 EXPECT_EQ(old_data, buf.data());
541 EXPECT_EQ(old_capacity, buf.capacity());
542 // The underlying memory was not released but cleared.
543 for (size_t i = 0; i < old_size; i++) {
544 EXPECT_EQ(0, old_data[i]);
545 }
546}
547
henrike@webrtc.orgf0488722014-05-13 18:00:26548} // namespace rtc