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 29 namespace 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 45 class BackupDataTest : public testing::Test { 46 protected: 47 char* m_external_storage; 48 String8 mFilename; 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 mFilename.append(m_external_storage); 57 mFilename.append(TEST_FILENAME); 58 59 ::unlink(mFilename.string()); 60 int fd = ::open(mFilename.string(), O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); 61 if (fd < 0) { 62 FAIL() << "Couldn't create " << mFilename.string() << " for writing"; 63 } 64 mKey1 = String8(KEY1); 65 mKey2 = String8(KEY2); 66 mKey3 = String8(KEY3); 67 mKey4 = String8(KEY4); 68 } 69 70 virtual void TearDown() { 71 } 72 }; 73 74 TEST_F(BackupDataTest, WriteAndReadSingle) { 75 int fd = ::open(mFilename.string(), O_WRONLY); 76 BackupDataWriter* writer = new BackupDataWriter(fd); 77 78 EXPECT_EQ(NO_ERROR, writer->WriteEntityHeader(mKey1, sizeof(DATA1))) 79 << "WriteEntityHeader returned an error"; 80 EXPECT_EQ(NO_ERROR, writer->WriteEntityData(DATA1, sizeof(DATA1))) 81 << "WriteEntityData returned an error"; 82 83 ::close(fd); 84 fd = ::open(mFilename.string(), O_RDONLY); 85 BackupDataReader* reader = new BackupDataReader(fd); 86 EXPECT_EQ(NO_ERROR, reader->Status()) 87 << "Reader ctor failed"; 88 89 bool done; 90 int type; 91 reader->ReadNextHeader(&done, &type); 92 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 93 << "wrong type from ReadNextHeader"; 94 95 String8 key; 96 size_t dataSize; 97 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 98 << "ReadEntityHeader returned an error"; 99 EXPECT_EQ(mKey1, key) 100 << "wrong key from ReadEntityHeader"; 101 EXPECT_EQ(sizeof(DATA1), dataSize) 102 << "wrong size from ReadEntityHeader"; 103 104 char* dataBytes = new char[dataSize]; 105 EXPECT_EQ((int) dataSize, reader->ReadEntityData(dataBytes, dataSize)) 106 << "ReadEntityData returned an error"; 107 for (unsigned int i = 0; i < sizeof(DATA1); i++) { 108 EXPECT_EQ(DATA1[i], dataBytes[i]) 109 << "data character " << i << " should be equal"; 110 } 111 delete[] dataBytes; 112 delete writer; 113 delete reader; 114 } 115 116 TEST_F(BackupDataTest, WriteAndReadMultiple) { 117 int fd = ::open(mFilename.string(), O_WRONLY); 118 BackupDataWriter* writer = new BackupDataWriter(fd); 119 writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 120 writer->WriteEntityData(DATA1, sizeof(DATA1)); 121 writer->WriteEntityHeader(mKey2, sizeof(DATA2)); 122 writer->WriteEntityData(DATA2, sizeof(DATA2)); 123 124 ::close(fd); 125 fd = ::open(mFilename.string(), O_RDONLY); 126 BackupDataReader* reader = new BackupDataReader(fd); 127 128 bool done; 129 int type; 130 String8 key; 131 size_t dataSize; 132 char* dataBytes; 133 // read first entity 134 reader->ReadNextHeader(&done, &type); 135 reader->ReadEntityHeader(&key, &dataSize); 136 dataBytes = new char[dataSize]; 137 reader->ReadEntityData(dataBytes, dataSize); 138 delete dataBytes; 139 140 // read and verify second entity 141 reader->ReadNextHeader(&done, &type); 142 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 143 << "wrong type from ReadNextHeader"; 144 145 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 146 << "ReadEntityHeader returned an error on second entity"; 147 EXPECT_EQ(mKey2, key) 148 << "wrong key from ReadEntityHeader on second entity"; 149 EXPECT_EQ(sizeof(DATA2), dataSize) 150 << "wrong size from ReadEntityHeader on second entity"; 151 152 dataBytes = new char[dataSize]; 153 EXPECT_EQ((int)dataSize, reader->ReadEntityData(dataBytes, dataSize)) 154 << "ReadEntityData returned an error on second entity"; 155 for (unsigned int i = 0; i < sizeof(DATA2); i++) { 156 EXPECT_EQ(DATA2[i], dataBytes[i]) 157 << "data character " << i << " should be equal"; 158 } 159 delete dataBytes; 160 delete writer; 161 delete reader; 162 } 163 164 TEST_F(BackupDataTest, SkipEntity) { 165 int fd = ::open(mFilename.string(), O_WRONLY); 166 BackupDataWriter* writer = new BackupDataWriter(fd); 167 writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 168 writer->WriteEntityData(DATA1, sizeof(DATA1)); 169 writer->WriteEntityHeader(mKey2, sizeof(DATA2)); 170 writer->WriteEntityData(DATA2, sizeof(DATA2)); 171 writer->WriteEntityHeader(mKey3, sizeof(DATA3)); 172 writer->WriteEntityData(DATA3, sizeof(DATA3)); 173 174 ::close(fd); 175 fd = ::open(mFilename.string(), O_RDONLY); 176 BackupDataReader* reader = new BackupDataReader(fd); 177 178 bool done; 179 int type; 180 String8 key; 181 size_t dataSize; 182 char* dataBytes; 183 // read first entity 184 reader->ReadNextHeader(&done, &type); 185 reader->ReadEntityHeader(&key, &dataSize); 186 dataBytes = new char[dataSize]; 187 reader->ReadEntityData(dataBytes, dataSize); 188 delete dataBytes; 189 190 // skip second entity 191 reader->ReadNextHeader(&done, &type); 192 reader->ReadEntityHeader(&key, &dataSize); 193 reader->SkipEntityData(); 194 195 // read and verify third entity 196 reader->ReadNextHeader(&done, &type); 197 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 198 << "wrong type from ReadNextHeader after skip"; 199 200 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 201 << "ReadEntityHeader returned an error on third entity"; 202 EXPECT_EQ(mKey3, key) 203 << "wrong key from ReadEntityHeader on third entity"; 204 EXPECT_EQ(sizeof(DATA3), dataSize) 205 << "wrong size from ReadEntityHeader on third entity"; 206 207 dataBytes = new char[dataSize]; 208 EXPECT_EQ((int) dataSize, reader->ReadEntityData(dataBytes, dataSize)) 209 << "ReadEntityData returned an error on third entity"; 210 for (unsigned int i = 0; i < sizeof(DATA3); i++) { 211 EXPECT_EQ(DATA3[i], dataBytes[i]) 212 << "data character " << i << " should be equal"; 213 } 214 delete dataBytes; 215 delete writer; 216 delete reader; 217 } 218 219 TEST_F(BackupDataTest, DeleteEntity) { 220 int fd = ::open(mFilename.string(), O_WRONLY); 221 BackupDataWriter* writer = new BackupDataWriter(fd); 222 writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 223 writer->WriteEntityData(DATA1, sizeof(DATA1)); 224 writer->WriteEntityHeader(mKey2, -1); 225 226 ::close(fd); 227 fd = ::open(mFilename.string(), O_RDONLY); 228 BackupDataReader* reader = new BackupDataReader(fd); 229 230 bool done; 231 int type; 232 String8 key; 233 size_t dataSize; 234 char* dataBytes; 235 // read first entity 236 reader->ReadNextHeader(&done, &type); 237 reader->ReadEntityHeader(&key, &dataSize); 238 dataBytes = new char[dataSize]; 239 reader->ReadEntityData(dataBytes, dataSize); 240 delete dataBytes; 241 242 // read and verify deletion 243 reader->ReadNextHeader(&done, &type); 244 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 245 << "wrong type from ReadNextHeader on deletion"; 246 247 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 248 << "ReadEntityHeader returned an error on second entity"; 249 EXPECT_EQ(mKey2, key) 250 << "wrong key from ReadEntityHeader on second entity"; 251 EXPECT_EQ(-1, (int) dataSize) 252 << "not recognizing deletion on second entity"; 253 254 delete writer; 255 delete reader; 256 } 257 258 TEST_F(BackupDataTest, EneityAfterDelete) { 259 int fd = ::open(mFilename.string(), O_WRONLY); 260 BackupDataWriter* writer = new BackupDataWriter(fd); 261 writer->WriteEntityHeader(mKey1, sizeof(DATA1)); 262 writer->WriteEntityData(DATA1, sizeof(DATA1)); 263 writer->WriteEntityHeader(mKey2, -1); 264 writer->WriteEntityHeader(mKey3, sizeof(DATA3)); 265 writer->WriteEntityData(DATA3, sizeof(DATA3)); 266 267 ::close(fd); 268 fd = ::open(mFilename.string(), O_RDONLY); 269 BackupDataReader* reader = new BackupDataReader(fd); 270 271 bool done; 272 int type; 273 String8 key; 274 size_t dataSize; 275 char* dataBytes; 276 // read first entity 277 reader->ReadNextHeader(&done, &type); 278 reader->ReadEntityHeader(&key, &dataSize); 279 dataBytes = new char[dataSize]; 280 reader->ReadEntityData(dataBytes, dataSize); 281 delete dataBytes; 282 283 // read and verify deletion 284 reader->ReadNextHeader(&done, &type); 285 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 286 << "wrong type from ReadNextHeader on deletion"; 287 288 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 289 << "ReadEntityHeader returned an error on second entity"; 290 EXPECT_EQ(mKey2, key) 291 << "wrong key from ReadEntityHeader on second entity"; 292 EXPECT_EQ(-1, (int)dataSize) 293 << "not recognizing deletion on second entity"; 294 295 // read and verify third entity 296 reader->ReadNextHeader(&done, &type); 297 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 298 << "wrong type from ReadNextHeader after deletion"; 299 300 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 301 << "ReadEntityHeader returned an error on third entity"; 302 EXPECT_EQ(mKey3, key) 303 << "wrong key from ReadEntityHeader on third entity"; 304 EXPECT_EQ(sizeof(DATA3), dataSize) 305 << "wrong size from ReadEntityHeader on third entity"; 306 307 dataBytes = new char[dataSize]; 308 EXPECT_EQ((int) dataSize, reader->ReadEntityData(dataBytes, dataSize)) 309 << "ReadEntityData returned an error on third entity"; 310 for (unsigned int i = 0; i < sizeof(DATA3); i++) { 311 EXPECT_EQ(DATA3[i], dataBytes[i]) 312 << "data character " << i << " should be equal"; 313 } 314 delete dataBytes; 315 delete writer; 316 delete reader; 317 } 318 319 TEST_F(BackupDataTest, OnlyDeleteEntities) { 320 int fd = ::open(mFilename.string(), O_WRONLY); 321 BackupDataWriter* writer = new BackupDataWriter(fd); 322 writer->WriteEntityHeader(mKey1, -1); 323 writer->WriteEntityHeader(mKey2, -1); 324 writer->WriteEntityHeader(mKey3, -1); 325 writer->WriteEntityHeader(mKey4, -1); 326 327 ::close(fd); 328 fd = ::open(mFilename.string(), O_RDONLY); 329 BackupDataReader* reader = new BackupDataReader(fd); 330 331 bool done; 332 int type; 333 String8 key; 334 size_t dataSize; 335 // read and verify first deletion 336 reader->ReadNextHeader(&done, &type); 337 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 338 << "wrong type from ReadNextHeader first deletion"; 339 340 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 341 << "ReadEntityHeader returned an error on first entity"; 342 EXPECT_EQ(mKey1, key) 343 << "wrong key from ReadEntityHeader on first entity"; 344 EXPECT_EQ(-1, (int) dataSize) 345 << "not recognizing deletion on first entity"; 346 347 // read and verify second deletion 348 reader->ReadNextHeader(&done, &type); 349 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 350 << "wrong type from ReadNextHeader second deletion"; 351 352 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 353 << "ReadEntityHeader returned an error on second entity"; 354 EXPECT_EQ(mKey2, key) 355 << "wrong key from ReadEntityHeader on second entity"; 356 EXPECT_EQ(-1, (int) dataSize) 357 << "not recognizing deletion on second entity"; 358 359 // read and verify third deletion 360 reader->ReadNextHeader(&done, &type); 361 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 362 << "wrong type from ReadNextHeader third deletion"; 363 364 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 365 << "ReadEntityHeader returned an error on third entity"; 366 EXPECT_EQ(mKey3, key) 367 << "wrong key from ReadEntityHeader on third entity"; 368 EXPECT_EQ(-1, (int) dataSize) 369 << "not recognizing deletion on third entity"; 370 371 // read and verify fourth deletion 372 reader->ReadNextHeader(&done, &type); 373 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 374 << "wrong type from ReadNextHeader fourth deletion"; 375 376 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 377 << "ReadEntityHeader returned an error on fourth entity"; 378 EXPECT_EQ(mKey4, key) 379 << "wrong key from ReadEntityHeader on fourth entity"; 380 EXPECT_EQ(-1, (int) dataSize) 381 << "not recognizing deletion on fourth entity"; 382 383 delete writer; 384 delete reader; 385 } 386 387 TEST_F(BackupDataTest, ReadDeletedEntityData) { 388 int fd = ::open(mFilename.string(), O_WRONLY); 389 BackupDataWriter* writer = new BackupDataWriter(fd); 390 writer->WriteEntityHeader(mKey1, -1); 391 writer->WriteEntityHeader(mKey2, -1); 392 393 ::close(fd); 394 fd = ::open(mFilename.string(), O_RDONLY); 395 BackupDataReader* reader = new BackupDataReader(fd); 396 397 bool done; 398 int type; 399 String8 key; 400 size_t dataSize; 401 // read and verify first deletion 402 reader->ReadNextHeader(&done, &type); 403 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 404 << "wrong type from ReadNextHeader first deletion"; 405 406 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 407 << "ReadEntityHeader returned an error on first entity"; 408 EXPECT_EQ(mKey1, key) 409 << "wrong key from ReadEntityHeader on first entity"; 410 EXPECT_EQ(-1, (int) dataSize) 411 << "not recognizing deletion on first entity"; 412 413 // erroneously try to read first entity data 414 char* dataBytes = new char[10]; 415 dataBytes[0] = 'A'; 416 EXPECT_EQ(NO_ERROR, reader->ReadEntityData(dataBytes, dataSize)); 417 // expect dataBytes to be unmodofied 418 EXPECT_EQ('A', dataBytes[0]); 419 420 // read and verify second deletion 421 reader->ReadNextHeader(&done, &type); 422 EXPECT_EQ(BACKUP_HEADER_ENTITY_V1, type) 423 << "wrong type from ReadNextHeader second deletion"; 424 425 EXPECT_EQ(NO_ERROR, reader->ReadEntityHeader(&key, &dataSize)) 426 << "ReadEntityHeader returned an error on second entity"; 427 EXPECT_EQ(mKey2, key) 428 << "wrong key from ReadEntityHeader on second entity"; 429 EXPECT_EQ(-1, (int) dataSize) 430 << "not recognizing deletion on second entity"; 431 432 delete[] dataBytes; 433 delete writer; 434 delete reader; 435 } 436 437 } 438