blob: a2c405ce9181b51c59d627e730d417901138dadd [file] [log] [blame]
[email protected]ce208f872012-03-07 20:42:561// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
[email protected]d26cd5272008-08-07 13:40:164
5#include <string>
initial.commitd7cae122008-07-26 21:49:386
7#include "base/basictypes.h"
[email protected]3b63f8f42011-03-28 01:54:158#include "base/memory/scoped_ptr.h"
initial.commitd7cae122008-07-26 21:49:389#include "base/pickle.h"
[email protected]d529cb02013-06-10 19:06:5710#include "base/strings/string16.h"
pkasting89a19f142014-10-02 03:01:0411#include "base/strings/utf_string_conversions.h"
initial.commitd7cae122008-07-26 21:49:3812#include "testing/gtest/include/gtest/gtest.h"
13
[email protected]476dafb2013-12-03 00:39:2614// Remove when this file is in the base namespace.
15using base::string16;
16
initial.commitd7cae122008-07-26 21:49:3817namespace {
18
initial.commitd7cae122008-07-26 21:49:3819const bool testbool1 = false;
20const bool testbool2 = true;
pkasting89a19f142014-10-02 03:01:0421const int testint = 2093847192;
22const long testlong = 1093847192;
[email protected]6d81b482011-02-22 19:47:1923const uint16 testuint16 = 32123;
pkasting89a19f142014-10-02 03:01:0424const uint32 testuint32 = 1593847192;
25const int64 testint64 = -0x7E8CA9253104BDFCLL;
26const uint64 testuint64 = 0xCE8CA9253104BDF7ULL;
27const size_t testsizet = 0xFEDC7654;
[email protected]b1f61b032012-11-28 15:40:5828const float testfloat = 3.1415926935f;
[email protected]915cc7d2014-07-14 22:50:3229const double testdouble = 2.71828182845904523;
pkasting89a19f142014-10-02 03:01:0430const std::string teststring("Hello world"); // note non-aligned string length
31const std::wstring testwstring(L"Hello, world");
32const base::string16 teststring16(base::ASCIIToUTF16("Hello, world"));
brucedawsoneaa38962015-03-10 01:46:5033const char testrawstring[] = "Hello new world"; // Test raw string writing
34// Test raw char16 writing, assumes UTF16 encoding is ANSI for alpha chars.
35const base::char16 testrawstring16[] = {'A', 'l', 'o', 'h', 'a', 0};
pkasting89a19f142014-10-02 03:01:0436const char testdata[] = "AAA\0BBB\0";
37const int testdatalen = arraysize(testdata) - 1;
initial.commitd7cae122008-07-26 21:49:3838
brucedawsoneaa38962015-03-10 01:46:5039// checks that the results can be read correctly from the Pickle
initial.commitd7cae122008-07-26 21:49:3840void VerifyResult(const Pickle& pickle) {
[email protected]ce208f872012-03-07 20:42:5641 PickleIterator iter(pickle);
initial.commitd7cae122008-07-26 21:49:3842
initial.commitd7cae122008-07-26 21:49:3843 bool outbool;
avi48fc13b2014-12-28 23:31:4844 EXPECT_TRUE(iter.ReadBool(&outbool));
[email protected]18853692013-01-03 12:30:5245 EXPECT_FALSE(outbool);
avi48fc13b2014-12-28 23:31:4846 EXPECT_TRUE(iter.ReadBool(&outbool));
[email protected]18853692013-01-03 12:30:5247 EXPECT_TRUE(outbool);
initial.commitd7cae122008-07-26 21:49:3848
pkasting89a19f142014-10-02 03:01:0449 int outint;
avi48fc13b2014-12-28 23:31:4850 EXPECT_TRUE(iter.ReadInt(&outint));
pkasting89a19f142014-10-02 03:01:0451 EXPECT_EQ(testint, outint);
52
53 long outlong;
avi48fc13b2014-12-28 23:31:4854 EXPECT_TRUE(iter.ReadLong(&outlong));
pkasting89a19f142014-10-02 03:01:0455 EXPECT_EQ(testlong, outlong);
56
[email protected]6d81b482011-02-22 19:47:1957 uint16 outuint16;
avi48fc13b2014-12-28 23:31:4858 EXPECT_TRUE(iter.ReadUInt16(&outuint16));
[email protected]6d81b482011-02-22 19:47:1959 EXPECT_EQ(testuint16, outuint16);
60
pkasting89a19f142014-10-02 03:01:0461 uint32 outuint32;
avi48fc13b2014-12-28 23:31:4862 EXPECT_TRUE(iter.ReadUInt32(&outuint32));
pkasting89a19f142014-10-02 03:01:0463 EXPECT_EQ(testuint32, outuint32);
64
65 int64 outint64;
avi48fc13b2014-12-28 23:31:4866 EXPECT_TRUE(iter.ReadInt64(&outint64));
pkasting89a19f142014-10-02 03:01:0467 EXPECT_EQ(testint64, outint64);
68
69 uint64 outuint64;
avi48fc13b2014-12-28 23:31:4870 EXPECT_TRUE(iter.ReadUInt64(&outuint64));
pkasting89a19f142014-10-02 03:01:0471 EXPECT_EQ(testuint64, outuint64);
72
73 size_t outsizet;
avi48fc13b2014-12-28 23:31:4874 EXPECT_TRUE(iter.ReadSizeT(&outsizet));
pkasting89a19f142014-10-02 03:01:0475 EXPECT_EQ(testsizet, outsizet);
76
[email protected]b1f61b032012-11-28 15:40:5877 float outfloat;
avi48fc13b2014-12-28 23:31:4878 EXPECT_TRUE(iter.ReadFloat(&outfloat));
[email protected]b1f61b032012-11-28 15:40:5879 EXPECT_EQ(testfloat, outfloat);
80
[email protected]915cc7d2014-07-14 22:50:3281 double outdouble;
avi48fc13b2014-12-28 23:31:4882 EXPECT_TRUE(iter.ReadDouble(&outdouble));
[email protected]915cc7d2014-07-14 22:50:3283 EXPECT_EQ(testdouble, outdouble);
84
pkasting89a19f142014-10-02 03:01:0485 std::string outstring;
avi48fc13b2014-12-28 23:31:4886 EXPECT_TRUE(iter.ReadString(&outstring));
pkasting89a19f142014-10-02 03:01:0487 EXPECT_EQ(teststring, outstring);
88
pkasting89a19f142014-10-02 03:01:0489 base::string16 outstring16;
avi48fc13b2014-12-28 23:31:4890 EXPECT_TRUE(iter.ReadString16(&outstring16));
pkasting89a19f142014-10-02 03:01:0491 EXPECT_EQ(teststring16, outstring16);
92
brucedawsoneaa38962015-03-10 01:46:5093 base::StringPiece outstringpiece;
94 EXPECT_TRUE(iter.ReadStringPiece(&outstringpiece));
95 EXPECT_EQ(testrawstring, outstringpiece);
96
97 base::StringPiece16 outstringpiece16;
98 EXPECT_TRUE(iter.ReadStringPiece16(&outstringpiece16));
99 EXPECT_EQ(testrawstring16, outstringpiece16);
100
initial.commitd7cae122008-07-26 21:49:38101 const char* outdata;
102 int outdatalen;
avi48fc13b2014-12-28 23:31:48103 EXPECT_TRUE(iter.ReadData(&outdata, &outdatalen));
initial.commitd7cae122008-07-26 21:49:38104 EXPECT_EQ(testdatalen, outdatalen);
105 EXPECT_EQ(memcmp(testdata, outdata, outdatalen), 0);
106
initial.commitd7cae122008-07-26 21:49:38107 // reads past the end should fail
avi48fc13b2014-12-28 23:31:48108 EXPECT_FALSE(iter.ReadInt(&outint));
initial.commitd7cae122008-07-26 21:49:38109}
110
111} // namespace
112
113TEST(PickleTest, EncodeDecode) {
114 Pickle pickle;
115
initial.commitd7cae122008-07-26 21:49:38116 EXPECT_TRUE(pickle.WriteBool(testbool1));
117 EXPECT_TRUE(pickle.WriteBool(testbool2));
pkasting89a19f142014-10-02 03:01:04118 EXPECT_TRUE(pickle.WriteInt(testint));
119 EXPECT_TRUE(
120 pickle.WriteLongUsingDangerousNonPortableLessPersistableForm(testlong));
[email protected]6d81b482011-02-22 19:47:19121 EXPECT_TRUE(pickle.WriteUInt16(testuint16));
pkasting89a19f142014-10-02 03:01:04122 EXPECT_TRUE(pickle.WriteUInt32(testuint32));
123 EXPECT_TRUE(pickle.WriteInt64(testint64));
124 EXPECT_TRUE(pickle.WriteUInt64(testuint64));
125 EXPECT_TRUE(pickle.WriteSizeT(testsizet));
[email protected]b1f61b032012-11-28 15:40:58126 EXPECT_TRUE(pickle.WriteFloat(testfloat));
[email protected]915cc7d2014-07-14 22:50:32127 EXPECT_TRUE(pickle.WriteDouble(testdouble));
pkasting89a19f142014-10-02 03:01:04128 EXPECT_TRUE(pickle.WriteString(teststring));
pkasting89a19f142014-10-02 03:01:04129 EXPECT_TRUE(pickle.WriteString16(teststring16));
brucedawsoneaa38962015-03-10 01:46:50130 EXPECT_TRUE(pickle.WriteString(testrawstring));
131 EXPECT_TRUE(pickle.WriteString16(testrawstring16));
initial.commitd7cae122008-07-26 21:49:38132 EXPECT_TRUE(pickle.WriteData(testdata, testdatalen));
initial.commitd7cae122008-07-26 21:49:38133 VerifyResult(pickle);
134
135 // test copy constructor
136 Pickle pickle2(pickle);
137 VerifyResult(pickle2);
138
139 // test operator=
140 Pickle pickle3;
141 pickle3 = pickle;
142 VerifyResult(pickle3);
143}
144
pkasting89a19f142014-10-02 03:01:04145// Tests that reading/writing a size_t works correctly when the source process
146// is 64-bit. We rely on having both 32- and 64-bit trybots to validate both
147// arms of the conditional in this test.
148TEST(PickleTest, SizeTFrom64Bit) {
149 Pickle pickle;
150 // Under the hood size_t is always written as a 64-bit value, so simulate a
151 // 64-bit size_t even on 32-bit architectures by explicitly writing a uint64.
152 EXPECT_TRUE(pickle.WriteUInt64(testuint64));
153
154 PickleIterator iter(pickle);
155 size_t outsizet;
156 if (sizeof(size_t) < sizeof(uint64)) {
157 // ReadSizeT() should return false when the original written value can't be
158 // represented as a size_t.
avi48fc13b2014-12-28 23:31:48159 EXPECT_FALSE(iter.ReadSizeT(&outsizet));
pkasting89a19f142014-10-02 03:01:04160 } else {
avi48fc13b2014-12-28 23:31:48161 EXPECT_TRUE(iter.ReadSizeT(&outsizet));
pkasting89a19f142014-10-02 03:01:04162 EXPECT_EQ(testuint64, outsizet);
163 }
164}
165
[email protected]d87f8e6f2010-11-15 19:31:23166// Tests that we can handle really small buffers.
167TEST(PickleTest, SmallBuffer) {
[email protected]604eb052013-01-18 14:21:58168 scoped_ptr<char[]> buffer(new char[1]);
[email protected]d87f8e6f2010-11-15 19:31:23169
170 // We should not touch the buffer.
171 Pickle pickle(buffer.get(), 1);
172
[email protected]ce208f872012-03-07 20:42:56173 PickleIterator iter(pickle);
[email protected]d87f8e6f2010-11-15 19:31:23174 int data;
avi48fc13b2014-12-28 23:31:48175 EXPECT_FALSE(iter.ReadInt(&data));
[email protected]d87f8e6f2010-11-15 19:31:23176}
177
178// Tests that we can handle improper headers.
179TEST(PickleTest, BigSize) {
180 int buffer[] = { 0x56035200, 25, 40, 50 };
181
182 Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer));
183
[email protected]ce208f872012-03-07 20:42:56184 PickleIterator iter(pickle);
[email protected]d87f8e6f2010-11-15 19:31:23185 int data;
avi48fc13b2014-12-28 23:31:48186 EXPECT_FALSE(iter.ReadInt(&data));
[email protected]d87f8e6f2010-11-15 19:31:23187}
188
189TEST(PickleTest, UnalignedSize) {
190 int buffer[] = { 10, 25, 40, 50 };
191
192 Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer));
193
[email protected]ce208f872012-03-07 20:42:56194 PickleIterator iter(pickle);
[email protected]d87f8e6f2010-11-15 19:31:23195 int data;
avi48fc13b2014-12-28 23:31:48196 EXPECT_FALSE(iter.ReadInt(&data));
[email protected]d87f8e6f2010-11-15 19:31:23197}
198
initial.commitd7cae122008-07-26 21:49:38199TEST(PickleTest, ZeroLenStr) {
200 Pickle pickle;
[email protected]007b3f82013-04-09 08:46:45201 EXPECT_TRUE(pickle.WriteString(std::string()));
initial.commitd7cae122008-07-26 21:49:38202
[email protected]ce208f872012-03-07 20:42:56203 PickleIterator iter(pickle);
initial.commitd7cae122008-07-26 21:49:38204 std::string outstr;
avi48fc13b2014-12-28 23:31:48205 EXPECT_TRUE(iter.ReadString(&outstr));
initial.commitd7cae122008-07-26 21:49:38206 EXPECT_EQ("", outstr);
207}
208
thestigf84f17f2015-03-11 20:41:55209TEST(PickleTest, ZeroLenStr16) {
initial.commitd7cae122008-07-26 21:49:38210 Pickle pickle;
thestigf84f17f2015-03-11 20:41:55211 EXPECT_TRUE(pickle.WriteString16(base::string16()));
initial.commitd7cae122008-07-26 21:49:38212
[email protected]ce208f872012-03-07 20:42:56213 PickleIterator iter(pickle);
initial.commitd7cae122008-07-26 21:49:38214 std::string outstr;
avi48fc13b2014-12-28 23:31:48215 EXPECT_TRUE(iter.ReadString(&outstr));
initial.commitd7cae122008-07-26 21:49:38216 EXPECT_EQ("", outstr);
217}
218
219TEST(PickleTest, BadLenStr) {
220 Pickle pickle;
221 EXPECT_TRUE(pickle.WriteInt(-2));
222
[email protected]ce208f872012-03-07 20:42:56223 PickleIterator iter(pickle);
initial.commitd7cae122008-07-26 21:49:38224 std::string outstr;
avi48fc13b2014-12-28 23:31:48225 EXPECT_FALSE(iter.ReadString(&outstr));
initial.commitd7cae122008-07-26 21:49:38226}
227
thestigf84f17f2015-03-11 20:41:55228TEST(PickleTest, BadLenStr16) {
initial.commitd7cae122008-07-26 21:49:38229 Pickle pickle;
230 EXPECT_TRUE(pickle.WriteInt(-1));
231
[email protected]ce208f872012-03-07 20:42:56232 PickleIterator iter(pickle);
thestigf84f17f2015-03-11 20:41:55233 base::string16 outstr;
234 EXPECT_FALSE(iter.ReadString16(&outstr));
initial.commitd7cae122008-07-26 21:49:38235}
236
237TEST(PickleTest, FindNext) {
238 Pickle pickle;
239 EXPECT_TRUE(pickle.WriteInt(1));
240 EXPECT_TRUE(pickle.WriteString("Domo"));
241
242 const char* start = reinterpret_cast<const char*>(pickle.data());
243 const char* end = start + pickle.size();
244
245 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end));
246 EXPECT_TRUE(NULL == Pickle::FindNext(pickle.header_size_, start, end - 1));
247 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end + 1));
248}
249
[email protected]137d2372011-01-26 13:02:27250TEST(PickleTest, FindNextWithIncompleteHeader) {
251 size_t header_size = sizeof(Pickle::Header);
[email protected]604eb052013-01-18 14:21:58252 scoped_ptr<char[]> buffer(new char[header_size - 1]);
[email protected]137d2372011-01-26 13:02:27253 memset(buffer.get(), 0x1, header_size - 1);
254
255 const char* start = buffer.get();
256 const char* end = start + header_size - 1;
257
258 EXPECT_TRUE(NULL == Pickle::FindNext(header_size, start, end));
259}
260
[email protected]9dbfa9842013-11-01 09:43:45261#if defined(COMPILER_MSVC)
262#pragma warning(push)
263#pragma warning(disable: 4146)
264#endif
[email protected]33a38dd2013-11-01 09:06:26265TEST(PickleTest, FindNextOverflow) {
266 size_t header_size = sizeof(Pickle::Header);
267 size_t header_size2 = 2 * header_size;
268 size_t payload_received = 100;
269 scoped_ptr<char[]> buffer(new char[header_size2 + payload_received]);
270 const char* start = buffer.get();
271 Pickle::Header* header = reinterpret_cast<Pickle::Header*>(buffer.get());
272 const char* end = start + header_size2 + payload_received;
273 // It is impossible to construct an overflow test otherwise.
274 if (sizeof(size_t) > sizeof(header->payload_size) ||
275 sizeof(uintptr_t) > sizeof(header->payload_size))
276 return;
277
278 header->payload_size = -(reinterpret_cast<uintptr_t>(start) + header_size2);
279 EXPECT_TRUE(NULL == Pickle::FindNext(header_size2, start, end));
280
281 header->payload_size = -header_size2;
282 EXPECT_TRUE(NULL == Pickle::FindNext(header_size2, start, end));
283
284 header->payload_size = 0;
285 end = start + header_size;
286 EXPECT_TRUE(NULL == Pickle::FindNext(header_size2, start, end));
287}
[email protected]9dbfa9842013-11-01 09:43:45288#if defined(COMPILER_MSVC)
289#pragma warning(pop)
290#endif
[email protected]33a38dd2013-11-01 09:06:26291
[email protected]ce208f872012-03-07 20:42:56292TEST(PickleTest, GetReadPointerAndAdvance) {
initial.commitd7cae122008-07-26 21:49:38293 Pickle pickle;
[email protected]ce208f872012-03-07 20:42:56294
295 PickleIterator iter(pickle);
296 EXPECT_FALSE(iter.GetReadPointerAndAdvance(1));
297
initial.commitd7cae122008-07-26 21:49:38298 EXPECT_TRUE(pickle.WriteInt(1));
299 EXPECT_TRUE(pickle.WriteInt(2));
[email protected]ce208f872012-03-07 20:42:56300 int bytes = sizeof(int) * 2;
initial.commitd7cae122008-07-26 21:49:38301
[email protected]ce208f872012-03-07 20:42:56302 EXPECT_TRUE(PickleIterator(pickle).GetReadPointerAndAdvance(0));
303 EXPECT_TRUE(PickleIterator(pickle).GetReadPointerAndAdvance(1));
304 EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(-1));
305 EXPECT_TRUE(PickleIterator(pickle).GetReadPointerAndAdvance(bytes));
306 EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(bytes + 1));
307 EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(INT_MAX));
308 EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(INT_MIN));
initial.commitd7cae122008-07-26 21:49:38309}
310
311TEST(PickleTest, Resize) {
[email protected]44a1cbfa2008-08-15 01:05:11312 size_t unit = Pickle::kPayloadUnit;
[email protected]604eb052013-01-18 14:21:58313 scoped_ptr<char[]> data(new char[unit]);
initial.commitd7cae122008-07-26 21:49:38314 char* data_ptr = data.get();
[email protected]44a1cbfa2008-08-15 01:05:11315 for (size_t i = 0; i < unit; i++)
initial.commitd7cae122008-07-26 21:49:38316 data_ptr[i] = 'G';
317
318 // construct a message that will be exactly the size of one payload unit,
319 // note that any data will have a 4-byte header indicating the size
[email protected]44a1cbfa2008-08-15 01:05:11320 const size_t payload_size_after_header = unit - sizeof(uint32);
initial.commitd7cae122008-07-26 21:49:38321 Pickle pickle;
[email protected]1ac79482008-08-15 01:40:41322 pickle.WriteData(data_ptr,
323 static_cast<int>(payload_size_after_header - sizeof(uint32)));
[email protected]44a1cbfa2008-08-15 01:05:11324 size_t cur_payload = payload_size_after_header;
initial.commitd7cae122008-07-26 21:49:38325
[email protected]2de46262009-03-16 20:21:57326 // note: we assume 'unit' is a power of 2
[email protected]d1b319fc2013-10-31 04:03:02327 EXPECT_EQ(unit, pickle.capacity_after_header());
initial.commitd7cae122008-07-26 21:49:38328 EXPECT_EQ(pickle.payload_size(), payload_size_after_header);
329
330 // fill out a full page (noting data header)
[email protected]1ac79482008-08-15 01:40:41331 pickle.WriteData(data_ptr, static_cast<int>(unit - sizeof(uint32)));
initial.commitd7cae122008-07-26 21:49:38332 cur_payload += unit;
[email protected]d1b319fc2013-10-31 04:03:02333 EXPECT_EQ(unit * 2, pickle.capacity_after_header());
initial.commitd7cae122008-07-26 21:49:38334 EXPECT_EQ(cur_payload, pickle.payload_size());
335
[email protected]2de46262009-03-16 20:21:57336 // one more byte should double the capacity
initial.commitd7cae122008-07-26 21:49:38337 pickle.WriteData(data_ptr, 1);
[email protected]a15016f2014-06-02 23:23:49338 cur_payload += 8;
[email protected]d1b319fc2013-10-31 04:03:02339 EXPECT_EQ(unit * 4, pickle.capacity_after_header());
initial.commitd7cae122008-07-26 21:49:38340 EXPECT_EQ(cur_payload, pickle.payload_size());
341}
342
[email protected]d26cd5272008-08-07 13:40:16343namespace {
initial.commitd7cae122008-07-26 21:49:38344
[email protected]d26cd5272008-08-07 13:40:16345struct CustomHeader : Pickle::Header {
346 int blah;
347};
348
349} // namespace
350
351TEST(PickleTest, HeaderPadding) {
initial.commitd7cae122008-07-26 21:49:38352 const uint32 kMagic = 0x12345678;
353
354 Pickle pickle(sizeof(CustomHeader));
355 pickle.WriteInt(kMagic);
356
357 // this should not overwrite the 'int' payload
358 pickle.headerT<CustomHeader>()->blah = 10;
359
[email protected]ce208f872012-03-07 20:42:56360 PickleIterator iter(pickle);
initial.commitd7cae122008-07-26 21:49:38361 int result;
avi48fc13b2014-12-28 23:31:48362 ASSERT_TRUE(iter.ReadInt(&result));
initial.commitd7cae122008-07-26 21:49:38363
[email protected]44a1cbfa2008-08-15 01:05:11364 EXPECT_EQ(static_cast<uint32>(result), kMagic);
initial.commitd7cae122008-07-26 21:49:38365}
366
367TEST(PickleTest, EqualsOperator) {
368 Pickle source;
369 source.WriteInt(1);
370
371 Pickle copy_refs_source_buffer(static_cast<const char*>(source.data()),
372 source.size());
373 Pickle copy;
374 copy = copy_refs_source_buffer;
375 ASSERT_EQ(source.size(), copy.size());
[email protected]d26cd5272008-08-07 13:40:16376}
[email protected]87665562009-06-25 16:54:02377
378TEST(PickleTest, EvilLengths) {
379 Pickle source;
[email protected]b235357d2009-06-25 17:23:49380 std::string str(100000, 'A');
[email protected]ce208f872012-03-07 20:42:56381 EXPECT_TRUE(source.WriteData(str.c_str(), 100000));
[email protected]87665562009-06-25 16:54:02382 // ReadString16 used to have its read buffer length calculation wrong leading
383 // to out-of-bounds reading.
[email protected]ce208f872012-03-07 20:42:56384 PickleIterator iter(source);
[email protected]87665562009-06-25 16:54:02385 string16 str16;
avi48fc13b2014-12-28 23:31:48386 EXPECT_FALSE(iter.ReadString16(&str16));
[email protected]87665562009-06-25 16:54:02387
388 // And check we didn't break ReadString16.
389 str16 = (wchar_t) 'A';
390 Pickle str16_pickle;
[email protected]ce208f872012-03-07 20:42:56391 EXPECT_TRUE(str16_pickle.WriteString16(str16));
392 iter = PickleIterator(str16_pickle);
avi48fc13b2014-12-28 23:31:48393 EXPECT_TRUE(iter.ReadString16(&str16));
[email protected]87665562009-06-25 16:54:02394 EXPECT_EQ(1U, str16.length());
395
[email protected]ce208f872012-03-07 20:42:56396 // Check we don't fail in a length check with invalid String16 size.
397 // (1<<31) * sizeof(char16) == 0, so this is particularly evil.
398 Pickle bad_len;
399 EXPECT_TRUE(bad_len.WriteInt(1 << 31));
400 iter = PickleIterator(bad_len);
avi48fc13b2014-12-28 23:31:48401 EXPECT_FALSE(iter.ReadString16(&str16));
[email protected]87665562009-06-25 16:54:02402}
403
[email protected]e64ff5e2009-07-28 21:00:03404// Check we can write zero bytes of data and 'data' can be NULL.
405TEST(PickleTest, ZeroLength) {
406 Pickle pickle;
407 EXPECT_TRUE(pickle.WriteData(NULL, 0));
408
[email protected]ce208f872012-03-07 20:42:56409 PickleIterator iter(pickle);
[email protected]e64ff5e2009-07-28 21:00:03410 const char* outdata;
411 int outdatalen;
avi48fc13b2014-12-28 23:31:48412 EXPECT_TRUE(iter.ReadData(&outdata, &outdatalen));
[email protected]e64ff5e2009-07-28 21:00:03413 EXPECT_EQ(0, outdatalen);
414 // We can't assert that outdata is NULL.
415}
416
[email protected]26d2f472010-03-30 23:52:24417// Check that ReadBytes works properly with an iterator initialized to NULL.
418TEST(PickleTest, ReadBytes) {
419 Pickle pickle;
420 int data = 0x7abcd;
421 EXPECT_TRUE(pickle.WriteBytes(&data, sizeof(data)));
422
[email protected]ce208f872012-03-07 20:42:56423 PickleIterator iter(pickle);
424 const char* outdata_char = NULL;
avi48fc13b2014-12-28 23:31:48425 EXPECT_TRUE(iter.ReadBytes(&outdata_char, sizeof(data)));
[email protected]26d2f472010-03-30 23:52:24426
427 int outdata;
428 memcpy(&outdata, outdata_char, sizeof(outdata));
429 EXPECT_EQ(data, outdata);
430}