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

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

Issue 2328553002: Make CopyOnWriteBuffer keep capacity (Closed)
Patch Set: heap_allocation -> original_allocation Created 4 years, 3 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
« no previous file with comments | « webrtc/base/copyonwritebuffer.h ('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 2016 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2016 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 buf2.AppendData("foo"); 109 buf2.AppendData("foo");
110 EXPECT_EQ(buf2.size(), buf1.size() + 4); // "foo" + trailing 0x00 110 EXPECT_EQ(buf2.size(), buf1.size() + 4); // "foo" + trailing 0x00
111 EXPECT_EQ(buf2.capacity(), buf1.capacity()); 111 EXPECT_EQ(buf2.capacity(), buf1.capacity());
112 EXPECT_NE(buf2.data(), buf1.data()); 112 EXPECT_NE(buf2.data(), buf1.data());
113 113
114 EXPECT_EQ(buf1, CopyOnWriteBuffer(kTestData, 3)); 114 EXPECT_EQ(buf1, CopyOnWriteBuffer(kTestData, 3));
115 const int8_t exp[] = {0x0, 0x1, 0x2, 'f', 'o', 'o', 0x0}; 115 const int8_t exp[] = {0x0, 0x1, 0x2, 'f', 'o', 'o', 0x0};
116 EXPECT_EQ(buf2, CopyOnWriteBuffer(exp)); 116 EXPECT_EQ(buf2, CopyOnWriteBuffer(exp));
117 } 117 }
118 118
119 TEST(CopyOnWriteBufferTest, TestSetData) { 119 TEST(CopyOnWriteBufferTest, SetEmptyData) {
120 CopyOnWriteBuffer buf(10);
121
122 buf.SetData<uint8_t>(nullptr, 0);
123
124 EXPECT_EQ(0u, buf.size());
125 }
126
127 TEST(CopyOnWriteBufferTest, SetDataNoMoreThanCapacityDoesntCauseReallocation) {
128 CopyOnWriteBuffer buf1(3, 10);
129 const uint8_t* const original_allocation = buf1.cdata();
130
131 buf1.SetData(kTestData, 10);
132
133 EXPECT_EQ(original_allocation, buf1.cdata());
134 EXPECT_EQ(buf1, CopyOnWriteBuffer(kTestData, 10));
135 }
136
137 TEST(CopyOnWriteBufferTest, SetDataMakeReferenceCopy) {
120 CopyOnWriteBuffer buf1(kTestData, 3, 10); 138 CopyOnWriteBuffer buf1(kTestData, 3, 10);
121 CopyOnWriteBuffer buf2; 139 CopyOnWriteBuffer buf2;
122 140
123 buf2.SetData(buf1); 141 buf2.SetData(buf1);
124 // buf2 shares the same data as buf1 now. 142
143 EnsureBuffersShareData(buf1, buf2);
144 }
145
146 TEST(CopyOnWriteBufferTest, SetDataOnSharedKeepsOriginal) {
147 const uint8_t data[] = "foo";
148 CopyOnWriteBuffer buf1(kTestData, 3, 10);
149 const uint8_t* const original_allocation = buf1.cdata();
150 CopyOnWriteBuffer buf2(buf1);
151
152 buf2.SetData(data);
153
154 EnsureBuffersDontShareData(buf1, buf2);
155 EXPECT_EQ(original_allocation, buf1.cdata());
156 EXPECT_EQ(buf1, CopyOnWriteBuffer(kTestData, 3));
157 EXPECT_EQ(buf2, CopyOnWriteBuffer(data));
158 }
159
160 TEST(CopyOnWriteBufferTest, SetDataOnSharedKeepsCapacity) {
161 CopyOnWriteBuffer buf1(kTestData, 3, 10);
162 CopyOnWriteBuffer buf2(buf1);
125 EnsureBuffersShareData(buf1, buf2); 163 EnsureBuffersShareData(buf1, buf2);
126 164
127 CopyOnWriteBuffer buf3(buf1); 165 buf2.SetData(kTestData, 2);
128 // buf3 is re-allocated with new data, existing buffers are not modified.
129 buf3.SetData("foo");
130 EXPECT_EQ(buf1, CopyOnWriteBuffer(kTestData, 3));
131 EnsureBuffersShareData(buf1, buf2);
132 EnsureBuffersDontShareData(buf1, buf3);
133 const int8_t exp[] = {'f', 'o', 'o', 0x0};
134 EXPECT_EQ(buf3, CopyOnWriteBuffer(exp));
135 166
136 buf2.SetData(static_cast<const uint8_t*>(nullptr), 0u);
137 EnsureBuffersDontShareData(buf1, buf2); 167 EnsureBuffersDontShareData(buf1, buf2);
138 EXPECT_EQ(buf1.size(), 3u); 168 EXPECT_EQ(2u, buf2.size());
139 EXPECT_EQ(buf1.capacity(), 10u); 169 EXPECT_EQ(10u, buf2.capacity());
140 EXPECT_EQ(buf2.size(), 0u);
141 EXPECT_EQ(buf2.capacity(), 0u);
142 }
143
144 TEST(CopyOnWriteBufferTest, TestSetDataEmpty) {
145 CopyOnWriteBuffer buf;
146 buf.SetData(static_cast<const uint8_t*>(nullptr), 0u);
147 EXPECT_EQ(buf.size(), 0u);
148 EXPECT_EQ(buf.capacity(), 0u);
149 EXPECT_EQ(buf.data(), nullptr);
150 } 170 }
151 171
152 TEST(CopyOnWriteBufferTest, TestEnsureCapacity) { 172 TEST(CopyOnWriteBufferTest, TestEnsureCapacity) {
153 CopyOnWriteBuffer buf1(kTestData, 3, 10); 173 CopyOnWriteBuffer buf1(kTestData, 3, 10);
154 CopyOnWriteBuffer buf2(buf1); 174 CopyOnWriteBuffer buf2(buf1);
155 175
156 // Smaller than existing capacity -> no change and still same contents. 176 // Smaller than existing capacity -> no change and still same contents.
157 buf2.EnsureCapacity(8); 177 buf2.EnsureCapacity(8);
158 EnsureBuffersShareData(buf1, buf2); 178 EnsureBuffersShareData(buf1, buf2);
159 EXPECT_EQ(buf1.size(), 3u); 179 EXPECT_EQ(buf1.size(), 3u);
160 EXPECT_EQ(buf1.capacity(), 10u); 180 EXPECT_EQ(buf1.capacity(), 10u);
161 EXPECT_EQ(buf2.size(), 3u); 181 EXPECT_EQ(buf2.size(), 3u);
162 EXPECT_EQ(buf2.capacity(), 10u); 182 EXPECT_EQ(buf2.capacity(), 10u);
163 183
164 // Lager than existing capacity -> data is cloned. 184 // Lager than existing capacity -> data is cloned.
165 buf2.EnsureCapacity(16); 185 buf2.EnsureCapacity(16);
166 EnsureBuffersDontShareData(buf1, buf2); 186 EnsureBuffersDontShareData(buf1, buf2);
167 EXPECT_EQ(buf1.size(), 3u); 187 EXPECT_EQ(buf1.size(), 3u);
168 EXPECT_EQ(buf1.capacity(), 10u); 188 EXPECT_EQ(buf1.capacity(), 10u);
169 EXPECT_EQ(buf2.size(), 3u); 189 EXPECT_EQ(buf2.size(), 3u);
170 EXPECT_EQ(buf2.capacity(), 16u); 190 EXPECT_EQ(buf2.capacity(), 16u);
171 // The size and contents are still the same. 191 // The size and contents are still the same.
172 EXPECT_EQ(buf1, buf2); 192 EXPECT_EQ(buf1, buf2);
173 } 193 }
174 194
175 TEST(CopyOnWriteBufferTest, TestSetSize) { 195 TEST(CopyOnWriteBufferTest, SetSizeDoesntChangeOriginal) {
196 CopyOnWriteBuffer buf1(kTestData, 3, 10);
197 const uint8_t* const original_allocation = buf1.cdata();
198 CopyOnWriteBuffer buf2(buf1);
199
200 buf2.SetSize(16);
201
202 EnsureBuffersDontShareData(buf1, buf2);
203 EXPECT_EQ(original_allocation, buf1.cdata());
204 EXPECT_EQ(3u, buf1.size());
205 EXPECT_EQ(10u, buf1.capacity());
206 }
207
208 TEST(CopyOnWriteBufferTest, SetSizeCloneContent) {
176 CopyOnWriteBuffer buf1(kTestData, 3, 10); 209 CopyOnWriteBuffer buf1(kTestData, 3, 10);
177 CopyOnWriteBuffer buf2(buf1); 210 CopyOnWriteBuffer buf2(buf1);
178 211
179 buf2.SetSize(16); 212 buf2.SetSize(16);
180 EnsureBuffersDontShareData(buf1, buf2); 213
181 EXPECT_EQ(buf1.size(), 3u);
182 EXPECT_EQ(buf1.capacity(), 10u);
183 EXPECT_EQ(buf2.size(), 16u); 214 EXPECT_EQ(buf2.size(), 16u);
184 EXPECT_EQ(buf2.capacity(), 16u);
185 // The contents got cloned.
186 EXPECT_EQ(0, memcmp(buf2.data(), kTestData, 3)); 215 EXPECT_EQ(0, memcmp(buf2.data(), kTestData, 3));
187 } 216 }
188 217
189 TEST(CopyOnWriteBufferTest, TestClear) { 218 TEST(CopyOnWriteBufferTest, SetSizeMayIncreaseCapacity) {
219 CopyOnWriteBuffer buf(kTestData, 3, 10);
220
221 buf.SetSize(16);
222
223 EXPECT_EQ(16u, buf.size());
224 EXPECT_EQ(16u, buf.capacity());
225 }
226
227 TEST(CopyOnWriteBufferTest, SetSizeDoesntDecreaseCapacity) {
228 CopyOnWriteBuffer buf1(kTestData, 5, 10);
229 CopyOnWriteBuffer buf2(buf1);
230
231 buf2.SetSize(2);
232
233 EXPECT_EQ(2u, buf2.size());
234 EXPECT_EQ(10u, buf2.capacity());
235 }
236
237 TEST(CopyOnWriteBufferTest, ClearDoesntChangeOriginal) {
238 CopyOnWriteBuffer buf1(kTestData, 3, 10);
239 const uint8_t* const original_allocation = buf1.cdata();
240 CopyOnWriteBuffer buf2(buf1);
241
242 buf2.Clear();
243
244 EnsureBuffersDontShareData(buf1, buf2);
245 EXPECT_EQ(3u, buf1.size());
246 EXPECT_EQ(10u, buf1.capacity());
247 EXPECT_EQ(original_allocation, buf1.cdata());
248 EXPECT_EQ(0u, buf2.size());
249 }
250
251 TEST(CopyOnWriteBufferTest, ClearDoesntChangeCapacity) {
190 CopyOnWriteBuffer buf1(kTestData, 3, 10); 252 CopyOnWriteBuffer buf1(kTestData, 3, 10);
191 CopyOnWriteBuffer buf2(buf1); 253 CopyOnWriteBuffer buf2(buf1);
192 254
193 buf2.Clear(); 255 buf2.Clear();
194 EnsureBuffersDontShareData(buf1, buf2); 256
195 EXPECT_EQ(buf1.size(), 3u); 257 EXPECT_EQ(0u, buf2.size());
196 EXPECT_EQ(buf1.capacity(), 10u); 258 EXPECT_EQ(10u, buf2.capacity());
197 EXPECT_EQ(0, memcmp(buf1.data(), kTestData, 3));
198 EXPECT_EQ(buf2.size(), 0u);
199 EXPECT_EQ(buf2.capacity(), 0u);
200 } 259 }
201 260
202 TEST(CopyOnWriteBufferTest, TestConstDataAccessor) { 261 TEST(CopyOnWriteBufferTest, TestConstDataAccessor) {
203 CopyOnWriteBuffer buf1(kTestData, 3, 10); 262 CopyOnWriteBuffer buf1(kTestData, 3, 10);
204 CopyOnWriteBuffer buf2(buf1); 263 CopyOnWriteBuffer buf2(buf1);
205 264
206 // .cdata() doesn't clone data. 265 // .cdata() doesn't clone data.
207 const uint8_t* cdata1 = buf1.cdata(); 266 const uint8_t* cdata1 = buf1.cdata();
208 const uint8_t* cdata2 = buf2.cdata(); 267 const uint8_t* cdata2 = buf2.cdata();
209 EXPECT_EQ(cdata1, cdata2); 268 EXPECT_EQ(cdata1, cdata2);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 buf1[i] = kTestData[i] + 1; 310 buf1[i] = kTestData[i] + 1;
252 } 311 }
253 EXPECT_EQ(buf1.size(), 3u); 312 EXPECT_EQ(buf1.size(), 3u);
254 EXPECT_EQ(buf1.capacity(), 10u); 313 EXPECT_EQ(buf1.capacity(), 10u);
255 EXPECT_EQ(buf2.size(), 3u); 314 EXPECT_EQ(buf2.size(), 3u);
256 EXPECT_EQ(buf2.capacity(), 10u); 315 EXPECT_EQ(buf2.capacity(), 10u);
257 EXPECT_EQ(0, memcmp(buf2.cdata(), kTestData, 3)); 316 EXPECT_EQ(0, memcmp(buf2.cdata(), kTestData, 3));
258 } 317 }
259 318
260 } // namespace rtc 319 } // namespace rtc
OLDNEW
« no previous file with comments | « webrtc/base/copyonwritebuffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698