xref: /aosp_15_r20/external/webrtc/rtc_base/buffer_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
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 "rtc_base/buffer.h"
12 
13 #include <cstdint>
14 #include <utility>
15 
16 #include "absl/strings/string_view.h"
17 #include "api/array_view.h"
18 #include "test/gmock.h"
19 #include "test/gtest.h"
20 
21 namespace rtc {
22 
23 namespace {
24 
25 using ::testing::ElementsAre;
26 using ::testing::ElementsAreArray;
27 
28 // clang-format off
29 const 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 
TestBuf(const Buffer & b1,size_t size,size_t capacity)33 void TestBuf(const Buffer& b1, size_t size, size_t capacity) {
34   EXPECT_EQ(b1.size(), size);
35   EXPECT_EQ(b1.capacity(), capacity);
36 }
37 
38 }  // namespace
39 
TEST(BufferTest,TestConstructEmpty)40 TEST(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);
51 }
52 
TEST(BufferTest,TestConstructData)53 TEST(BufferTest, TestConstructData) {
54   Buffer buf(kTestData, 7);
55   EXPECT_EQ(buf.size(), 7u);
56   EXPECT_EQ(buf.capacity(), 7u);
57   EXPECT_FALSE(buf.empty());
58   EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
59 }
60 
TEST(BufferTest,TestConstructDataWithCapacity)61 TEST(BufferTest, TestConstructDataWithCapacity) {
62   Buffer buf(kTestData, 7, 14);
63   EXPECT_EQ(buf.size(), 7u);
64   EXPECT_EQ(buf.capacity(), 14u);
65   EXPECT_FALSE(buf.empty());
66   EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
67 }
68 
TEST(BufferTest,TestConstructArray)69 TEST(BufferTest, TestConstructArray) {
70   Buffer buf(kTestData);
71   EXPECT_EQ(buf.size(), 16u);
72   EXPECT_EQ(buf.capacity(), 16u);
73   EXPECT_FALSE(buf.empty());
74   EXPECT_EQ(0, memcmp(buf.data(), kTestData, 16));
75 }
76 
TEST(BufferTest,TestStringViewConversion)77 TEST(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 
TEST(BufferTest,TestSetData)84 TEST(BufferTest, TestSetData) {
85   Buffer buf(kTestData + 4, 7);
86   buf.SetData(kTestData, 9);
87   EXPECT_EQ(buf.size(), 9u);
88   EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
89   EXPECT_FALSE(buf.empty());
90   EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
91   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));
96 }
97 
TEST(BufferTest,TestAppendData)98 TEST(BufferTest, TestAppendData) {
99   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));
103   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 
TEST(BufferTest,TestSetAndAppendWithUnknownArg)110 TEST(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);
119   EXPECT_THAT(buf, ElementsAre(0, 1, 2));
120   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));
124   EXPECT_THAT(buf, ElementsAre(0, 1, 2, 0, 1, 2));
125 }
126 
TEST(BufferTest,TestSetSizeSmaller)127 TEST(BufferTest, TestSetSizeSmaller) {
128   Buffer buf;
129   buf.SetData(kTestData, 15);
130   buf.SetSize(10);
131   EXPECT_EQ(buf.size(), 10u);
132   EXPECT_EQ(buf.capacity(), 15u);  // Hasn't shrunk.
133   EXPECT_FALSE(buf.empty());
134   EXPECT_EQ(buf, Buffer(kTestData, 10));
135 }
136 
TEST(BufferTest,TestSetSizeLarger)137 TEST(BufferTest, TestSetSizeLarger) {
138   Buffer buf;
139   buf.SetData(kTestData, 15);
140   EXPECT_EQ(buf.size(), 15u);
141   EXPECT_EQ(buf.capacity(), 15u);
142   EXPECT_FALSE(buf.empty());
143   buf.SetSize(20);
144   EXPECT_EQ(buf.size(), 20u);
145   EXPECT_EQ(buf.capacity(), 15u * 3 / 2);  // Has grown.
146   EXPECT_FALSE(buf.empty());
147   EXPECT_EQ(0, memcmp(buf.data(), kTestData, 15));
148 }
149 
TEST(BufferTest,TestEnsureCapacitySmaller)150 TEST(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.
156   EXPECT_FALSE(buf.empty());
157   EXPECT_EQ(buf, Buffer(kTestData));
158 }
159 
TEST(BufferTest,TestEnsureCapacityLarger)160 TEST(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.
167   EXPECT_FALSE(buf.empty());
168   EXPECT_EQ(buf, Buffer(kTestData, 10));
169 }
170 
TEST(BufferTest,TestMoveConstruct)171 TEST(BufferTest, TestMoveConstruct) {
172   Buffer buf1(kTestData, 3, 40);
173   const uint8_t* data = buf1.data();
174   Buffer buf2(std::move(buf1));
175   EXPECT_EQ(buf2.size(), 3u);
176   EXPECT_EQ(buf2.capacity(), 40u);
177   EXPECT_EQ(buf2.data(), data);
178   EXPECT_FALSE(buf2.empty());
179   buf1.Clear();
180   EXPECT_EQ(buf1.size(), 0u);
181   EXPECT_EQ(buf1.capacity(), 0u);
182   EXPECT_EQ(buf1.data(), nullptr);
183   EXPECT_TRUE(buf1.empty());
184 }
185 
TEST(BufferTest,TestMoveAssign)186 TEST(BufferTest, TestMoveAssign) {
187   Buffer buf1(kTestData, 3, 40);
188   const uint8_t* data = buf1.data();
189   Buffer buf2(kTestData);
190   buf2 = std::move(buf1);
191   EXPECT_EQ(buf2.size(), 3u);
192   EXPECT_EQ(buf2.capacity(), 40u);
193   EXPECT_EQ(buf2.data(), data);
194   EXPECT_FALSE(buf2.empty());
195   buf1.Clear();
196   EXPECT_EQ(buf1.size(), 0u);
197   EXPECT_EQ(buf1.capacity(), 0u);
198   EXPECT_EQ(buf1.data(), nullptr);
199   EXPECT_TRUE(buf1.empty());
200 }
201 
TEST(BufferTest,TestMoveAssignSelf)202 TEST(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 
TEST(BufferTest,TestSwap)213 TEST(BufferTest, TestSwap) {
214   Buffer buf1(kTestData, 3);
215   Buffer buf2(kTestData, 6, 40);
216   uint8_t* data1 = buf1.data();
217   uint8_t* data2 = buf2.data();
218   using std::swap;
219   swap(buf1, buf2);
220   EXPECT_EQ(buf1.size(), 6u);
221   EXPECT_EQ(buf1.capacity(), 40u);
222   EXPECT_EQ(buf1.data(), data2);
223   EXPECT_FALSE(buf1.empty());
224   EXPECT_EQ(buf2.size(), 3u);
225   EXPECT_EQ(buf2.capacity(), 3u);
226   EXPECT_EQ(buf2.data(), data1);
227   EXPECT_FALSE(buf2.empty());
228 }
229 
TEST(BufferTest,TestClear)230 TEST(BufferTest, TestClear) {
231   Buffer buf;
232   buf.SetData(kTestData, 15);
233   EXPECT_EQ(buf.size(), 15u);
234   EXPECT_EQ(buf.capacity(), 15u);
235   EXPECT_FALSE(buf.empty());
236   const char* data = buf.data<char>();
237   buf.Clear();
238   EXPECT_EQ(buf.size(), 0u);
239   EXPECT_EQ(buf.capacity(), 15u);     // Hasn't shrunk.
240   EXPECT_EQ(buf.data<char>(), data);  // No reallocation.
241   EXPECT_TRUE(buf.empty());
242 }
243 
TEST(BufferTest,TestLambdaSetAppend)244 TEST(BufferTest, TestLambdaSetAppend) {
245   auto setter = [](rtc::ArrayView<uint8_t> av) {
246     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());
260   EXPECT_FALSE(buf1.empty());
261   EXPECT_FALSE(buf2.empty());
262 }
263 
TEST(BufferTest,TestLambdaSetAppendSigned)264 TEST(BufferTest, TestLambdaSetAppendSigned) {
265   auto setter = [](rtc::ArrayView<int8_t> av) {
266     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());
280   EXPECT_FALSE(buf1.empty());
281   EXPECT_FALSE(buf2.empty());
282 }
283 
TEST(BufferTest,TestLambdaAppendEmpty)284 TEST(BufferTest, TestLambdaAppendEmpty) {
285   auto setter = [](rtc::ArrayView<uint8_t> av) {
286     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());
298   EXPECT_FALSE(buf1.empty());
299   EXPECT_FALSE(buf2.empty());
300 }
301 
TEST(BufferTest,TestLambdaAppendPartial)302 TEST(BufferTest, TestLambdaAppendPartial) {
303   auto setter = [](rtc::ArrayView<uint8_t> av) {
304     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);
311   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.
314   EXPECT_FALSE(buf.empty());
315 }
316 
TEST(BufferTest,TestMutableLambdaSetAppend)317 TEST(BufferTest, TestMutableLambdaSetAppend) {
318   uint8_t magic_number = 17;
319   auto setter = [magic_number](rtc::ArrayView<uint8_t> av) mutable {
320     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);
332   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.
335   EXPECT_FALSE(buf.empty());
336 
337   for (uint8_t i = 0; i != buf.size(); ++i) {
338     EXPECT_EQ(buf.data()[i], magic_number + i);
339   }
340 }
341 
TEST(BufferTest,TestBracketRead)342 TEST(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);
347   EXPECT_FALSE(buf.empty());
348 
349   for (size_t i = 0; i != 7u; ++i) {
350     EXPECT_EQ(buf[i], kTestData[i]);
351   }
352 }
353 
TEST(BufferTest,TestBracketReadConst)354 TEST(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);
359   EXPECT_FALSE(buf.empty());
360 
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 
TEST(BufferTest,TestBracketWrite)368 TEST(BufferTest, TestBracketWrite) {
369   Buffer buf(7);
370   EXPECT_EQ(buf.size(), 7u);
371   EXPECT_EQ(buf.capacity(), 7u);
372   EXPECT_NE(buf.data(), nullptr);
373   EXPECT_FALSE(buf.empty());
374 
375   for (size_t i = 0; i != 7u; ++i) {
376     buf[i] = kTestData[i];
377   }
378 
379   EXPECT_THAT(buf, ElementsAreArray(kTestData, 7));
380 }
381 
TEST(BufferTest,TestBeginEnd)382 TEST(BufferTest, TestBeginEnd) {
383   const Buffer cbuf(kTestData);
384   Buffer buf(kTestData);
385   auto* b1 = cbuf.begin();
386   for (auto& x : buf) {
387     EXPECT_EQ(*b1, x);
388     ++b1;
389     ++x;
390   }
391   EXPECT_EQ(cbuf.end(), b1);
392   auto* b2 = buf.begin();
393   for (auto& y : cbuf) {
394     EXPECT_EQ(*b2, y + 1);
395     ++b2;
396   }
397   EXPECT_EQ(buf.end(), b2);
398 }
399 
TEST(BufferTest,TestInt16)400 TEST(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);
406   EXPECT_FALSE(buf.empty());
407   EXPECT_THAT(buf, ElementsAreArray(test_data));
408   BufferT<int16_t> buf2(test_data);
409   EXPECT_EQ(buf, buf2);
410   buf2[0] = 9;
411   EXPECT_NE(buf, buf2);
412 }
413 
TEST(BufferTest,TestFloat)414 TEST(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);
420   EXPECT_TRUE(buf.empty());
421   buf.SetData(test_data);
422   EXPECT_EQ(buf.size(), 5u);
423   EXPECT_EQ(buf.capacity(), 5u);
424   EXPECT_NE(buf.data(), nullptr);
425   EXPECT_FALSE(buf.empty());
426   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 
TEST(BufferTest,TestStruct)439 TEST(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);
448   EXPECT_FALSE(buf.empty());
449   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 
TEST(BufferDeathTest,DieOnUseAfterMove)458 TEST(BufferDeathTest, DieOnUseAfterMove) {
459   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 
TEST(ZeroOnFreeBufferTest,TestZeroOnSetData)471 TEST(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 
TEST(ZeroOnFreeBufferTest,TestZeroOnSetDataFromSetter)490 TEST(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 
TEST(ZeroOnFreeBufferTest,TestZeroOnSetSize)515 TEST(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 
TEST(ZeroOnFreeBufferTest,TestZeroOnClear)533 TEST(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 
548 }  // namespace rtc
549