Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(330)

Side by Side Diff: webrtc/base/buffer_unittest.cc

Issue 1697743003: Add CopyOnWriteBuffer class (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Feedback from kwiberg. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« webrtc/base/buffer.cc ('K') | « webrtc/base/buffer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 using std::swap; 170 using std::swap;
171 swap(buf1, buf2); 171 swap(buf1, buf2);
172 EXPECT_EQ(buf1.size(), 6u); 172 EXPECT_EQ(buf1.size(), 6u);
173 EXPECT_EQ(buf1.capacity(), 40u); 173 EXPECT_EQ(buf1.capacity(), 40u);
174 EXPECT_EQ(buf1.data(), data2); 174 EXPECT_EQ(buf1.data(), data2);
175 EXPECT_EQ(buf2.size(), 3u); 175 EXPECT_EQ(buf2.size(), 3u);
176 EXPECT_EQ(buf2.capacity(), 3u); 176 EXPECT_EQ(buf2.capacity(), 3u);
177 EXPECT_EQ(buf2.data(), data1); 177 EXPECT_EQ(buf2.data(), data1);
178 } 178 }
179 179
180 void EnsureBuffersEqual(const Buffer& buf1, const Buffer& buf2) {
181 // Data is shared between buffers.
182 EXPECT_EQ(buf1.size(), buf2.size());
183 EXPECT_EQ(buf1.capacity(), buf2.capacity());
184 const uint8_t* data1 = buf1.data();
185 const uint8_t* data2 = buf2.data();
186 EXPECT_EQ(data1, data2);
187 EXPECT_EQ(buf1, buf2);
188 }
189
190 // Move comparison to own function to have const buffers and prevent cloning
191 // from calling non-const "data()".
192 void EnsureBufferDataNotEqual(const Buffer& buf1, const Buffer& buf2) {
193 // Data is not shared between buffers.
194 const uint8_t* data1 = buf1.data();
195 const uint8_t* data2 = buf2.data();
196 EXPECT_NE(data1, data2);
197 }
198
199 TEST(BufferTest, TestSharedAppendData) {
200 Buffer buf1(kTestData, 3, 10);
201 Buffer buf2(buf1);
202
203 EnsureBuffersEqual(buf1, buf2);
204
205 // AppendData copies the underlying buffer.
206 buf2.AppendData("foo");
207 EXPECT_EQ(buf2.size(), buf1.size() + 4); // "foo" + trailing 0x00
208 EXPECT_EQ(buf2.capacity(), buf1.capacity());
209 EXPECT_NE(buf2.data(), buf1.data());
210
211 EXPECT_EQ(buf1, Buffer(kTestData, 3));
212 const int8_t exp[] = {0x0, 0x1, 0x2, 'f', 'o', 'o', 0x0};
213 EXPECT_EQ(buf2, Buffer(exp));
214 }
215
216 TEST(BufferTest, TestSharedSetData) {
217 Buffer buf1(kTestData, 3, 10);
218 Buffer buf2;
219
220 buf2.SetData(buf1);
221 // buf2 shares the same data as buf1 now.
222 EnsureBuffersEqual(buf1, buf2);
223
224 Buffer buf3(buf1);
225 // buf3 is re-allocated with new data, existing buffers are not modified.
226 buf3.SetData("foo");
227 EXPECT_EQ(buf1, Buffer(kTestData, 3));
228 EnsureBuffersEqual(buf1, buf2);
229 EnsureBufferDataNotEqual(buf1, buf3);
230 const int8_t exp[] = {'f', 'o', 'o', 0x0};
231 EXPECT_EQ(buf3, Buffer(exp));
232 }
233
234 TEST(BufferTest, TestSharedEnsureCapacity) {
235 Buffer buf1(kTestData, 3, 10);
236 Buffer buf2(buf1);
237
238 // Smaller than existing capacity -> no change and still same contents.
239 buf2.EnsureCapacity(8);
240 EnsureBuffersEqual(buf1, buf2);
241 EXPECT_EQ(buf1.size(), 3u);
242 EXPECT_EQ(buf1.capacity(), 10u);
243 EXPECT_EQ(buf2.size(), 3u);
244 EXPECT_EQ(buf2.capacity(), 10u);
245
246 // Lager than existing capacity -> data is cloned.
247 buf2.EnsureCapacity(16);
248 EnsureBufferDataNotEqual(buf1, buf2);
249 EXPECT_EQ(buf1.size(), 3u);
250 EXPECT_EQ(buf1.capacity(), 10u);
251 EXPECT_EQ(buf2.size(), 3u);
252 EXPECT_EQ(buf2.capacity(), 16u);
253 // The size and contents are still the same.
254 EXPECT_EQ(buf1, buf2);
255 }
256
257 TEST(BufferTest, TestSharedSetSize) {
258 Buffer buf1(kTestData, 3, 10);
259 Buffer buf2(buf1);
260
261 buf2.SetSize(16);
262 EnsureBufferDataNotEqual(buf1, buf2);
263 EXPECT_EQ(buf1.size(), 3u);
264 EXPECT_EQ(buf1.capacity(), 10u);
265 EXPECT_EQ(buf2.size(), 16u);
266 EXPECT_EQ(buf2.capacity(), 16u);
267 // The contents got cloned.
268 EXPECT_EQ(0, memcmp(buf2.data(), kTestData, 3));
269 }
270
271 TEST(BufferTest, TestSharedClear) {
272 Buffer buf1(kTestData, 3, 10);
273 Buffer buf2(buf1);
274
275 buf2.Clear();
276 EnsureBufferDataNotEqual(buf1, buf2);
277 EXPECT_EQ(buf1.size(), 3u);
278 EXPECT_EQ(buf1.capacity(), 10u);
279 EXPECT_EQ(0, memcmp(buf1.data(), kTestData, 3));
280 EXPECT_EQ(buf2.size(), 0u);
281 EXPECT_EQ(buf2.capacity(), 0u);
282 }
283
180 } // namespace rtc 284 } // namespace rtc
OLDNEW
« webrtc/base/buffer.cc ('K') | « webrtc/base/buffer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698