1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <cstdint>
14*d9f75844SAndroid Build Coastguard Worker #include <utility>
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
17*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h"
18*d9f75844SAndroid Build Coastguard Worker #include "test/gmock.h"
19*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
20*d9f75844SAndroid Build Coastguard Worker
21*d9f75844SAndroid Build Coastguard Worker namespace rtc {
22*d9f75844SAndroid Build Coastguard Worker
23*d9f75844SAndroid Build Coastguard Worker namespace {
24*d9f75844SAndroid Build Coastguard Worker
25*d9f75844SAndroid Build Coastguard Worker using ::testing::ElementsAre;
26*d9f75844SAndroid Build Coastguard Worker using ::testing::ElementsAreArray;
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker // clang-format off
29*d9f75844SAndroid Build Coastguard Worker const uint8_t kTestData[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
30*d9f75844SAndroid Build Coastguard Worker 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
31*d9f75844SAndroid Build Coastguard Worker // clang-format on
32*d9f75844SAndroid Build Coastguard Worker
TestBuf(const Buffer & b1,size_t size,size_t capacity)33*d9f75844SAndroid Build Coastguard Worker void TestBuf(const Buffer& b1, size_t size, size_t capacity) {
34*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(b1.size(), size);
35*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(b1.capacity(), capacity);
36*d9f75844SAndroid Build Coastguard Worker }
37*d9f75844SAndroid Build Coastguard Worker
38*d9f75844SAndroid Build Coastguard Worker } // namespace
39*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestConstructEmpty)40*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestConstructEmpty) {
41*d9f75844SAndroid Build Coastguard Worker TestBuf(Buffer(), 0, 0);
42*d9f75844SAndroid Build Coastguard Worker TestBuf(Buffer(Buffer()), 0, 0);
43*d9f75844SAndroid Build Coastguard Worker TestBuf(Buffer(0), 0, 0);
44*d9f75844SAndroid Build Coastguard Worker
45*d9f75844SAndroid Build Coastguard Worker // We can't use a literal 0 for the first argument, because C++ will allow
46*d9f75844SAndroid Build Coastguard Worker // that to be considered a null pointer, which makes the call ambiguous.
47*d9f75844SAndroid Build Coastguard Worker TestBuf(Buffer(0 + 0, 10), 0, 10);
48*d9f75844SAndroid Build Coastguard Worker
49*d9f75844SAndroid Build Coastguard Worker TestBuf(Buffer(kTestData, 0), 0, 0);
50*d9f75844SAndroid Build Coastguard Worker TestBuf(Buffer(kTestData, 0, 20), 0, 20);
51*d9f75844SAndroid Build Coastguard Worker }
52*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestConstructData)53*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestConstructData) {
54*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData, 7);
55*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 7u);
56*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 7u);
57*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
58*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
59*d9f75844SAndroid Build Coastguard Worker }
60*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestConstructDataWithCapacity)61*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestConstructDataWithCapacity) {
62*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData, 7, 14);
63*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 7u);
64*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 14u);
65*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
66*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
67*d9f75844SAndroid Build Coastguard Worker }
68*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestConstructArray)69*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestConstructArray) {
70*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData);
71*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 16u);
72*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 16u);
73*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
74*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data(), kTestData, 16));
75*d9f75844SAndroid Build Coastguard Worker }
76*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestStringViewConversion)77*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestStringViewConversion) {
78*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData);
79*d9f75844SAndroid Build Coastguard Worker absl::string_view view = buf;
80*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(view,
81*d9f75844SAndroid Build Coastguard Worker absl::string_view(reinterpret_cast<const char*>(kTestData), 16u));
82*d9f75844SAndroid Build Coastguard Worker }
83*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestSetData)84*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestSetData) {
85*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData + 4, 7);
86*d9f75844SAndroid Build Coastguard Worker buf.SetData(kTestData, 9);
87*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 9u);
88*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
89*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
90*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
91*d9f75844SAndroid Build Coastguard Worker Buffer buf2;
92*d9f75844SAndroid Build Coastguard Worker buf2.SetData(buf);
93*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 9u);
94*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
95*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
96*d9f75844SAndroid Build Coastguard Worker }
97*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestAppendData)98*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestAppendData) {
99*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData + 4, 3);
100*d9f75844SAndroid Build Coastguard Worker buf.AppendData(kTestData + 10, 2);
101*d9f75844SAndroid Build Coastguard Worker const int8_t exp[] = {0x4, 0x5, 0x6, 0xa, 0xb};
102*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf, Buffer(exp));
103*d9f75844SAndroid Build Coastguard Worker Buffer buf2;
104*d9f75844SAndroid Build Coastguard Worker buf2.AppendData(buf);
105*d9f75844SAndroid Build Coastguard Worker buf2.AppendData(rtc::ArrayView<uint8_t>(buf));
106*d9f75844SAndroid Build Coastguard Worker const int8_t exp2[] = {0x4, 0x5, 0x6, 0xa, 0xb, 0x4, 0x5, 0x6, 0xa, 0xb};
107*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2, Buffer(exp2));
108*d9f75844SAndroid Build Coastguard Worker }
109*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestSetAndAppendWithUnknownArg)110*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestSetAndAppendWithUnknownArg) {
111*d9f75844SAndroid Build Coastguard Worker struct TestDataContainer {
112*d9f75844SAndroid Build Coastguard Worker size_t size() const { return 3; }
113*d9f75844SAndroid Build Coastguard Worker const uint8_t* data() const { return kTestData; }
114*d9f75844SAndroid Build Coastguard Worker };
115*d9f75844SAndroid Build Coastguard Worker Buffer buf;
116*d9f75844SAndroid Build Coastguard Worker buf.SetData(TestDataContainer());
117*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(3u, buf.size());
118*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(Buffer(kTestData, 3), buf);
119*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(buf, ElementsAre(0, 1, 2));
120*d9f75844SAndroid Build Coastguard Worker buf.AppendData(TestDataContainer());
121*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(6u, buf.size());
122*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data(), kTestData, 3));
123*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data() + 3, kTestData, 3));
124*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(buf, ElementsAre(0, 1, 2, 0, 1, 2));
125*d9f75844SAndroid Build Coastguard Worker }
126*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestSetSizeSmaller)127*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestSetSizeSmaller) {
128*d9f75844SAndroid Build Coastguard Worker Buffer buf;
129*d9f75844SAndroid Build Coastguard Worker buf.SetData(kTestData, 15);
130*d9f75844SAndroid Build Coastguard Worker buf.SetSize(10);
131*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 10u);
132*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
133*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
134*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf, Buffer(kTestData, 10));
135*d9f75844SAndroid Build Coastguard Worker }
136*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestSetSizeLarger)137*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestSetSizeLarger) {
138*d9f75844SAndroid Build Coastguard Worker Buffer buf;
139*d9f75844SAndroid Build Coastguard Worker buf.SetData(kTestData, 15);
140*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 15u);
141*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 15u);
142*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
143*d9f75844SAndroid Build Coastguard Worker buf.SetSize(20);
144*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 20u);
145*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 15u * 3 / 2); // Has grown.
146*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
147*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data(), kTestData, 15));
148*d9f75844SAndroid Build Coastguard Worker }
149*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestEnsureCapacitySmaller)150*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestEnsureCapacitySmaller) {
151*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData);
152*d9f75844SAndroid Build Coastguard Worker const char* data = buf.data<char>();
153*d9f75844SAndroid Build Coastguard Worker buf.EnsureCapacity(4);
154*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 16u); // Hasn't shrunk.
155*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.data<char>(), data); // No reallocation.
156*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
157*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf, Buffer(kTestData));
158*d9f75844SAndroid Build Coastguard Worker }
159*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestEnsureCapacityLarger)160*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestEnsureCapacityLarger) {
161*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData, 5);
162*d9f75844SAndroid Build Coastguard Worker buf.EnsureCapacity(10);
163*d9f75844SAndroid Build Coastguard Worker const int8_t* data = buf.data<int8_t>();
164*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 10u);
165*d9f75844SAndroid Build Coastguard Worker buf.AppendData(kTestData + 5, 5);
166*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.data<int8_t>(), data); // No reallocation.
167*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
168*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf, Buffer(kTestData, 10));
169*d9f75844SAndroid Build Coastguard Worker }
170*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestMoveConstruct)171*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestMoveConstruct) {
172*d9f75844SAndroid Build Coastguard Worker Buffer buf1(kTestData, 3, 40);
173*d9f75844SAndroid Build Coastguard Worker const uint8_t* data = buf1.data();
174*d9f75844SAndroid Build Coastguard Worker Buffer buf2(std::move(buf1));
175*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.size(), 3u);
176*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.capacity(), 40u);
177*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.data(), data);
178*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf2.empty());
179*d9f75844SAndroid Build Coastguard Worker buf1.Clear();
180*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.size(), 0u);
181*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.capacity(), 0u);
182*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.data(), nullptr);
183*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(buf1.empty());
184*d9f75844SAndroid Build Coastguard Worker }
185*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestMoveAssign)186*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestMoveAssign) {
187*d9f75844SAndroid Build Coastguard Worker Buffer buf1(kTestData, 3, 40);
188*d9f75844SAndroid Build Coastguard Worker const uint8_t* data = buf1.data();
189*d9f75844SAndroid Build Coastguard Worker Buffer buf2(kTestData);
190*d9f75844SAndroid Build Coastguard Worker buf2 = std::move(buf1);
191*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.size(), 3u);
192*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.capacity(), 40u);
193*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.data(), data);
194*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf2.empty());
195*d9f75844SAndroid Build Coastguard Worker buf1.Clear();
196*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.size(), 0u);
197*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.capacity(), 0u);
198*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.data(), nullptr);
199*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(buf1.empty());
200*d9f75844SAndroid Build Coastguard Worker }
201*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestMoveAssignSelf)202*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestMoveAssignSelf) {
203*d9f75844SAndroid Build Coastguard Worker // Move self-assignment isn't required to produce a meaningful state, but
204*d9f75844SAndroid Build Coastguard Worker // should not leave the object in an inconsistent state. (Such inconsistent
205*d9f75844SAndroid Build Coastguard Worker // state could be caught by the DCHECKs and/or by the leak checker.) We need
206*d9f75844SAndroid Build Coastguard Worker // to be sneaky when testing this; if we're doing a too-obvious
207*d9f75844SAndroid Build Coastguard Worker // move-assign-to-self, clang's -Wself-move triggers at compile time.
208*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData, 3, 40);
209*d9f75844SAndroid Build Coastguard Worker Buffer* buf_ptr = &buf;
210*d9f75844SAndroid Build Coastguard Worker buf = std::move(*buf_ptr);
211*d9f75844SAndroid Build Coastguard Worker }
212*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestSwap)213*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestSwap) {
214*d9f75844SAndroid Build Coastguard Worker Buffer buf1(kTestData, 3);
215*d9f75844SAndroid Build Coastguard Worker Buffer buf2(kTestData, 6, 40);
216*d9f75844SAndroid Build Coastguard Worker uint8_t* data1 = buf1.data();
217*d9f75844SAndroid Build Coastguard Worker uint8_t* data2 = buf2.data();
218*d9f75844SAndroid Build Coastguard Worker using std::swap;
219*d9f75844SAndroid Build Coastguard Worker swap(buf1, buf2);
220*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.size(), 6u);
221*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.capacity(), 40u);
222*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.data(), data2);
223*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf1.empty());
224*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.size(), 3u);
225*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.capacity(), 3u);
226*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.data(), data1);
227*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf2.empty());
228*d9f75844SAndroid Build Coastguard Worker }
229*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestClear)230*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestClear) {
231*d9f75844SAndroid Build Coastguard Worker Buffer buf;
232*d9f75844SAndroid Build Coastguard Worker buf.SetData(kTestData, 15);
233*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 15u);
234*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 15u);
235*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
236*d9f75844SAndroid Build Coastguard Worker const char* data = buf.data<char>();
237*d9f75844SAndroid Build Coastguard Worker buf.Clear();
238*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 0u);
239*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 15u); // Hasn't shrunk.
240*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.data<char>(), data); // No reallocation.
241*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(buf.empty());
242*d9f75844SAndroid Build Coastguard Worker }
243*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestLambdaSetAppend)244*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestLambdaSetAppend) {
245*d9f75844SAndroid Build Coastguard Worker auto setter = [](rtc::ArrayView<uint8_t> av) {
246*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i != 15; ++i)
247*d9f75844SAndroid Build Coastguard Worker av[i] = kTestData[i];
248*d9f75844SAndroid Build Coastguard Worker return 15;
249*d9f75844SAndroid Build Coastguard Worker };
250*d9f75844SAndroid Build Coastguard Worker
251*d9f75844SAndroid Build Coastguard Worker Buffer buf1;
252*d9f75844SAndroid Build Coastguard Worker buf1.SetData(kTestData, 15);
253*d9f75844SAndroid Build Coastguard Worker buf1.AppendData(kTestData, 15);
254*d9f75844SAndroid Build Coastguard Worker
255*d9f75844SAndroid Build Coastguard Worker Buffer buf2;
256*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.SetData(15, setter), 15u);
257*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.AppendData(15, setter), 15u);
258*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1, buf2);
259*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.capacity(), buf2.capacity());
260*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf1.empty());
261*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf2.empty());
262*d9f75844SAndroid Build Coastguard Worker }
263*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestLambdaSetAppendSigned)264*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestLambdaSetAppendSigned) {
265*d9f75844SAndroid Build Coastguard Worker auto setter = [](rtc::ArrayView<int8_t> av) {
266*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i != 15; ++i)
267*d9f75844SAndroid Build Coastguard Worker av[i] = kTestData[i];
268*d9f75844SAndroid Build Coastguard Worker return 15;
269*d9f75844SAndroid Build Coastguard Worker };
270*d9f75844SAndroid Build Coastguard Worker
271*d9f75844SAndroid Build Coastguard Worker Buffer buf1;
272*d9f75844SAndroid Build Coastguard Worker buf1.SetData(kTestData, 15);
273*d9f75844SAndroid Build Coastguard Worker buf1.AppendData(kTestData, 15);
274*d9f75844SAndroid Build Coastguard Worker
275*d9f75844SAndroid Build Coastguard Worker Buffer buf2;
276*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.SetData<int8_t>(15, setter), 15u);
277*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.AppendData<int8_t>(15, setter), 15u);
278*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1, buf2);
279*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.capacity(), buf2.capacity());
280*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf1.empty());
281*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf2.empty());
282*d9f75844SAndroid Build Coastguard Worker }
283*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestLambdaAppendEmpty)284*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestLambdaAppendEmpty) {
285*d9f75844SAndroid Build Coastguard Worker auto setter = [](rtc::ArrayView<uint8_t> av) {
286*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i != 15; ++i)
287*d9f75844SAndroid Build Coastguard Worker av[i] = kTestData[i];
288*d9f75844SAndroid Build Coastguard Worker return 15;
289*d9f75844SAndroid Build Coastguard Worker };
290*d9f75844SAndroid Build Coastguard Worker
291*d9f75844SAndroid Build Coastguard Worker Buffer buf1;
292*d9f75844SAndroid Build Coastguard Worker buf1.SetData(kTestData, 15);
293*d9f75844SAndroid Build Coastguard Worker
294*d9f75844SAndroid Build Coastguard Worker Buffer buf2;
295*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.AppendData(15, setter), 15u);
296*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1, buf2);
297*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf1.capacity(), buf2.capacity());
298*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf1.empty());
299*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf2.empty());
300*d9f75844SAndroid Build Coastguard Worker }
301*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestLambdaAppendPartial)302*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestLambdaAppendPartial) {
303*d9f75844SAndroid Build Coastguard Worker auto setter = [](rtc::ArrayView<uint8_t> av) {
304*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i != 7; ++i)
305*d9f75844SAndroid Build Coastguard Worker av[i] = kTestData[i];
306*d9f75844SAndroid Build Coastguard Worker return 7;
307*d9f75844SAndroid Build Coastguard Worker };
308*d9f75844SAndroid Build Coastguard Worker
309*d9f75844SAndroid Build Coastguard Worker Buffer buf;
310*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.AppendData(15, setter), 7u);
311*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 7u); // Size is exactly what we wrote.
312*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(buf.capacity(), 7u); // Capacity is valid.
313*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
314*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
315*d9f75844SAndroid Build Coastguard Worker }
316*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestMutableLambdaSetAppend)317*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestMutableLambdaSetAppend) {
318*d9f75844SAndroid Build Coastguard Worker uint8_t magic_number = 17;
319*d9f75844SAndroid Build Coastguard Worker auto setter = [magic_number](rtc::ArrayView<uint8_t> av) mutable {
320*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i != 15; ++i) {
321*d9f75844SAndroid Build Coastguard Worker av[i] = magic_number;
322*d9f75844SAndroid Build Coastguard Worker ++magic_number;
323*d9f75844SAndroid Build Coastguard Worker }
324*d9f75844SAndroid Build Coastguard Worker return 15;
325*d9f75844SAndroid Build Coastguard Worker };
326*d9f75844SAndroid Build Coastguard Worker
327*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(magic_number, 17);
328*d9f75844SAndroid Build Coastguard Worker
329*d9f75844SAndroid Build Coastguard Worker Buffer buf;
330*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.SetData(15, setter), 15u);
331*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.AppendData(15, setter), 15u);
332*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 30u); // Size is exactly what we wrote.
333*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(buf.capacity(), 30u); // Capacity is valid.
334*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
335*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
336*d9f75844SAndroid Build Coastguard Worker
337*d9f75844SAndroid Build Coastguard Worker for (uint8_t i = 0; i != buf.size(); ++i) {
338*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.data()[i], magic_number + i);
339*d9f75844SAndroid Build Coastguard Worker }
340*d9f75844SAndroid Build Coastguard Worker }
341*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestBracketRead)342*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestBracketRead) {
343*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData, 7);
344*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 7u);
345*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 7u);
346*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf.data(), nullptr);
347*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
348*d9f75844SAndroid Build Coastguard Worker
349*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i != 7u; ++i) {
350*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf[i], kTestData[i]);
351*d9f75844SAndroid Build Coastguard Worker }
352*d9f75844SAndroid Build Coastguard Worker }
353*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestBracketReadConst)354*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestBracketReadConst) {
355*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData, 7);
356*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 7u);
357*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 7u);
358*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf.data(), nullptr);
359*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
360*d9f75844SAndroid Build Coastguard Worker
361*d9f75844SAndroid Build Coastguard Worker const Buffer& cbuf = buf;
362*d9f75844SAndroid Build Coastguard Worker
363*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i != 7u; ++i) {
364*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cbuf[i], kTestData[i]);
365*d9f75844SAndroid Build Coastguard Worker }
366*d9f75844SAndroid Build Coastguard Worker }
367*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestBracketWrite)368*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestBracketWrite) {
369*d9f75844SAndroid Build Coastguard Worker Buffer buf(7);
370*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 7u);
371*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 7u);
372*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf.data(), nullptr);
373*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
374*d9f75844SAndroid Build Coastguard Worker
375*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i != 7u; ++i) {
376*d9f75844SAndroid Build Coastguard Worker buf[i] = kTestData[i];
377*d9f75844SAndroid Build Coastguard Worker }
378*d9f75844SAndroid Build Coastguard Worker
379*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(buf, ElementsAreArray(kTestData, 7));
380*d9f75844SAndroid Build Coastguard Worker }
381*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestBeginEnd)382*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestBeginEnd) {
383*d9f75844SAndroid Build Coastguard Worker const Buffer cbuf(kTestData);
384*d9f75844SAndroid Build Coastguard Worker Buffer buf(kTestData);
385*d9f75844SAndroid Build Coastguard Worker auto* b1 = cbuf.begin();
386*d9f75844SAndroid Build Coastguard Worker for (auto& x : buf) {
387*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(*b1, x);
388*d9f75844SAndroid Build Coastguard Worker ++b1;
389*d9f75844SAndroid Build Coastguard Worker ++x;
390*d9f75844SAndroid Build Coastguard Worker }
391*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cbuf.end(), b1);
392*d9f75844SAndroid Build Coastguard Worker auto* b2 = buf.begin();
393*d9f75844SAndroid Build Coastguard Worker for (auto& y : cbuf) {
394*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(*b2, y + 1);
395*d9f75844SAndroid Build Coastguard Worker ++b2;
396*d9f75844SAndroid Build Coastguard Worker }
397*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.end(), b2);
398*d9f75844SAndroid Build Coastguard Worker }
399*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestInt16)400*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestInt16) {
401*d9f75844SAndroid Build Coastguard Worker static constexpr int16_t test_data[] = {14, 15, 16, 17, 18};
402*d9f75844SAndroid Build Coastguard Worker BufferT<int16_t> buf(test_data);
403*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 5u);
404*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 5u);
405*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf.data(), nullptr);
406*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
407*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(buf, ElementsAreArray(test_data));
408*d9f75844SAndroid Build Coastguard Worker BufferT<int16_t> buf2(test_data);
409*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf, buf2);
410*d9f75844SAndroid Build Coastguard Worker buf2[0] = 9;
411*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf, buf2);
412*d9f75844SAndroid Build Coastguard Worker }
413*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestFloat)414*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestFloat) {
415*d9f75844SAndroid Build Coastguard Worker static constexpr float test_data[] = {14, 15, 16, 17, 18};
416*d9f75844SAndroid Build Coastguard Worker BufferT<float> buf;
417*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 0u);
418*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 0u);
419*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.data(), nullptr);
420*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(buf.empty());
421*d9f75844SAndroid Build Coastguard Worker buf.SetData(test_data);
422*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 5u);
423*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 5u);
424*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf.data(), nullptr);
425*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
426*d9f75844SAndroid Build Coastguard Worker float* p1 = buf.data();
427*d9f75844SAndroid Build Coastguard Worker while (buf.data() == p1) {
428*d9f75844SAndroid Build Coastguard Worker buf.AppendData(test_data);
429*d9f75844SAndroid Build Coastguard Worker }
430*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), buf.capacity());
431*d9f75844SAndroid Build Coastguard Worker EXPECT_GT(buf.size(), 5u);
432*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size() % 5, 0u);
433*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf.data(), nullptr);
434*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i != buf.size(); ++i) {
435*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(test_data[i % 5], buf[i]);
436*d9f75844SAndroid Build Coastguard Worker }
437*d9f75844SAndroid Build Coastguard Worker }
438*d9f75844SAndroid Build Coastguard Worker
TEST(BufferTest,TestStruct)439*d9f75844SAndroid Build Coastguard Worker TEST(BufferTest, TestStruct) {
440*d9f75844SAndroid Build Coastguard Worker struct BloodStone {
441*d9f75844SAndroid Build Coastguard Worker bool blood;
442*d9f75844SAndroid Build Coastguard Worker const char* stone;
443*d9f75844SAndroid Build Coastguard Worker };
444*d9f75844SAndroid Build Coastguard Worker BufferT<BloodStone> buf(4);
445*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.size(), 4u);
446*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf.capacity(), 4u);
447*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(buf.data(), nullptr);
448*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(buf.empty());
449*d9f75844SAndroid Build Coastguard Worker BufferT<BloodStone*> buf2(4);
450*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i < buf2.size(); ++i) {
451*d9f75844SAndroid Build Coastguard Worker buf2[i] = &buf[i];
452*d9f75844SAndroid Build Coastguard Worker }
453*d9f75844SAndroid Build Coastguard Worker static const char kObsidian[] = "obsidian";
454*d9f75844SAndroid Build Coastguard Worker buf2[2]->stone = kObsidian;
455*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kObsidian, buf[2].stone);
456*d9f75844SAndroid Build Coastguard Worker }
457*d9f75844SAndroid Build Coastguard Worker
TEST(BufferDeathTest,DieOnUseAfterMove)458*d9f75844SAndroid Build Coastguard Worker TEST(BufferDeathTest, DieOnUseAfterMove) {
459*d9f75844SAndroid Build Coastguard Worker Buffer buf(17);
460*d9f75844SAndroid Build Coastguard Worker Buffer buf2 = std::move(buf);
461*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buf2.size(), 17u);
462*d9f75844SAndroid Build Coastguard Worker #if RTC_DCHECK_IS_ON
463*d9f75844SAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
464*d9f75844SAndroid Build Coastguard Worker EXPECT_DEATH(buf.empty(), "");
465*d9f75844SAndroid Build Coastguard Worker #endif
466*d9f75844SAndroid Build Coastguard Worker #else
467*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(buf.empty());
468*d9f75844SAndroid Build Coastguard Worker #endif
469*d9f75844SAndroid Build Coastguard Worker }
470*d9f75844SAndroid Build Coastguard Worker
TEST(ZeroOnFreeBufferTest,TestZeroOnSetData)471*d9f75844SAndroid Build Coastguard Worker TEST(ZeroOnFreeBufferTest, TestZeroOnSetData) {
472*d9f75844SAndroid Build Coastguard Worker ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
473*d9f75844SAndroid Build Coastguard Worker const uint8_t* old_data = buf.data();
474*d9f75844SAndroid Build Coastguard Worker const size_t old_capacity = buf.capacity();
475*d9f75844SAndroid Build Coastguard Worker const size_t old_size = buf.size();
476*d9f75844SAndroid Build Coastguard Worker constexpr size_t offset = 1;
477*d9f75844SAndroid Build Coastguard Worker buf.SetData(kTestData + offset, 2);
478*d9f75844SAndroid Build Coastguard Worker // Sanity checks to make sure the underlying heap memory was not reallocated.
479*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_data, buf.data());
480*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_capacity, buf.capacity());
481*d9f75844SAndroid Build Coastguard Worker // The first two elements have been overwritten, and the remaining five have
482*d9f75844SAndroid Build Coastguard Worker // been zeroed.
483*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kTestData[offset], buf[0]);
484*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kTestData[offset + 1], buf[1]);
485*d9f75844SAndroid Build Coastguard Worker for (size_t i = 2; i < old_size; i++) {
486*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, old_data[i]);
487*d9f75844SAndroid Build Coastguard Worker }
488*d9f75844SAndroid Build Coastguard Worker }
489*d9f75844SAndroid Build Coastguard Worker
TEST(ZeroOnFreeBufferTest,TestZeroOnSetDataFromSetter)490*d9f75844SAndroid Build Coastguard Worker TEST(ZeroOnFreeBufferTest, TestZeroOnSetDataFromSetter) {
491*d9f75844SAndroid Build Coastguard Worker static constexpr size_t offset = 1;
492*d9f75844SAndroid Build Coastguard Worker const auto setter = [](rtc::ArrayView<uint8_t> av) {
493*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i != 2; ++i)
494*d9f75844SAndroid Build Coastguard Worker av[i] = kTestData[offset + i];
495*d9f75844SAndroid Build Coastguard Worker return 2;
496*d9f75844SAndroid Build Coastguard Worker };
497*d9f75844SAndroid Build Coastguard Worker
498*d9f75844SAndroid Build Coastguard Worker ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
499*d9f75844SAndroid Build Coastguard Worker const uint8_t* old_data = buf.data();
500*d9f75844SAndroid Build Coastguard Worker const size_t old_capacity = buf.capacity();
501*d9f75844SAndroid Build Coastguard Worker const size_t old_size = buf.size();
502*d9f75844SAndroid Build Coastguard Worker buf.SetData(2, setter);
503*d9f75844SAndroid Build Coastguard Worker // Sanity checks to make sure the underlying heap memory was not reallocated.
504*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_data, buf.data());
505*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_capacity, buf.capacity());
506*d9f75844SAndroid Build Coastguard Worker // The first two elements have been overwritten, and the remaining five have
507*d9f75844SAndroid Build Coastguard Worker // been zeroed.
508*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kTestData[offset], buf[0]);
509*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kTestData[offset + 1], buf[1]);
510*d9f75844SAndroid Build Coastguard Worker for (size_t i = 2; i < old_size; i++) {
511*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, old_data[i]);
512*d9f75844SAndroid Build Coastguard Worker }
513*d9f75844SAndroid Build Coastguard Worker }
514*d9f75844SAndroid Build Coastguard Worker
TEST(ZeroOnFreeBufferTest,TestZeroOnSetSize)515*d9f75844SAndroid Build Coastguard Worker TEST(ZeroOnFreeBufferTest, TestZeroOnSetSize) {
516*d9f75844SAndroid Build Coastguard Worker ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
517*d9f75844SAndroid Build Coastguard Worker const uint8_t* old_data = buf.data();
518*d9f75844SAndroid Build Coastguard Worker const size_t old_capacity = buf.capacity();
519*d9f75844SAndroid Build Coastguard Worker const size_t old_size = buf.size();
520*d9f75844SAndroid Build Coastguard Worker buf.SetSize(2);
521*d9f75844SAndroid Build Coastguard Worker // Sanity checks to make sure the underlying heap memory was not reallocated.
522*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_data, buf.data());
523*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_capacity, buf.capacity());
524*d9f75844SAndroid Build Coastguard Worker // The first two elements have not been modified and the remaining five have
525*d9f75844SAndroid Build Coastguard Worker // been zeroed.
526*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kTestData[0], buf[0]);
527*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kTestData[1], buf[1]);
528*d9f75844SAndroid Build Coastguard Worker for (size_t i = 2; i < old_size; i++) {
529*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, old_data[i]);
530*d9f75844SAndroid Build Coastguard Worker }
531*d9f75844SAndroid Build Coastguard Worker }
532*d9f75844SAndroid Build Coastguard Worker
TEST(ZeroOnFreeBufferTest,TestZeroOnClear)533*d9f75844SAndroid Build Coastguard Worker TEST(ZeroOnFreeBufferTest, TestZeroOnClear) {
534*d9f75844SAndroid Build Coastguard Worker ZeroOnFreeBuffer<uint8_t> buf(kTestData, 7);
535*d9f75844SAndroid Build Coastguard Worker const uint8_t* old_data = buf.data();
536*d9f75844SAndroid Build Coastguard Worker const size_t old_capacity = buf.capacity();
537*d9f75844SAndroid Build Coastguard Worker const size_t old_size = buf.size();
538*d9f75844SAndroid Build Coastguard Worker buf.Clear();
539*d9f75844SAndroid Build Coastguard Worker // Sanity checks to make sure the underlying heap memory was not reallocated.
540*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_data, buf.data());
541*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_capacity, buf.capacity());
542*d9f75844SAndroid Build Coastguard Worker // The underlying memory was not released but cleared.
543*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i < old_size; i++) {
544*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, old_data[i]);
545*d9f75844SAndroid Build Coastguard Worker }
546*d9f75844SAndroid Build Coastguard Worker }
547*d9f75844SAndroid Build Coastguard Worker
548*d9f75844SAndroid Build Coastguard Worker } // namespace rtc
549