pickle_unittest.cc revision 4a5e2dc747d50c653511c68ccb2cfbfb740bd5a7
1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/pickle.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/scoped_ptr.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string16.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst int testint = 2093847192;
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst std::string teststr("Hello world");  // note non-aligned string length
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst std::wstring testwstr(L"Hello, world");
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char testdata[] = "AAA\0BBB\0";
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst int testdatalen = arraysize(testdata) - 1;
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst bool testbool1 = false;
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst bool testbool2 = true;
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// checks that the result
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid VerifyResult(const Pickle& pickle) {
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int outint;
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadInt(&iter, &outint));
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(testint, outint);
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string outstr;
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadString(&iter, &outstr));
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(teststr, outstr);
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::wstring outwstr;
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadWString(&iter, &outwstr));
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(testwstr, outwstr);
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool outbool;
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadBool(&iter, &outbool));
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(testbool1, outbool);
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadBool(&iter, &outbool));
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(testbool2, outbool);
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* outdata;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int outdatalen;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadData(&iter, &outdata, &outdatalen));
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(testdatalen, outdatalen);
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(memcmp(testdata, outdata, outdatalen), 0);
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadData(&iter, &outdata, &outdatalen));
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(testdatalen, outdatalen);
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(memcmp(testdata, outdata, outdatalen), 0);
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // reads past the end should fail
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(pickle.ReadInt(&iter, &outint));
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, EncodeDecode) {
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle;
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteInt(testint));
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteString(teststr));
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteWString(testwstr));
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteBool(testbool1));
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteBool(testbool2));
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteData(testdata, testdatalen));
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Over allocate BeginWriteData so we can test TrimWriteData.
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char* dest = pickle.BeginWriteData(testdatalen + 100);
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(dest);
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memcpy(dest, testdata, testdatalen);
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  pickle.TrimWriteData(testdatalen);
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyResult(pickle);
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // test copy constructor
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle2(pickle);
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyResult(pickle2);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // test operator=
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle3;
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  pickle3 = pickle;
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyResult(pickle3);
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Tests that we can handle really small buffers.
914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(PickleTest, SmallBuffer) {
924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_array<char> buffer(new char[1]);
934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // We should not touch the buffer.
954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Pickle pickle(buffer.get(), 1);
964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void* iter = NULL;
984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int data;
994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_FALSE(pickle.ReadInt(&iter, &data));
1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Tests that we can handle improper headers.
1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(PickleTest, BigSize) {
1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int buffer[] = { 0x56035200, 25, 40, 50 };
1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer));
1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void* iter = NULL;
1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int data;
1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_FALSE(pickle.ReadInt(&iter, &data));
1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(PickleTest, UnalignedSize) {
1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int buffer[] = { 10, 25, 40, 50 };
1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer));
1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void* iter = NULL;
1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int data;
1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_FALSE(pickle.ReadInt(&iter, &data));
1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, ZeroLenStr) {
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle;
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteString(""));
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string outstr;
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadString(&iter, &outstr));
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ("", outstr);
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, ZeroLenWStr) {
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle;
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteWString(L""));
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string outstr;
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadString(&iter, &outstr));
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ("", outstr);
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, BadLenStr) {
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle;
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteInt(-2));
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string outstr;
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(pickle.ReadString(&iter, &outstr));
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, BadLenWStr) {
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle;
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteInt(-1));
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::wstring woutstr;
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(pickle.ReadWString(&iter, &woutstr));
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, FindNext) {
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle;
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteInt(1));
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteString("Domo"));
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* start = reinterpret_cast<const char*>(pickle.data());
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* end = start + pickle.size();
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end));
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(NULL == Pickle::FindNext(pickle.header_size_, start, end - 1));
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end + 1));
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, IteratorHasRoom) {
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle;
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteInt(1));
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteInt(2));
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const void* iter = 0;
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(pickle.IteratorHasRoomFor(iter, 1));
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  iter = pickle.payload();
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.IteratorHasRoomFor(iter, 0));
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.IteratorHasRoomFor(iter, 1));
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(pickle.IteratorHasRoomFor(iter, -1));
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.IteratorHasRoomFor(iter, sizeof(int) * 2));
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(pickle.IteratorHasRoomFor(iter, (sizeof(int) * 2) + 1));
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, Resize) {
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t unit = Pickle::kPayloadUnit;
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_array<char> data(new char[unit]);
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char* data_ptr = data.get();
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < unit; i++)
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    data_ptr[i] = 'G';
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // construct a message that will be exactly the size of one payload unit,
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // note that any data will have a 4-byte header indicating the size
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const size_t payload_size_after_header = unit - sizeof(uint32);
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle;
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  pickle.WriteData(data_ptr,
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      static_cast<int>(payload_size_after_header - sizeof(uint32)));
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t cur_payload = payload_size_after_header;
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // note: we assume 'unit' is a power of 2
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(unit, pickle.capacity());
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(pickle.payload_size(), payload_size_after_header);
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // fill out a full page (noting data header)
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  pickle.WriteData(data_ptr, static_cast<int>(unit - sizeof(uint32)));
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cur_payload += unit;
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(unit * 2, pickle.capacity());
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(cur_payload, pickle.payload_size());
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // one more byte should double the capacity
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  pickle.WriteData(data_ptr, 1);
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cur_payload += 5;
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(unit * 4, pickle.capacity());
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(cur_payload, pickle.payload_size());
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct CustomHeader : Pickle::Header {
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int blah;
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, HeaderPadding) {
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const uint32 kMagic = 0x12345678;
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle(sizeof(CustomHeader));
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  pickle.WriteInt(kMagic);
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // this should not overwrite the 'int' payload
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  pickle.headerT<CustomHeader>()->blah = 10;
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int result;
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(pickle.ReadInt(&iter, &result));
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(static_cast<uint32>(result), kMagic);
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, EqualsOperator) {
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle source;
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  source.WriteInt(1);
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle copy_refs_source_buffer(static_cast<const char*>(source.data()),
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                 source.size());
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle copy;
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  copy = copy_refs_source_buffer;
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(source.size(), copy.size());
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, EvilLengths) {
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle source;
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string str(100000, 'A');
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  source.WriteData(str.c_str(), 100000);
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // ReadString16 used to have its read buffer length calculation wrong leading
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to out-of-bounds reading.
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  string16 str16;
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(source.ReadString16(&iter, &str16));
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // And check we didn't break ReadString16.
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  str16 = (wchar_t) 'A';
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle str16_pickle;
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  str16_pickle.WriteString16(str16);
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  iter = NULL;
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(str16_pickle.ReadString16(&iter, &str16));
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1U, str16.length());
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check we don't fail in a length check with large WStrings.
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle big_len;
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  big_len.WriteInt(1 << 30);
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  iter = NULL;
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::wstring wstr;
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(big_len.ReadWString(&iter, &wstr));
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Check we can write zero bytes of data and 'data' can be NULL.
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, ZeroLength) {
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Pickle pickle;
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.WriteData(NULL, 0));
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void* iter = NULL;
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* outdata;
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int outdatalen;
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(pickle.ReadData(&iter, &outdata, &outdatalen));
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, outdatalen);
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We can't assert that outdata is NULL.
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Check that ReadBytes works properly with an iterator initialized to NULL.
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(PickleTest, ReadBytes) {
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Pickle pickle;
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int data = 0x7abcd;
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(pickle.WriteBytes(&data, sizeof(data)));
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void* iter = NULL;
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* outdata_char;
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(pickle.ReadBytes(&iter, &outdata_char, sizeof(data)));
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int outdata;
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  memcpy(&outdata, outdata_char, sizeof(outdata));
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(data, outdata);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
309