blob: 17f91ca9e4f044dba39603a44661985aecc47cc5 [file] [log] [blame]
Adam Lesinski16c4d152014-01-24 13:27:13 -08001/*
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}