116c4d154dca43c662571129af31b27433b919a32Adam Lesinski/* 216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Copyright (C) 2010 The Android Open Source Project 316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * 416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 516c4d154dca43c662571129af31b27433b919a32Adam Lesinski * you may not use this file except in compliance with the License. 616c4d154dca43c662571129af31b27433b919a32Adam Lesinski * You may obtain a copy of the License at 716c4d154dca43c662571129af31b27433b919a32Adam Lesinski * 816c4d154dca43c662571129af31b27433b919a32Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 916c4d154dca43c662571129af31b27433b919a32Adam Lesinski * 1016c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1116c4d154dca43c662571129af31b27433b919a32Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * See the License for the specific language governing permissions and 1416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * limitations under the License. 1516c4d154dca43c662571129af31b27433b919a32Adam Lesinski */ 1616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 1716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define LOG_TAG "ObbFile_test" 1816c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <androidfw/BackupHelpers.h> 1916c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/Log.h> 2016c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/String8.h> 2116c4d154dca43c662571129af31b27433b919a32Adam Lesinski 2216c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <gtest/gtest.h> 2316c4d154dca43c662571129af31b27433b919a32Adam Lesinski 2416c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <sys/types.h> 2516c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <sys/stat.h> 2616c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <fcntl.h> 2716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <string.h> 2816c4d154dca43c662571129af31b27433b919a32Adam Lesinski 2916c4d154dca43c662571129af31b27433b919a32Adam Lesinskinamespace android { 3016c4d154dca43c662571129af31b27433b919a32Adam Lesinski 3116c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define TEST_FILENAME "/test.bd" 3216c4d154dca43c662571129af31b27433b919a32Adam Lesinski 3316c4d154dca43c662571129af31b27433b919a32Adam Lesinski// keys of different lengths to test padding 3416c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define KEY1 "key1" 3516c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define KEY2 "key2a" 3616c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define KEY3 "key3bc" 3716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define KEY4 "key4def" 3816c4d154dca43c662571129af31b27433b919a32Adam Lesinski 3916c4d154dca43c662571129af31b27433b919a32Adam Lesinski// payloads of different lengths to test padding 4016c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define DATA1 "abcdefg" 4116c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define DATA2 "hijklmnopq" 4216c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define DATA3 "rstuvwxyz" 4316c4d154dca43c662571129af31b27433b919a32Adam Lesinski// KEY4 is only ever deleted 4416c4d154dca43c662571129af31b27433b919a32Adam Lesinski 4516c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass BackupDataTest : public testing::Test { 4616c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprotected: 4716c4d154dca43c662571129af31b27433b919a32Adam Lesinski char* m_external_storage; 48d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski String8 mFilename; 4916c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 mKey1; 5016c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 mKey2; 5116c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 mKey3; 5216c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 mKey4; 5316c4d154dca43c662571129af31b27433b919a32Adam Lesinski 5416c4d154dca43c662571129af31b27433b919a32Adam Lesinski virtual void SetUp() { 5516c4d154dca43c662571129af31b27433b919a32Adam Lesinski m_external_storage = getenv("EXTERNAL_STORAGE"); 56d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski mFilename.append(m_external_storage); 57d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski mFilename.append(TEST_FILENAME); 5816c4d154dca43c662571129af31b27433b919a32Adam Lesinski 59d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski ::unlink(mFilename.string()); 60d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski int fd = ::open(mFilename.string(), O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); 6116c4d154dca43c662571129af31b27433b919a32Adam Lesinski if (fd < 0) { 62d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski FAIL() << "Couldn't create " << mFilename.string() << " for writing"; 6316c4d154dca43c662571129af31b27433b919a32Adam Lesinski } 6416c4d154dca43c662571129af31b27433b919a32Adam Lesinski mKey1 = String8(KEY1); 6516c4d154dca43c662571129af31b27433b919a32Adam Lesinski mKey2 = String8(KEY2); 6616c4d154dca43c662571129af31b27433b919a32Adam Lesinski mKey3 = String8(KEY3); 6716c4d154dca43c662571129af31b27433b919a32Adam Lesinski mKey4 = String8(KEY4); 6816c4d154dca43c662571129af31b27433b919a32Adam Lesinski } 6916c4d154dca43c662571129af31b27433b919a32Adam Lesinski 7016c4d154dca43c662571129af31b27433b919a32Adam Lesinski virtual void TearDown() { 7116c4d154dca43c662571129af31b27433b919a32Adam Lesinski } 7216c4d154dca43c662571129af31b27433b919a32Adam Lesinski}; 7316c4d154dca43c662571129af31b27433b919a32Adam Lesinski 7416c4d154dca43c662571129af31b27433b919a32Adam LesinskiTEST_F(BackupDataTest, WriteAndReadSingle) { 75d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski int fd = ::open(mFilename.string(), O_WRONLY); 7616c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataWriter* writer = new BackupDataWriter(fd); 7716c4d154dca43c662571129af31b27433b919a32Adam Lesinski 7816c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, writer->WriteEntityHeader(mKey1, sizeof(DATA1))) 7916c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "WriteEntityHeader returned an error"; 8016c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, writer->WriteEntityData(DATA1, sizeof(DATA1))) 8116c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "WriteEntityData returned an error"; 8216c4d154dca43c662571129af31b27433b919a32Adam Lesinski 8316c4d154dca43c662571129af31b27433b919a32Adam Lesinski ::close(fd); 84d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski fd = ::open(mFilename.string(), O_RDONLY); 8516c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataReader* reader = new BackupDataReader(fd); 8616c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->Status()) 8716c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "Reader ctor failed"; 8816c4d154dca43c662571129af31b27433b919a32Adam Lesinski 8916c4d154dca43c662571129af31b27433b919a32Adam Lesinski bool done; 9016c4d154dca43c662571129af31b27433b919a32Adam Lesinski int type; 9116c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 9216c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 9316c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader"; 9416c4d154dca43c662571129af31b27433b919a32Adam Lesinski 9516c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 key; 9616c4d154dca43c662571129af31b27433b919a32Adam Lesinski size_t dataSize; 9716c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 9816c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error"; 9916c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey1, key) 10016c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader"; 10116c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(sizeof(DATA1), dataSize) 10216c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong size from ReadEntityHeader"; 10316c4d154dca43c662571129af31b27433b919a32Adam Lesinski 10416c4d154dca43c662571129af31b27433b919a32Adam Lesinski char* dataBytes = new char[dataSize]; 10516c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ((int) dataSize, reader->ReadEntityData(dataBytes, dataSize)) 10616c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityData returned an error"; 10716c4d154dca43c662571129af31b27433b919a32Adam Lesinski for (unsigned int i = 0; i < sizeof(DATA1); i++) { 10816c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(DATA1[i], dataBytes[i]) 10916c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "data character " << i << " should be equal"; 11016c4d154dca43c662571129af31b27433b919a32Adam Lesinski } 1118dc8313c3e5781dfd65915da453ebad1561a7cb9Dan Albert delete[] dataBytes; 11216c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete writer; 11316c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete reader; 11416c4d154dca43c662571129af31b27433b919a32Adam Lesinski} 11516c4d154dca43c662571129af31b27433b919a32Adam Lesinski 11616c4d154dca43c662571129af31b27433b919a32Adam LesinskiTEST_F(BackupDataTest, WriteAndReadMultiple) { 117d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski int fd = ::open(mFilename.string(), O_WRONLY); 11816c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataWriter* writer = new BackupDataWriter(fd); 11916c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 12016c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityData(DATA1, sizeof(DATA1)); 12116c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey2, sizeof(DATA2)); 12216c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityData(DATA2, sizeof(DATA2)); 12316c4d154dca43c662571129af31b27433b919a32Adam Lesinski 12416c4d154dca43c662571129af31b27433b919a32Adam Lesinski ::close(fd); 125d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski fd = ::open(mFilename.string(), O_RDONLY); 12616c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataReader* reader = new BackupDataReader(fd); 12716c4d154dca43c662571129af31b27433b919a32Adam Lesinski 12816c4d154dca43c662571129af31b27433b919a32Adam Lesinski bool done; 12916c4d154dca43c662571129af31b27433b919a32Adam Lesinski int type; 13016c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 key; 13116c4d154dca43c662571129af31b27433b919a32Adam Lesinski size_t dataSize; 13216c4d154dca43c662571129af31b27433b919a32Adam Lesinski char* dataBytes; 13316c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read first entity 13416c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 13516c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadEntityHeader(&key, &dataSize); 13616c4d154dca43c662571129af31b27433b919a32Adam Lesinski dataBytes = new char[dataSize]; 13716c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadEntityData(dataBytes, dataSize); 13816c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete dataBytes; 13916c4d154dca43c662571129af31b27433b919a32Adam Lesinski 14016c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify second entity 14116c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 14216c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 14316c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader"; 14416c4d154dca43c662571129af31b27433b919a32Adam Lesinski 14516c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 14616c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on second entity"; 14716c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey2, key) 14816c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on second entity"; 14916c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(sizeof(DATA2), dataSize) 15016c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong size from ReadEntityHeader on second entity"; 15116c4d154dca43c662571129af31b27433b919a32Adam Lesinski 15216c4d154dca43c662571129af31b27433b919a32Adam Lesinski dataBytes = new char[dataSize]; 15316c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ((int)dataSize, reader->ReadEntityData(dataBytes, dataSize)) 15416c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityData returned an error on second entity"; 15516c4d154dca43c662571129af31b27433b919a32Adam Lesinski for (unsigned int i = 0; i < sizeof(DATA2); i++) { 15616c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(DATA2[i], dataBytes[i]) 15716c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "data character " << i << " should be equal"; 15816c4d154dca43c662571129af31b27433b919a32Adam Lesinski } 15916c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete dataBytes; 16016c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete writer; 16116c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete reader; 16216c4d154dca43c662571129af31b27433b919a32Adam Lesinski} 16316c4d154dca43c662571129af31b27433b919a32Adam Lesinski 16416c4d154dca43c662571129af31b27433b919a32Adam LesinskiTEST_F(BackupDataTest, SkipEntity) { 165d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski int fd = ::open(mFilename.string(), O_WRONLY); 16616c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataWriter* writer = new BackupDataWriter(fd); 16716c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 16816c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityData(DATA1, sizeof(DATA1)); 16916c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey2, sizeof(DATA2)); 17016c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityData(DATA2, sizeof(DATA2)); 17116c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey3, sizeof(DATA3)); 17216c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityData(DATA3, sizeof(DATA3)); 17316c4d154dca43c662571129af31b27433b919a32Adam Lesinski 17416c4d154dca43c662571129af31b27433b919a32Adam Lesinski ::close(fd); 175d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski fd = ::open(mFilename.string(), O_RDONLY); 17616c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataReader* reader = new BackupDataReader(fd); 17716c4d154dca43c662571129af31b27433b919a32Adam Lesinski 17816c4d154dca43c662571129af31b27433b919a32Adam Lesinski bool done; 17916c4d154dca43c662571129af31b27433b919a32Adam Lesinski int type; 18016c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 key; 18116c4d154dca43c662571129af31b27433b919a32Adam Lesinski size_t dataSize; 18216c4d154dca43c662571129af31b27433b919a32Adam Lesinski char* dataBytes; 18316c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read first entity 18416c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 18516c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadEntityHeader(&key, &dataSize); 18616c4d154dca43c662571129af31b27433b919a32Adam Lesinski dataBytes = new char[dataSize]; 18716c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadEntityData(dataBytes, dataSize); 18816c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete dataBytes; 18916c4d154dca43c662571129af31b27433b919a32Adam Lesinski 19016c4d154dca43c662571129af31b27433b919a32Adam Lesinski // skip second entity 19116c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 19216c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadEntityHeader(&key, &dataSize); 19316c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->SkipEntityData(); 19416c4d154dca43c662571129af31b27433b919a32Adam Lesinski 19516c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify third entity 19616c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 19716c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 19816c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader after skip"; 19916c4d154dca43c662571129af31b27433b919a32Adam Lesinski 20016c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 20116c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on third entity"; 20216c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey3, key) 20316c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on third entity"; 20416c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(sizeof(DATA3), dataSize) 20516c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong size from ReadEntityHeader on third entity"; 20616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 20716c4d154dca43c662571129af31b27433b919a32Adam Lesinski dataBytes = new char[dataSize]; 20816c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ((int) dataSize, reader->ReadEntityData(dataBytes, dataSize)) 20916c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityData returned an error on third entity"; 21016c4d154dca43c662571129af31b27433b919a32Adam Lesinski for (unsigned int i = 0; i < sizeof(DATA3); i++) { 21116c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(DATA3[i], dataBytes[i]) 21216c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "data character " << i << " should be equal"; 21316c4d154dca43c662571129af31b27433b919a32Adam Lesinski } 21416c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete dataBytes; 21516c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete writer; 21616c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete reader; 21716c4d154dca43c662571129af31b27433b919a32Adam Lesinski} 21816c4d154dca43c662571129af31b27433b919a32Adam Lesinski 21916c4d154dca43c662571129af31b27433b919a32Adam LesinskiTEST_F(BackupDataTest, DeleteEntity) { 220d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski int fd = ::open(mFilename.string(), O_WRONLY); 22116c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataWriter* writer = new BackupDataWriter(fd); 22216c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 22316c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityData(DATA1, sizeof(DATA1)); 22416c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey2, -1); 22516c4d154dca43c662571129af31b27433b919a32Adam Lesinski 22616c4d154dca43c662571129af31b27433b919a32Adam Lesinski ::close(fd); 227d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski fd = ::open(mFilename.string(), O_RDONLY); 22816c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataReader* reader = new BackupDataReader(fd); 22916c4d154dca43c662571129af31b27433b919a32Adam Lesinski 23016c4d154dca43c662571129af31b27433b919a32Adam Lesinski bool done; 23116c4d154dca43c662571129af31b27433b919a32Adam Lesinski int type; 23216c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 key; 23316c4d154dca43c662571129af31b27433b919a32Adam Lesinski size_t dataSize; 23416c4d154dca43c662571129af31b27433b919a32Adam Lesinski char* dataBytes; 23516c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read first entity 23616c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 23716c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadEntityHeader(&key, &dataSize); 23816c4d154dca43c662571129af31b27433b919a32Adam Lesinski dataBytes = new char[dataSize]; 23916c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadEntityData(dataBytes, dataSize); 24016c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete dataBytes; 24116c4d154dca43c662571129af31b27433b919a32Adam Lesinski 24216c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify deletion 24316c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 24416c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 24516c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader on deletion"; 24616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 24716c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 24816c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on second entity"; 24916c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey2, key) 25016c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on second entity"; 25116c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(-1, (int) dataSize) 25216c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "not recognizing deletion on second entity"; 25316c4d154dca43c662571129af31b27433b919a32Adam Lesinski 25416c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete writer; 25516c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete reader; 25616c4d154dca43c662571129af31b27433b919a32Adam Lesinski} 25716c4d154dca43c662571129af31b27433b919a32Adam Lesinski 25816c4d154dca43c662571129af31b27433b919a32Adam LesinskiTEST_F(BackupDataTest, EneityAfterDelete) { 259d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski int fd = ::open(mFilename.string(), O_WRONLY); 26016c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataWriter* writer = new BackupDataWriter(fd); 26116c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 26216c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityData(DATA1, sizeof(DATA1)); 26316c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey2, -1); 26416c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey3, sizeof(DATA3)); 26516c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityData(DATA3, sizeof(DATA3)); 26616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 26716c4d154dca43c662571129af31b27433b919a32Adam Lesinski ::close(fd); 268d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski fd = ::open(mFilename.string(), O_RDONLY); 26916c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataReader* reader = new BackupDataReader(fd); 27016c4d154dca43c662571129af31b27433b919a32Adam Lesinski 27116c4d154dca43c662571129af31b27433b919a32Adam Lesinski bool done; 27216c4d154dca43c662571129af31b27433b919a32Adam Lesinski int type; 27316c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 key; 27416c4d154dca43c662571129af31b27433b919a32Adam Lesinski size_t dataSize; 27516c4d154dca43c662571129af31b27433b919a32Adam Lesinski char* dataBytes; 27616c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read first entity 27716c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 27816c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadEntityHeader(&key, &dataSize); 27916c4d154dca43c662571129af31b27433b919a32Adam Lesinski dataBytes = new char[dataSize]; 28016c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadEntityData(dataBytes, dataSize); 28116c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete dataBytes; 28216c4d154dca43c662571129af31b27433b919a32Adam Lesinski 28316c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify deletion 28416c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 28516c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 28616c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader on deletion"; 28716c4d154dca43c662571129af31b27433b919a32Adam Lesinski 28816c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 28916c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on second entity"; 29016c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey2, key) 29116c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on second entity"; 29216c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(-1, (int)dataSize) 29316c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "not recognizing deletion on second entity"; 29416c4d154dca43c662571129af31b27433b919a32Adam Lesinski 29516c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify third entity 29616c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 29716c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 29816c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader after deletion"; 29916c4d154dca43c662571129af31b27433b919a32Adam Lesinski 30016c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 30116c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on third entity"; 30216c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey3, key) 30316c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on third entity"; 30416c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(sizeof(DATA3), dataSize) 30516c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong size from ReadEntityHeader on third entity"; 30616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 30716c4d154dca43c662571129af31b27433b919a32Adam Lesinski dataBytes = new char[dataSize]; 30816c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ((int) dataSize, reader->ReadEntityData(dataBytes, dataSize)) 30916c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityData returned an error on third entity"; 31016c4d154dca43c662571129af31b27433b919a32Adam Lesinski for (unsigned int i = 0; i < sizeof(DATA3); i++) { 31116c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(DATA3[i], dataBytes[i]) 31216c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "data character " << i << " should be equal"; 31316c4d154dca43c662571129af31b27433b919a32Adam Lesinski } 31416c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete dataBytes; 31516c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete writer; 31616c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete reader; 31716c4d154dca43c662571129af31b27433b919a32Adam Lesinski} 31816c4d154dca43c662571129af31b27433b919a32Adam Lesinski 31916c4d154dca43c662571129af31b27433b919a32Adam LesinskiTEST_F(BackupDataTest, OnlyDeleteEntities) { 320d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski int fd = ::open(mFilename.string(), O_WRONLY); 32116c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataWriter* writer = new BackupDataWriter(fd); 32216c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey1, -1); 32316c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey2, -1); 32416c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey3, -1); 32516c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey4, -1); 32616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 32716c4d154dca43c662571129af31b27433b919a32Adam Lesinski ::close(fd); 328d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski fd = ::open(mFilename.string(), O_RDONLY); 32916c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataReader* reader = new BackupDataReader(fd); 33016c4d154dca43c662571129af31b27433b919a32Adam Lesinski 33116c4d154dca43c662571129af31b27433b919a32Adam Lesinski bool done; 33216c4d154dca43c662571129af31b27433b919a32Adam Lesinski int type; 33316c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 key; 33416c4d154dca43c662571129af31b27433b919a32Adam Lesinski size_t dataSize; 33516c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify first deletion 33616c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 33716c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 33816c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader first deletion"; 33916c4d154dca43c662571129af31b27433b919a32Adam Lesinski 34016c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 34116c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on first entity"; 34216c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey1, key) 34316c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on first entity"; 34416c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(-1, (int) dataSize) 34516c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "not recognizing deletion on first entity"; 34616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 34716c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify second deletion 34816c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 34916c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 35016c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader second deletion"; 35116c4d154dca43c662571129af31b27433b919a32Adam Lesinski 35216c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 35316c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on second entity"; 35416c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey2, key) 35516c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on second entity"; 35616c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(-1, (int) dataSize) 35716c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "not recognizing deletion on second entity"; 35816c4d154dca43c662571129af31b27433b919a32Adam Lesinski 35916c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify third deletion 36016c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 36116c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 36216c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader third deletion"; 36316c4d154dca43c662571129af31b27433b919a32Adam Lesinski 36416c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 36516c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on third entity"; 36616c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey3, key) 36716c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on third entity"; 36816c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(-1, (int) dataSize) 36916c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "not recognizing deletion on third entity"; 37016c4d154dca43c662571129af31b27433b919a32Adam Lesinski 37116c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify fourth deletion 37216c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 37316c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 37416c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader fourth deletion"; 37516c4d154dca43c662571129af31b27433b919a32Adam Lesinski 37616c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 37716c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on fourth entity"; 37816c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey4, key) 37916c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on fourth entity"; 38016c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(-1, (int) dataSize) 38116c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "not recognizing deletion on fourth entity"; 38216c4d154dca43c662571129af31b27433b919a32Adam Lesinski 38316c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete writer; 38416c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete reader; 38516c4d154dca43c662571129af31b27433b919a32Adam Lesinski} 38616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 38716c4d154dca43c662571129af31b27433b919a32Adam LesinskiTEST_F(BackupDataTest, ReadDeletedEntityData) { 388d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski int fd = ::open(mFilename.string(), O_WRONLY); 38916c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataWriter* writer = new BackupDataWriter(fd); 39016c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey1, -1); 39116c4d154dca43c662571129af31b27433b919a32Adam Lesinski writer->WriteEntityHeader(mKey2, -1); 39216c4d154dca43c662571129af31b27433b919a32Adam Lesinski 39316c4d154dca43c662571129af31b27433b919a32Adam Lesinski ::close(fd); 394d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski fd = ::open(mFilename.string(), O_RDONLY); 39516c4d154dca43c662571129af31b27433b919a32Adam Lesinski BackupDataReader* reader = new BackupDataReader(fd); 39616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 39716c4d154dca43c662571129af31b27433b919a32Adam Lesinski bool done; 39816c4d154dca43c662571129af31b27433b919a32Adam Lesinski int type; 39916c4d154dca43c662571129af31b27433b919a32Adam Lesinski String8 key; 40016c4d154dca43c662571129af31b27433b919a32Adam Lesinski size_t dataSize; 40116c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify first deletion 40216c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 40316c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 40416c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader first deletion"; 40516c4d154dca43c662571129af31b27433b919a32Adam Lesinski 40616c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 40716c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on first entity"; 40816c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey1, key) 40916c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on first entity"; 41016c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(-1, (int) dataSize) 41116c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "not recognizing deletion on first entity"; 41216c4d154dca43c662571129af31b27433b919a32Adam Lesinski 41316c4d154dca43c662571129af31b27433b919a32Adam Lesinski // erroneously try to read first entity data 41416c4d154dca43c662571129af31b27433b919a32Adam Lesinski char* dataBytes = new char[10]; 41516c4d154dca43c662571129af31b27433b919a32Adam Lesinski dataBytes[0] = 'A'; 41616c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityData(dataBytes, dataSize)); 41716c4d154dca43c662571129af31b27433b919a32Adam Lesinski // expect dataBytes to be unmodofied 41816c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ('A', dataBytes[0]); 41916c4d154dca43c662571129af31b27433b919a32Adam Lesinski 42016c4d154dca43c662571129af31b27433b919a32Adam Lesinski // read and verify second deletion 42116c4d154dca43c662571129af31b27433b919a32Adam Lesinski reader->ReadNextHeader(&done, &type); 42216c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 42316c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong type from ReadNextHeader second deletion"; 42416c4d154dca43c662571129af31b27433b919a32Adam Lesinski 42516c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 42616c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "ReadEntityHeader returned an error on second entity"; 42716c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(mKey2, key) 42816c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "wrong key from ReadEntityHeader on second entity"; 42916c4d154dca43c662571129af31b27433b919a32Adam Lesinski EXPECT_EQ(-1, (int) dataSize) 43016c4d154dca43c662571129af31b27433b919a32Adam Lesinski << "not recognizing deletion on second entity"; 43116c4d154dca43c662571129af31b27433b919a32Adam Lesinski 432d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski delete[] dataBytes; 43316c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete writer; 43416c4d154dca43c662571129af31b27433b919a32Adam Lesinski delete reader; 43516c4d154dca43c662571129af31b27433b919a32Adam Lesinski} 43616c4d154dca43c662571129af31b27433b919a32Adam Lesinski 43716c4d154dca43c662571129af31b27433b919a32Adam Lesinski} 438