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

Side by Side Diff: base/pickle_unittest.cc

Issue 9447084: Refactor Pickle Read methods to use higher performance PickleIterator. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: compile (racing with incoming CLs) Created 8 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « base/pickle.cc ('k') | chrome/browser/automation/url_request_automation_job.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include <string>
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/pickle.h" 9 #include "base/pickle.h"
10 #include "base/string16.h" 10 #include "base/string16.h"
11 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
12 12
13 namespace { 13 namespace {
14 14
15 const int testint = 2093847192; 15 const int testint = 2093847192;
16 const std::string teststr("Hello world"); // note non-aligned string length 16 const std::string teststr("Hello world"); // note non-aligned string length
17 const std::wstring testwstr(L"Hello, world"); 17 const std::wstring testwstr(L"Hello, world");
18 const char testdata[] = "AAA\0BBB\0"; 18 const char testdata[] = "AAA\0BBB\0";
19 const int testdatalen = arraysize(testdata) - 1; 19 const int testdatalen = arraysize(testdata) - 1;
20 const bool testbool1 = false; 20 const bool testbool1 = false;
21 const bool testbool2 = true; 21 const bool testbool2 = true;
22 const uint16 testuint16 = 32123; 22 const uint16 testuint16 = 32123;
23 23
24 // checks that the result 24 // checks that the result
25 void VerifyResult(const Pickle& pickle) { 25 void VerifyResult(const Pickle& pickle) {
26 void* iter = NULL; 26 PickleIterator iter(pickle);
27 27
28 int outint; 28 int outint;
29 EXPECT_TRUE(pickle.ReadInt(&iter, &outint)); 29 EXPECT_TRUE(pickle.ReadInt(&iter, &outint));
30 EXPECT_EQ(testint, outint); 30 EXPECT_EQ(testint, outint);
31 31
32 std::string outstr; 32 std::string outstr;
33 EXPECT_TRUE(pickle.ReadString(&iter, &outstr)); 33 EXPECT_TRUE(pickle.ReadString(&iter, &outstr));
34 EXPECT_EQ(teststr, outstr); 34 EXPECT_EQ(teststr, outstr);
35 35
36 std::wstring outwstr; 36 std::wstring outwstr;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 VerifyResult(pickle3); 93 VerifyResult(pickle3);
94 } 94 }
95 95
96 // Tests that we can handle really small buffers. 96 // Tests that we can handle really small buffers.
97 TEST(PickleTest, SmallBuffer) { 97 TEST(PickleTest, SmallBuffer) {
98 scoped_array<char> buffer(new char[1]); 98 scoped_array<char> buffer(new char[1]);
99 99
100 // We should not touch the buffer. 100 // We should not touch the buffer.
101 Pickle pickle(buffer.get(), 1); 101 Pickle pickle(buffer.get(), 1);
102 102
103 void* iter = NULL; 103 PickleIterator iter(pickle);
104 int data; 104 int data;
105 EXPECT_FALSE(pickle.ReadInt(&iter, &data)); 105 EXPECT_FALSE(pickle.ReadInt(&iter, &data));
106 } 106 }
107 107
108 // Tests that we can handle improper headers. 108 // Tests that we can handle improper headers.
109 TEST(PickleTest, BigSize) { 109 TEST(PickleTest, BigSize) {
110 int buffer[] = { 0x56035200, 25, 40, 50 }; 110 int buffer[] = { 0x56035200, 25, 40, 50 };
111 111
112 Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer)); 112 Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer));
113 113
114 void* iter = NULL; 114 PickleIterator iter(pickle);
115 int data; 115 int data;
116 EXPECT_FALSE(pickle.ReadInt(&iter, &data)); 116 EXPECT_FALSE(pickle.ReadInt(&iter, &data));
117 } 117 }
118 118
119 TEST(PickleTest, UnalignedSize) { 119 TEST(PickleTest, UnalignedSize) {
120 int buffer[] = { 10, 25, 40, 50 }; 120 int buffer[] = { 10, 25, 40, 50 };
121 121
122 Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer)); 122 Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer));
123 123
124 void* iter = NULL; 124 PickleIterator iter(pickle);
125 int data; 125 int data;
126 EXPECT_FALSE(pickle.ReadInt(&iter, &data)); 126 EXPECT_FALSE(pickle.ReadInt(&iter, &data));
127 } 127 }
128 128
129 TEST(PickleTest, ZeroLenStr) { 129 TEST(PickleTest, ZeroLenStr) {
130 Pickle pickle; 130 Pickle pickle;
131 EXPECT_TRUE(pickle.WriteString("")); 131 EXPECT_TRUE(pickle.WriteString(""));
132 132
133 void* iter = NULL; 133 PickleIterator iter(pickle);
134 std::string outstr; 134 std::string outstr;
135 EXPECT_TRUE(pickle.ReadString(&iter, &outstr)); 135 EXPECT_TRUE(pickle.ReadString(&iter, &outstr));
136 EXPECT_EQ("", outstr); 136 EXPECT_EQ("", outstr);
137 } 137 }
138 138
139 TEST(PickleTest, ZeroLenWStr) { 139 TEST(PickleTest, ZeroLenWStr) {
140 Pickle pickle; 140 Pickle pickle;
141 EXPECT_TRUE(pickle.WriteWString(L"")); 141 EXPECT_TRUE(pickle.WriteWString(L""));
142 142
143 void* iter = NULL; 143 PickleIterator iter(pickle);
144 std::string outstr; 144 std::string outstr;
145 EXPECT_TRUE(pickle.ReadString(&iter, &outstr)); 145 EXPECT_TRUE(pickle.ReadString(&iter, &outstr));
146 EXPECT_EQ("", outstr); 146 EXPECT_EQ("", outstr);
147 } 147 }
148 148
149 TEST(PickleTest, BadLenStr) { 149 TEST(PickleTest, BadLenStr) {
150 Pickle pickle; 150 Pickle pickle;
151 EXPECT_TRUE(pickle.WriteInt(-2)); 151 EXPECT_TRUE(pickle.WriteInt(-2));
152 152
153 void* iter = NULL; 153 PickleIterator iter(pickle);
154 std::string outstr; 154 std::string outstr;
155 EXPECT_FALSE(pickle.ReadString(&iter, &outstr)); 155 EXPECT_FALSE(pickle.ReadString(&iter, &outstr));
156 } 156 }
157 157
158 TEST(PickleTest, BadLenWStr) { 158 TEST(PickleTest, BadLenWStr) {
159 Pickle pickle; 159 Pickle pickle;
160 EXPECT_TRUE(pickle.WriteInt(-1)); 160 EXPECT_TRUE(pickle.WriteInt(-1));
161 161
162 void* iter = NULL; 162 PickleIterator iter(pickle);
163 std::wstring woutstr; 163 std::wstring woutstr;
164 EXPECT_FALSE(pickle.ReadWString(&iter, &woutstr)); 164 EXPECT_FALSE(pickle.ReadWString(&iter, &woutstr));
165 } 165 }
166 166
167 TEST(PickleTest, FindNext) { 167 TEST(PickleTest, FindNext) {
168 Pickle pickle; 168 Pickle pickle;
169 EXPECT_TRUE(pickle.WriteInt(1)); 169 EXPECT_TRUE(pickle.WriteInt(1));
170 EXPECT_TRUE(pickle.WriteString("Domo")); 170 EXPECT_TRUE(pickle.WriteString("Domo"));
171 171
172 const char* start = reinterpret_cast<const char*>(pickle.data()); 172 const char* start = reinterpret_cast<const char*>(pickle.data());
173 const char* end = start + pickle.size(); 173 const char* end = start + pickle.size();
174 174
175 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end)); 175 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end));
176 EXPECT_TRUE(NULL == Pickle::FindNext(pickle.header_size_, start, end - 1)); 176 EXPECT_TRUE(NULL == Pickle::FindNext(pickle.header_size_, start, end - 1));
177 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end + 1)); 177 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end + 1));
178 } 178 }
179 179
180 TEST(PickleTest, FindNextWithIncompleteHeader) { 180 TEST(PickleTest, FindNextWithIncompleteHeader) {
181 size_t header_size = sizeof(Pickle::Header); 181 size_t header_size = sizeof(Pickle::Header);
182 scoped_array<char> buffer(new char[header_size - 1]); 182 scoped_array<char> buffer(new char[header_size - 1]);
183 memset(buffer.get(), 0x1, header_size - 1); 183 memset(buffer.get(), 0x1, header_size - 1);
184 184
185 const char* start = buffer.get(); 185 const char* start = buffer.get();
186 const char* end = start + header_size - 1; 186 const char* end = start + header_size - 1;
187 187
188 EXPECT_TRUE(NULL == Pickle::FindNext(header_size, start, end)); 188 EXPECT_TRUE(NULL == Pickle::FindNext(header_size, start, end));
189 } 189 }
190 190
191 TEST(PickleTest, IteratorHasRoom) { 191 TEST(PickleTest, GetReadPointerAndAdvance) {
192 Pickle pickle; 192 Pickle pickle;
193
194 PickleIterator iter(pickle);
195 EXPECT_FALSE(iter.GetReadPointerAndAdvance(1));
196
193 EXPECT_TRUE(pickle.WriteInt(1)); 197 EXPECT_TRUE(pickle.WriteInt(1));
194 EXPECT_TRUE(pickle.WriteInt(2)); 198 EXPECT_TRUE(pickle.WriteInt(2));
199 int bytes = sizeof(int) * 2;
195 200
196 const void* iter = 0; 201 EXPECT_TRUE(PickleIterator(pickle).GetReadPointerAndAdvance(0));
197 EXPECT_FALSE(pickle.IteratorHasRoomFor(iter, 1)); 202 EXPECT_TRUE(PickleIterator(pickle).GetReadPointerAndAdvance(1));
198 iter = pickle.payload(); 203 EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(-1));
199 EXPECT_TRUE(pickle.IteratorHasRoomFor(iter, 0)); 204 EXPECT_TRUE(PickleIterator(pickle).GetReadPointerAndAdvance(bytes));
200 EXPECT_TRUE(pickle.IteratorHasRoomFor(iter, 1)); 205 EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(bytes + 1));
201 EXPECT_FALSE(pickle.IteratorHasRoomFor(iter, -1)); 206 EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(INT_MAX));
202 EXPECT_TRUE(pickle.IteratorHasRoomFor(iter, sizeof(int) * 2)); 207 EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(INT_MIN));
203 EXPECT_FALSE(pickle.IteratorHasRoomFor(iter, (sizeof(int) * 2) + 1));
204 } 208 }
205 209
206 TEST(PickleTest, Resize) { 210 TEST(PickleTest, Resize) {
207 size_t unit = Pickle::kPayloadUnit; 211 size_t unit = Pickle::kPayloadUnit;
208 scoped_array<char> data(new char[unit]); 212 scoped_array<char> data(new char[unit]);
209 char* data_ptr = data.get(); 213 char* data_ptr = data.get();
210 for (size_t i = 0; i < unit; i++) 214 for (size_t i = 0; i < unit; i++)
211 data_ptr[i] = 'G'; 215 data_ptr[i] = 'G';
212 216
213 // construct a message that will be exactly the size of one payload unit, 217 // construct a message that will be exactly the size of one payload unit,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 249
246 TEST(PickleTest, HeaderPadding) { 250 TEST(PickleTest, HeaderPadding) {
247 const uint32 kMagic = 0x12345678; 251 const uint32 kMagic = 0x12345678;
248 252
249 Pickle pickle(sizeof(CustomHeader)); 253 Pickle pickle(sizeof(CustomHeader));
250 pickle.WriteInt(kMagic); 254 pickle.WriteInt(kMagic);
251 255
252 // this should not overwrite the 'int' payload 256 // this should not overwrite the 'int' payload
253 pickle.headerT<CustomHeader>()->blah = 10; 257 pickle.headerT<CustomHeader>()->blah = 10;
254 258
255 void* iter = NULL; 259 PickleIterator iter(pickle);
256 int result; 260 int result;
257 ASSERT_TRUE(pickle.ReadInt(&iter, &result)); 261 ASSERT_TRUE(pickle.ReadInt(&iter, &result));
258 262
259 EXPECT_EQ(static_cast<uint32>(result), kMagic); 263 EXPECT_EQ(static_cast<uint32>(result), kMagic);
260 } 264 }
261 265
262 TEST(PickleTest, EqualsOperator) { 266 TEST(PickleTest, EqualsOperator) {
263 Pickle source; 267 Pickle source;
264 source.WriteInt(1); 268 source.WriteInt(1);
265 269
266 Pickle copy_refs_source_buffer(static_cast<const char*>(source.data()), 270 Pickle copy_refs_source_buffer(static_cast<const char*>(source.data()),
267 source.size()); 271 source.size());
268 Pickle copy; 272 Pickle copy;
269 copy = copy_refs_source_buffer; 273 copy = copy_refs_source_buffer;
270 ASSERT_EQ(source.size(), copy.size()); 274 ASSERT_EQ(source.size(), copy.size());
271 } 275 }
272 276
273 TEST(PickleTest, EvilLengths) { 277 TEST(PickleTest, EvilLengths) {
274 Pickle source; 278 Pickle source;
275 std::string str(100000, 'A'); 279 std::string str(100000, 'A');
276 source.WriteData(str.c_str(), 100000); 280 EXPECT_TRUE(source.WriteData(str.c_str(), 100000));
277 // ReadString16 used to have its read buffer length calculation wrong leading 281 // ReadString16 used to have its read buffer length calculation wrong leading
278 // to out-of-bounds reading. 282 // to out-of-bounds reading.
279 void* iter = NULL; 283 PickleIterator iter(source);
280 string16 str16; 284 string16 str16;
281 EXPECT_FALSE(source.ReadString16(&iter, &str16)); 285 EXPECT_FALSE(source.ReadString16(&iter, &str16));
282 286
283 // And check we didn't break ReadString16. 287 // And check we didn't break ReadString16.
284 str16 = (wchar_t) 'A'; 288 str16 = (wchar_t) 'A';
285 Pickle str16_pickle; 289 Pickle str16_pickle;
286 str16_pickle.WriteString16(str16); 290 EXPECT_TRUE(str16_pickle.WriteString16(str16));
287 iter = NULL; 291 iter = PickleIterator(str16_pickle);
288 EXPECT_TRUE(str16_pickle.ReadString16(&iter, &str16)); 292 EXPECT_TRUE(str16_pickle.ReadString16(&iter, &str16));
289 EXPECT_EQ(1U, str16.length()); 293 EXPECT_EQ(1U, str16.length());
290 294
295 // Check we don't fail in a length check with invalid String16 size.
296 // (1<<31) * sizeof(char16) == 0, so this is particularly evil.
297 Pickle bad_len;
298 EXPECT_TRUE(bad_len.WriteInt(1 << 31));
299 iter = PickleIterator(bad_len);
300 EXPECT_FALSE(bad_len.ReadString16(&iter, &str16));
301
291 // Check we don't fail in a length check with large WStrings. 302 // Check we don't fail in a length check with large WStrings.
292 Pickle big_len; 303 Pickle big_len;
293 big_len.WriteInt(1 << 30); 304 EXPECT_TRUE(big_len.WriteInt(1 << 30));
294 iter = NULL; 305 iter = PickleIterator(big_len);
295 std::wstring wstr; 306 std::wstring wstr;
296 EXPECT_FALSE(big_len.ReadWString(&iter, &wstr)); 307 EXPECT_FALSE(big_len.ReadWString(&iter, &wstr));
297 } 308 }
298 309
299 // Check we can write zero bytes of data and 'data' can be NULL. 310 // Check we can write zero bytes of data and 'data' can be NULL.
300 TEST(PickleTest, ZeroLength) { 311 TEST(PickleTest, ZeroLength) {
301 Pickle pickle; 312 Pickle pickle;
302 EXPECT_TRUE(pickle.WriteData(NULL, 0)); 313 EXPECT_TRUE(pickle.WriteData(NULL, 0));
303 314
304 void* iter = NULL; 315 PickleIterator iter(pickle);
305 const char* outdata; 316 const char* outdata;
306 int outdatalen; 317 int outdatalen;
307 EXPECT_TRUE(pickle.ReadData(&iter, &outdata, &outdatalen)); 318 EXPECT_TRUE(pickle.ReadData(&iter, &outdata, &outdatalen));
308 EXPECT_EQ(0, outdatalen); 319 EXPECT_EQ(0, outdatalen);
309 // We can't assert that outdata is NULL. 320 // We can't assert that outdata is NULL.
310 } 321 }
311 322
312 // Check that ReadBytes works properly with an iterator initialized to NULL. 323 // Check that ReadBytes works properly with an iterator initialized to NULL.
313 TEST(PickleTest, ReadBytes) { 324 TEST(PickleTest, ReadBytes) {
314 Pickle pickle; 325 Pickle pickle;
315 int data = 0x7abcd; 326 int data = 0x7abcd;
316 EXPECT_TRUE(pickle.WriteBytes(&data, sizeof(data))); 327 EXPECT_TRUE(pickle.WriteBytes(&data, sizeof(data)));
317 328
318 void* iter = NULL; 329 PickleIterator iter(pickle);
319 const char* outdata_char; 330 const char* outdata_char = NULL;
320 EXPECT_TRUE(pickle.ReadBytes(&iter, &outdata_char, sizeof(data))); 331 EXPECT_TRUE(pickle.ReadBytes(&iter, &outdata_char, sizeof(data)));
321 332
322 int outdata; 333 int outdata;
323 memcpy(&outdata, outdata_char, sizeof(outdata)); 334 memcpy(&outdata, outdata_char, sizeof(outdata));
324 EXPECT_EQ(data, outdata); 335 EXPECT_EQ(data, outdata);
325 } 336 }
OLDNEW
« no previous file with comments | « base/pickle.cc ('k') | chrome/browser/automation/url_request_automation_job.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698