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  }
11116c4d154dca43c662571129af31b27433b919a32Adam Lesinski  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