blob: 8beae43cf9488c5569fa7e8c96a9d50fcc6382e7 [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
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwiberga4ac4782016-04-29 08:00:22 -070014#include <utility>
Karl Wiberg94784372015-04-20 14:03:07 +020015
Yves Gerey3e707812018-11-28 16:47:49 +010016#include "api/array_view.h"
Karl Wiberg215963c2020-02-04 14:31:39 +010017#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "test/gtest.h"
19
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000020namespace rtc {
21
Karl Wiberg94784372015-04-20 14:03:07 +020022namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000023
Karl Wiberg215963c2020-02-04 14:31:39 +010024using ::testing::ElementsAre;
25using ::testing::ElementsAreArray;
26
Karl Wiberg94784372015-04-20 14:03:07 +020027// 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:26 +000035}
36
Karl Wiberg94784372015-04-20 14:03:07 +020037} // 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:26 +000050}
51
52TEST(BufferTest, TestConstructData) {
Karl Wiberg94784372015-04-20 14:03:07 +020053 Buffer buf(kTestData, 7);
54 EXPECT_EQ(buf.size(), 7u);
55 EXPECT_EQ(buf.capacity(), 7u);
ossu5955e242016-08-31 08:40:04 -070056 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020057 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000058}
59
60TEST(BufferTest, TestConstructDataWithCapacity) {
Karl Wiberg94784372015-04-20 14:03:07 +020061 Buffer buf(kTestData, 7, 14);
62 EXPECT_EQ(buf.size(), 7u);
63 EXPECT_EQ(buf.capacity(), 14u);
ossu5955e242016-08-31 08:40:04 -070064 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020065 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 08:40:04 -070072 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020073 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 16));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000074}
75
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000076TEST(BufferTest, TestSetData) {
Karl Wiberg94784372015-04-20 14:03:07 +020077 Buffer buf(kTestData + 4, 7);
78 buf.SetData(kTestData, 9);
79 EXPECT_EQ(buf.size(), 9u);
kwibergc8535972016-06-20 04:47:39 -070080 EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
ossu5955e242016-08-31 08:40:04 -070081 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +020082 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
kwibergd3134032016-09-05 07:46:20 -070083 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:26 +000088}
89
90TEST(BufferTest, TestAppendData) {
Karl Wiberg94784372015-04-20 14:03:07 +020091 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 07:46:20 -070095 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 14:31:39 +0100111 EXPECT_THAT(buf, ElementsAre(0, 1, 2));
kwibergd3134032016-09-05 07:46:20 -0700112 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 14:31:39 +0100116 EXPECT_THAT(buf, ElementsAre(0, 1, 2, 0, 1, 2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000117}
118
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +0000119TEST(BufferTest, TestSetSizeSmaller) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000120 Buffer buf;
Karl Wiberg94784372015-04-20 14:03:07 +0200121 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 08:40:04 -0700125 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200126 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000127}
128
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +0000129TEST(BufferTest, TestSetSizeLarger) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000130 Buffer buf;
Karl Wiberg94784372015-04-20 14:03:07 +0200131 buf.SetData(kTestData, 15);
132 EXPECT_EQ(buf.size(), 15u);
133 EXPECT_EQ(buf.capacity(), 15u);
ossu5955e242016-08-31 08:40:04 -0700134 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200135 buf.SetSize(20);
136 EXPECT_EQ(buf.size(), 20u);
kwibergc8535972016-06-20 04:47:39 -0700137 EXPECT_EQ(buf.capacity(), 15u * 3 / 2); // Has grown.
ossu5955e242016-08-31 08:40:04 -0700138 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200139 EXPECT_EQ(0, memcmp(buf.data(), kTestData, 15));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000140}
141
Karl Wiberg94784372015-04-20 14:03:07 +0200142TEST(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 08:40:04 -0700148 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200149 EXPECT_EQ(buf, Buffer(kTestData));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000150}
151
Karl Wiberg94784372015-04-20 14:03:07 +0200152TEST(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 08:40:04 -0700159 EXPECT_FALSE(buf.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200160 EXPECT_EQ(buf, Buffer(kTestData, 10));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000161}
162
Karl Wiberg94784372015-04-20 14:03:07 +0200163TEST(BufferTest, TestMoveConstruct) {
164 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200165 const uint8_t* data = buf1.data();
kwiberg0149e752016-03-11 14:40:52 -0800166 Buffer buf2(std::move(buf1));
Karl Wiberg94784372015-04-20 14:03:07 +0200167 EXPECT_EQ(buf2.size(), 3u);
168 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200169 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 08:40:04 -0700170 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200171 buf1.Clear();
172 EXPECT_EQ(buf1.size(), 0u);
173 EXPECT_EQ(buf1.capacity(), 0u);
174 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700175 EXPECT_TRUE(buf1.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000176}
177
Karl Wiberg94784372015-04-20 14:03:07 +0200178TEST(BufferTest, TestMoveAssign) {
179 Buffer buf1(kTestData, 3, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200180 const uint8_t* data = buf1.data();
Karl Wiberg94784372015-04-20 14:03:07 +0200181 Buffer buf2(kTestData);
kwiberg0149e752016-03-11 14:40:52 -0800182 buf2 = std::move(buf1);
Karl Wiberg94784372015-04-20 14:03:07 +0200183 EXPECT_EQ(buf2.size(), 3u);
184 EXPECT_EQ(buf2.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200185 EXPECT_EQ(buf2.data(), data);
ossu5955e242016-08-31 08:40:04 -0700186 EXPECT_FALSE(buf2.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200187 buf1.Clear();
188 EXPECT_EQ(buf1.size(), 0u);
189 EXPECT_EQ(buf1.capacity(), 0u);
190 EXPECT_EQ(buf1.data(), nullptr);
ossu5955e242016-08-31 08:40:04 -0700191 EXPECT_TRUE(buf1.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200192}
193
Karl Wiberg4f3ce272018-10-17 13:34:33 +0200194TEST(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 14:03:07 +0200205TEST(BufferTest, TestSwap) {
206 Buffer buf1(kTestData, 3);
207 Buffer buf2(kTestData, 6, 40);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200208 uint8_t* data1 = buf1.data();
209 uint8_t* data2 = buf2.data();
Karl Wiberg94784372015-04-20 14:03:07 +0200210 using std::swap;
211 swap(buf1, buf2);
212 EXPECT_EQ(buf1.size(), 6u);
213 EXPECT_EQ(buf1.capacity(), 40u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200214 EXPECT_EQ(buf1.data(), data2);
ossu5955e242016-08-31 08:40:04 -0700215 EXPECT_FALSE(buf1.empty());
Karl Wiberg94784372015-04-20 14:03:07 +0200216 EXPECT_EQ(buf2.size(), 3u);
217 EXPECT_EQ(buf2.capacity(), 3u);
Karl Wibergc56ac1e2015-05-04 14:54:55 +0200218 EXPECT_EQ(buf2.data(), data1);
ossu5955e242016-08-31 08:40:04 -0700219 EXPECT_FALSE(buf2.empty());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000220}
221
ossu728012e2016-02-19 02:38:32 -0800222TEST(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 08:40:04 -0700227 EXPECT_FALSE(buf.empty());
Yves Gerey665174f2018-06-19 15:03:05 +0200228 const char* data = buf.data<char>();
ossu728012e2016-02-19 02:38:32 -0800229 buf.Clear();
230 EXPECT_EQ(buf.size(), 0u);
Yves Gerey665174f2018-06-19 15:03:05 +0200231 EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
232 EXPECT_EQ(buf.data<char>(), data); // No reallocation.
ossu5955e242016-08-31 08:40:04 -0700233 EXPECT_TRUE(buf.empty());
ossu728012e2016-02-19 02:38:32 -0800234}
235
ossub01c7812016-02-24 01:05:56 -0800236TEST(BufferTest, TestLambdaSetAppend) {
Yves Gerey665174f2018-06-19 15:03:05 +0200237 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 01:05:56 -0800238 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 08:40:04 -0700252 EXPECT_FALSE(buf1.empty());
253 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 01:05:56 -0800254}
255
256TEST(BufferTest, TestLambdaSetAppendSigned) {
Yves Gerey665174f2018-06-19 15:03:05 +0200257 auto setter = [](rtc::ArrayView<int8_t> av) {
ossub01c7812016-02-24 01:05:56 -0800258 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 08:40:04 -0700272 EXPECT_FALSE(buf1.empty());
273 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 01:05:56 -0800274}
275
276TEST(BufferTest, TestLambdaAppendEmpty) {
Yves Gerey665174f2018-06-19 15:03:05 +0200277 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 01:05:56 -0800278 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 08:40:04 -0700290 EXPECT_FALSE(buf1.empty());
291 EXPECT_FALSE(buf2.empty());
ossub01c7812016-02-24 01:05:56 -0800292}
293
294TEST(BufferTest, TestLambdaAppendPartial) {
Yves Gerey665174f2018-06-19 15:03:05 +0200295 auto setter = [](rtc::ArrayView<uint8_t> av) {
ossub01c7812016-02-24 01:05:56 -0800296 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 15:03:05 +0200303 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 08:40:04 -0700306 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 01:05:56 -0800307}
308
309TEST(BufferTest, TestMutableLambdaSetAppend) {
310 uint8_t magic_number = 17;
Yves Gerey665174f2018-06-19 15:03:05 +0200311 auto setter = [magic_number](rtc::ArrayView<uint8_t> av) mutable {
ossub01c7812016-02-24 01:05:56 -0800312 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 15:03:05 +0200324 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 08:40:04 -0700327 EXPECT_FALSE(buf.empty());
ossub01c7812016-02-24 01:05:56 -0800328
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 09:36:37 -0800334TEST(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 08:40:04 -0700339 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 09:36:37 -0800340
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 08:40:04 -0700351 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 09:36:37 -0800352
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 08:40:04 -0700365 EXPECT_FALSE(buf.empty());
ossub9338ac2016-02-29 09:36:37 -0800366
367 for (size_t i = 0; i != 7u; ++i) {
368 buf[i] = kTestData[i];
369 }
370
Karl Wiberg215963c2020-02-04 14:31:39 +0100371 EXPECT_THAT(buf, ElementsAreArray(kTestData, 7));
ossub9338ac2016-02-29 09:36:37 -0800372}
373
kwiberg1ba21eb2017-04-05 07:38:06 -0700374TEST(BufferTest, TestBeginEnd) {
375 const Buffer cbuf(kTestData);
376 Buffer buf(kTestData);
Steve Anton9de3aac2017-10-24 10:08:26 -0700377 auto* b1 = cbuf.begin();
kwiberg1ba21eb2017-04-05 07:38:06 -0700378 for (auto& x : buf) {
379 EXPECT_EQ(*b1, x);
380 ++b1;
381 ++x;
382 }
383 EXPECT_EQ(cbuf.end(), b1);
Steve Anton9de3aac2017-10-24 10:08:26 -0700384 auto* b2 = buf.begin();
kwiberg1ba21eb2017-04-05 07:38:06 -0700385 for (auto& y : cbuf) {
386 EXPECT_EQ(*b2, y + 1);
387 ++b2;
388 }
389 EXPECT_EQ(buf.end(), b2);
390}
391
kwiberga4ac4782016-04-29 08:00:22 -0700392TEST(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 08:40:04 -0700398 EXPECT_FALSE(buf.empty());
Karl Wiberg215963c2020-02-04 14:31:39 +0100399 EXPECT_THAT(buf, ElementsAreArray(test_data));
kwiberga4ac4782016-04-29 08:00:22 -0700400 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 08:40:04 -0700412 EXPECT_TRUE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700413 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 08:40:04 -0700417 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700418 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 08:40:04 -0700440 EXPECT_FALSE(buf.empty());
kwiberga4ac4782016-04-29 08:00:22 -0700441 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 21:40:37 +0200450TEST(BufferDeathTest, DieOnUseAfterMove) {
Karl Wibergb3b01792018-10-10 12:44:12 +0200451 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 20:02:26 +0100463TEST(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:26 +0000540} // namespace rtc