pickle_unittest.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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 17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(PickleTest, FindNextWithIncompleteHeader) { 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen size_t header_size = sizeof(Pickle::Header); 17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_array<char> buffer(new char[header_size - 1]); 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen memset(buffer.get(), 0x1, header_size - 1); 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const char* start = buffer.get(); 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const char* end = start + header_size - 1; 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(NULL == Pickle::FindNext(header_size, start, end)); 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, IteratorHasRoom) { 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle pickle; 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(pickle.WriteInt(1)); 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(pickle.WriteInt(2)); 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const void* iter = 0; 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(pickle.IteratorHasRoomFor(iter, 1)); 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott iter = pickle.payload(); 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(pickle.IteratorHasRoomFor(iter, 0)); 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(pickle.IteratorHasRoomFor(iter, 1)); 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(pickle.IteratorHasRoomFor(iter, -1)); 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(pickle.IteratorHasRoomFor(iter, sizeof(int) * 2)); 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(pickle.IteratorHasRoomFor(iter, (sizeof(int) * 2) + 1)); 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, Resize) { 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott size_t unit = Pickle::kPayloadUnit; 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_array<char> data(new char[unit]); 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char* data_ptr = data.get(); 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < unit; i++) 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott data_ptr[i] = 'G'; 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // construct a message that will be exactly the size of one payload unit, 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // note that any data will have a 4-byte header indicating the size 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const size_t payload_size_after_header = unit - sizeof(uint32); 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle pickle; 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pickle.WriteData(data_ptr, 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static_cast<int>(payload_size_after_header - sizeof(uint32))); 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott size_t cur_payload = payload_size_after_header; 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // note: we assume 'unit' is a power of 2 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(unit, pickle.capacity()); 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(pickle.payload_size(), payload_size_after_header); 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // fill out a full page (noting data header) 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pickle.WriteData(data_ptr, static_cast<int>(unit - sizeof(uint32))); 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cur_payload += unit; 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(unit * 2, pickle.capacity()); 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(cur_payload, pickle.payload_size()); 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // one more byte should double the capacity 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pickle.WriteData(data_ptr, 1); 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cur_payload += 5; 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(unit * 4, pickle.capacity()); 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(cur_payload, pickle.payload_size()); 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct CustomHeader : Pickle::Header { 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int blah; 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, HeaderPadding) { 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const uint32 kMagic = 0x12345678; 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle pickle(sizeof(CustomHeader)); 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pickle.WriteInt(kMagic); 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // this should not overwrite the 'int' payload 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pickle.headerT<CustomHeader>()->blah = 10; 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int result; 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(pickle.ReadInt(&iter, &result)); 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(static_cast<uint32>(result), kMagic); 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, EqualsOperator) { 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle source; 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott source.WriteInt(1); 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle copy_refs_source_buffer(static_cast<const char*>(source.data()), 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott source.size()); 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle copy; 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott copy = copy_refs_source_buffer; 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ(source.size(), copy.size()); 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, EvilLengths) { 268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle source; 269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string str(100000, 'A'); 270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott source.WriteData(str.c_str(), 100000); 271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ReadString16 used to have its read buffer length calculation wrong leading 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // to out-of-bounds reading. 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott string16 str16; 275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(source.ReadString16(&iter, &str16)); 276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // And check we didn't break ReadString16. 278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str16 = (wchar_t) 'A'; 279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle str16_pickle; 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str16_pickle.WriteString16(str16); 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott iter = NULL; 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(str16_pickle.ReadString16(&iter, &str16)); 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1U, str16.length()); 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Check we don't fail in a length check with large WStrings. 286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle big_len; 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott big_len.WriteInt(1 << 30); 288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott iter = NULL; 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::wstring wstr; 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(big_len.ReadWString(&iter, &wstr)); 291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Check we can write zero bytes of data and 'data' can be NULL. 294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(PickleTest, ZeroLength) { 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Pickle pickle; 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(pickle.WriteData(NULL, 0)); 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* outdata; 300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int outdatalen; 301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(pickle.ReadData(&iter, &outdata, &outdatalen)); 302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, outdatalen); 303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We can't assert that outdata is NULL. 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Check that ReadBytes works properly with an iterator initialized to NULL. 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(PickleTest, ReadBytes) { 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pickle pickle; 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int data = 0x7abcd; 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(pickle.WriteBytes(&data, sizeof(data))); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* iter = NULL; 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* outdata_char; 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(pickle.ReadBytes(&iter, &outdata_char, sizeof(data))); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int outdata; 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch memcpy(&outdata, outdata_char, sizeof(outdata)); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(data, outdata); 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 320