BackupData_test.cpp revision 16c4d154dca43c662571129af31b27433b919a32
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "ObbFile_test" 18#include <androidfw/BackupHelpers.h> 19#include <utils/Log.h> 20#include <utils/String8.h> 21 22#include <gtest/gtest.h> 23 24#include <sys/types.h> 25#include <sys/stat.h> 26#include <fcntl.h> 27#include <string.h> 28 29namespace android { 30 31#define TEST_FILENAME "/test.bd" 32 33// keys of different lengths to test padding 34#define KEY1 "key1" 35#define KEY2 "key2a" 36#define KEY3 "key3bc" 37#define KEY4 "key4def" 38 39// payloads of different lengths to test padding 40#define DATA1 "abcdefg" 41#define DATA2 "hijklmnopq" 42#define DATA3 "rstuvwxyz" 43// KEY4 is only ever deleted 44 45class BackupDataTest : public testing::Test { 46protected: 47 char* m_external_storage; 48 char* m_filename; 49 String8 mKey1; 50 String8 mKey2; 51 String8 mKey3; 52 String8 mKey4; 53 54 virtual void SetUp() { 55 m_external_storage = getenv("EXTERNAL_STORAGE"); 56 57 const int totalLen = strlen(m_external_storage) + strlen(TEST_FILENAME) + 1; 58 m_filename = new char[totalLen]; 59 snprintf(m_filename, totalLen, "%s%s", m_external_storage, TEST_FILENAME); 60 61 ::unlink(m_filename); 62 int fd = ::open(m_filename, O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); 63 if (fd < 0) { 64 FAIL() << "Couldn't create " << m_filename << " for writing"; 65 } 66 mKey1 = String8(KEY1); 67 mKey2 = String8(KEY2); 68 mKey3 = String8(KEY3); 69 mKey4 = String8(KEY4); 70 } 71 72 virtual void TearDown() { 73 } 74}; 75 76TEST_F(BackupDataTest, WriteAndReadSingle) { 77 int fd = ::open(m_filename, O_WRONLY); 78 BackupDataWriter* writer = new BackupDataWriter(fd); 79 80 EXPECT_EQ(NO_ERROR, writer->WriteEntityHeader(mKey1, sizeof(DATA1))) 81 << "WriteEntityHeader returned an error"; 82 EXPECT_EQ(NO_ERROR, writer->WriteEntityData(DATA1, sizeof(DATA1))) 83 << "WriteEntityData returned an error"; 84 85 ::close(fd); 86 fd = ::open(m_filename, O_RDONLY); 87 BackupDataReader* reader = new BackupDataReader(fd); 88 EXPECT_EQ(NO_ERROR, reader->Status()) 89 << "Reader ctor failed"; 90 91 bool done; 92 int type; 93 reader->ReadNextHeader(&done, &type); 94 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 95 << "wrong type from ReadNextHeader"; 96 97 String8 key; 98 size_t dataSize; 99 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 100 << "ReadEntityHeader returned an error"; 101 EXPECT_EQ(mKey1, key) 102 << "wrong key from ReadEntityHeader"; 103 EXPECT_EQ(sizeof(DATA1), dataSize) 104 << "wrong size from ReadEntityHeader"; 105 106 char* dataBytes = new char[dataSize]; 107 EXPECT_EQ((int) dataSize, reader->ReadEntityData(dataBytes, dataSize)) 108 << "ReadEntityData returned an error"; 109 for (unsigned int i = 0; i < sizeof(DATA1); i++) { 110 EXPECT_EQ(DATA1[i], dataBytes[i]) 111 << "data character " << i << " should be equal"; 112 } 113 delete dataBytes; 114 delete writer; 115 delete reader; 116} 117 118TEST_F(BackupDataTest, WriteAndReadMultiple) { 119 int fd = ::open(m_filename, O_WRONLY); 120 BackupDataWriter* writer = new BackupDataWriter(fd); 121 writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 122 writer->WriteEntityData(DATA1, sizeof(DATA1)); 123 writer->WriteEntityHeader(mKey2, sizeof(DATA2)); 124 writer->WriteEntityData(DATA2, sizeof(DATA2)); 125 126 ::close(fd); 127 fd = ::open(m_filename, O_RDONLY); 128 BackupDataReader* reader = new BackupDataReader(fd); 129 130 bool done; 131 int type; 132 String8 key; 133 size_t dataSize; 134 char* dataBytes; 135 // read first entity 136 reader->ReadNextHeader(&done, &type); 137 reader->ReadEntityHeader(&key, &dataSize); 138 dataBytes = new char[dataSize]; 139 reader->ReadEntityData(dataBytes, dataSize); 140 delete dataBytes; 141 142 // read and verify second entity 143 reader->ReadNextHeader(&done, &type); 144 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 145 << "wrong type from ReadNextHeader"; 146 147 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 148 << "ReadEntityHeader returned an error on second entity"; 149 EXPECT_EQ(mKey2, key) 150 << "wrong key from ReadEntityHeader on second entity"; 151 EXPECT_EQ(sizeof(DATA2), dataSize) 152 << "wrong size from ReadEntityHeader on second entity"; 153 154 dataBytes = new char[dataSize]; 155 EXPECT_EQ((int)dataSize, reader->ReadEntityData(dataBytes, dataSize)) 156 << "ReadEntityData returned an error on second entity"; 157 for (unsigned int i = 0; i < sizeof(DATA2); i++) { 158 EXPECT_EQ(DATA2[i], dataBytes[i]) 159 << "data character " << i << " should be equal"; 160 } 161 delete dataBytes; 162 delete writer; 163 delete reader; 164} 165 166TEST_F(BackupDataTest, SkipEntity) { 167 int fd = ::open(m_filename, O_WRONLY); 168 BackupDataWriter* writer = new BackupDataWriter(fd); 169 writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 170 writer->WriteEntityData(DATA1, sizeof(DATA1)); 171 writer->WriteEntityHeader(mKey2, sizeof(DATA2)); 172 writer->WriteEntityData(DATA2, sizeof(DATA2)); 173 writer->WriteEntityHeader(mKey3, sizeof(DATA3)); 174 writer->WriteEntityData(DATA3, sizeof(DATA3)); 175 176 ::close(fd); 177 fd = ::open(m_filename, O_RDONLY); 178 BackupDataReader* reader = new BackupDataReader(fd); 179 180 bool done; 181 int type; 182 String8 key; 183 size_t dataSize; 184 char* dataBytes; 185 // read first entity 186 reader->ReadNextHeader(&done, &type); 187 reader->ReadEntityHeader(&key, &dataSize); 188 dataBytes = new char[dataSize]; 189 reader->ReadEntityData(dataBytes, dataSize); 190 delete dataBytes; 191 192 // skip second entity 193 reader->ReadNextHeader(&done, &type); 194 reader->ReadEntityHeader(&key, &dataSize); 195 reader->SkipEntityData(); 196 197 // read and verify third entity 198 reader->ReadNextHeader(&done, &type); 199 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 200 << "wrong type from ReadNextHeader after skip"; 201 202 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 203 << "ReadEntityHeader returned an error on third entity"; 204 EXPECT_EQ(mKey3, key) 205 << "wrong key from ReadEntityHeader on third entity"; 206 EXPECT_EQ(sizeof(DATA3), dataSize) 207 << "wrong size from ReadEntityHeader on third entity"; 208 209 dataBytes = new char[dataSize]; 210 EXPECT_EQ((int) dataSize, reader->ReadEntityData(dataBytes, dataSize)) 211 << "ReadEntityData returned an error on third entity"; 212 for (unsigned int i = 0; i < sizeof(DATA3); i++) { 213 EXPECT_EQ(DATA3[i], dataBytes[i]) 214 << "data character " << i << " should be equal"; 215 } 216 delete dataBytes; 217 delete writer; 218 delete reader; 219} 220 221TEST_F(BackupDataTest, DeleteEntity) { 222 int fd = ::open(m_filename, O_WRONLY); 223 BackupDataWriter* writer = new BackupDataWriter(fd); 224 writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 225 writer->WriteEntityData(DATA1, sizeof(DATA1)); 226 writer->WriteEntityHeader(mKey2, -1); 227 228 ::close(fd); 229 fd = ::open(m_filename, O_RDONLY); 230 BackupDataReader* reader = new BackupDataReader(fd); 231 232 bool done; 233 int type; 234 String8 key; 235 size_t dataSize; 236 char* dataBytes; 237 // read first entity 238 reader->ReadNextHeader(&done, &type); 239 reader->ReadEntityHeader(&key, &dataSize); 240 dataBytes = new char[dataSize]; 241 reader->ReadEntityData(dataBytes, dataSize); 242 delete dataBytes; 243 244 // read and verify deletion 245 reader->ReadNextHeader(&done, &type); 246 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 247 << "wrong type from ReadNextHeader on deletion"; 248 249 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 250 << "ReadEntityHeader returned an error on second entity"; 251 EXPECT_EQ(mKey2, key) 252 << "wrong key from ReadEntityHeader on second entity"; 253 EXPECT_EQ(-1, (int) dataSize) 254 << "not recognizing deletion on second entity"; 255 256 delete writer; 257 delete reader; 258} 259 260TEST_F(BackupDataTest, EneityAfterDelete) { 261 int fd = ::open(m_filename, O_WRONLY); 262 BackupDataWriter* writer = new BackupDataWriter(fd); 263 writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 264 writer->WriteEntityData(DATA1, sizeof(DATA1)); 265 writer->WriteEntityHeader(mKey2, -1); 266 writer->WriteEntityHeader(mKey3, sizeof(DATA3)); 267 writer->WriteEntityData(DATA3, sizeof(DATA3)); 268 269 ::close(fd); 270 fd = ::open(m_filename, O_RDONLY); 271 BackupDataReader* reader = new BackupDataReader(fd); 272 273 bool done; 274 int type; 275 String8 key; 276 size_t dataSize; 277 char* dataBytes; 278 // read first entity 279 reader->ReadNextHeader(&done, &type); 280 reader->ReadEntityHeader(&key, &dataSize); 281 dataBytes = new char[dataSize]; 282 reader->ReadEntityData(dataBytes, dataSize); 283 delete dataBytes; 284 285 // read and verify deletion 286 reader->ReadNextHeader(&done, &type); 287 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 288 << "wrong type from ReadNextHeader on deletion"; 289 290 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 291 << "ReadEntityHeader returned an error on second entity"; 292 EXPECT_EQ(mKey2, key) 293 << "wrong key from ReadEntityHeader on second entity"; 294 EXPECT_EQ(-1, (int)dataSize) 295 << "not recognizing deletion on second entity"; 296 297 // read and verify third entity 298 reader->ReadNextHeader(&done, &type); 299 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 300 << "wrong type from ReadNextHeader after deletion"; 301 302 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 303 << "ReadEntityHeader returned an error on third entity"; 304 EXPECT_EQ(mKey3, key) 305 << "wrong key from ReadEntityHeader on third entity"; 306 EXPECT_EQ(sizeof(DATA3), dataSize) 307 << "wrong size from ReadEntityHeader on third entity"; 308 309 dataBytes = new char[dataSize]; 310 EXPECT_EQ((int) dataSize, reader->ReadEntityData(dataBytes, dataSize)) 311 << "ReadEntityData returned an error on third entity"; 312 for (unsigned int i = 0; i < sizeof(DATA3); i++) { 313 EXPECT_EQ(DATA3[i], dataBytes[i]) 314 << "data character " << i << " should be equal"; 315 } 316 delete dataBytes; 317 delete writer; 318 delete reader; 319} 320 321TEST_F(BackupDataTest, OnlyDeleteEntities) { 322 int fd = ::open(m_filename, O_WRONLY); 323 BackupDataWriter* writer = new BackupDataWriter(fd); 324 writer->WriteEntityHeader(mKey1, -1); 325 writer->WriteEntityHeader(mKey2, -1); 326 writer->WriteEntityHeader(mKey3, -1); 327 writer->WriteEntityHeader(mKey4, -1); 328 329 ::close(fd); 330 fd = ::open(m_filename, O_RDONLY); 331 BackupDataReader* reader = new BackupDataReader(fd); 332 333 bool done; 334 int type; 335 String8 key; 336 size_t dataSize; 337 // read and verify first deletion 338 reader->ReadNextHeader(&done, &type); 339 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 340 << "wrong type from ReadNextHeader first deletion"; 341 342 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 343 << "ReadEntityHeader returned an error on first entity"; 344 EXPECT_EQ(mKey1, key) 345 << "wrong key from ReadEntityHeader on first entity"; 346 EXPECT_EQ(-1, (int) dataSize) 347 << "not recognizing deletion on first entity"; 348 349 // read and verify second deletion 350 reader->ReadNextHeader(&done, &type); 351 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 352 << "wrong type from ReadNextHeader second deletion"; 353 354 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 355 << "ReadEntityHeader returned an error on second entity"; 356 EXPECT_EQ(mKey2, key) 357 << "wrong key from ReadEntityHeader on second entity"; 358 EXPECT_EQ(-1, (int) dataSize) 359 << "not recognizing deletion on second entity"; 360 361 // read and verify third deletion 362 reader->ReadNextHeader(&done, &type); 363 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 364 << "wrong type from ReadNextHeader third deletion"; 365 366 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 367 << "ReadEntityHeader returned an error on third entity"; 368 EXPECT_EQ(mKey3, key) 369 << "wrong key from ReadEntityHeader on third entity"; 370 EXPECT_EQ(-1, (int) dataSize) 371 << "not recognizing deletion on third entity"; 372 373 // read and verify fourth deletion 374 reader->ReadNextHeader(&done, &type); 375 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 376 << "wrong type from ReadNextHeader fourth deletion"; 377 378 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 379 << "ReadEntityHeader returned an error on fourth entity"; 380 EXPECT_EQ(mKey4, key) 381 << "wrong key from ReadEntityHeader on fourth entity"; 382 EXPECT_EQ(-1, (int) dataSize) 383 << "not recognizing deletion on fourth entity"; 384 385 delete writer; 386 delete reader; 387} 388 389TEST_F(BackupDataTest, ReadDeletedEntityData) { 390 int fd = ::open(m_filename, O_WRONLY); 391 BackupDataWriter* writer = new BackupDataWriter(fd); 392 writer->WriteEntityHeader(mKey1, -1); 393 writer->WriteEntityHeader(mKey2, -1); 394 395 ::close(fd); 396 fd = ::open(m_filename, O_RDONLY); 397 BackupDataReader* reader = new BackupDataReader(fd); 398 399 bool done; 400 int type; 401 String8 key; 402 size_t dataSize; 403 // read and verify first deletion 404 reader->ReadNextHeader(&done, &type); 405 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 406 << "wrong type from ReadNextHeader first deletion"; 407 408 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 409 << "ReadEntityHeader returned an error on first entity"; 410 EXPECT_EQ(mKey1, key) 411 << "wrong key from ReadEntityHeader on first entity"; 412 EXPECT_EQ(-1, (int) dataSize) 413 << "not recognizing deletion on first entity"; 414 415 // erroneously try to read first entity data 416 char* dataBytes = new char[10]; 417 dataBytes[0] = 'A'; 418 EXPECT_EQ(NO_ERROR, reader->ReadEntityData(dataBytes, dataSize)); 419 // expect dataBytes to be unmodofied 420 EXPECT_EQ('A', dataBytes[0]); 421 422 // read and verify second deletion 423 reader->ReadNextHeader(&done, &type); 424 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 425 << "wrong type from ReadNextHeader second deletion"; 426 427 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 428 << "ReadEntityHeader returned an error on second entity"; 429 EXPECT_EQ(mKey2, key) 430 << "wrong key from ReadEntityHeader on second entity"; 431 EXPECT_EQ(-1, (int) dataSize) 432 << "not recognizing deletion on second entity"; 433 434 delete writer; 435 delete reader; 436} 437 438} 439