blob: 051f096d8efc9cb07a034b8138c2787928604a10 [file] [log] [blame]
Brian Carlstromb0460ea2011-07-29 10:08:05 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
Elliott Hughes90a33692011-08-30 13:27:07 -07003#include "zip_archive.h"
4
Brian Carlstromb0460ea2011-07-29 10:08:05 -07005#include <fcntl.h>
6#include <sys/stat.h>
7#include <sys/types.h>
8
Elliott Hughes90a33692011-08-30 13:27:07 -07009#include "UniquePtr.h"
Brian Carlstromb0460ea2011-07-29 10:08:05 -070010#include "common_test.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070011#include "os.h"
Brian Carlstromb0460ea2011-07-29 10:08:05 -070012
13namespace art {
14
Brian Carlstromf734cf52011-08-17 16:28:14 -070015class ZipArchiveTest : public CommonTest {};
Brian Carlstromb0460ea2011-07-29 10:08:05 -070016
Brian Carlstromb0460ea2011-07-29 10:08:05 -070017TEST_F(ZipArchiveTest, FindAndExtract) {
Elliott Hughes90a33692011-08-30 13:27:07 -070018 UniquePtr<ZipArchive> zip_archive(ZipArchive::Open(GetLibCoreDexFileName()));
19 ASSERT_TRUE(zip_archive.get() != false);
20 UniquePtr<ZipEntry> zip_entry(zip_archive->Find("classes.dex"));
21 ASSERT_TRUE(zip_entry.get() != false);
Brian Carlstromb0460ea2011-07-29 10:08:05 -070022
Brian Carlstromdb4d5402011-08-09 12:18:28 -070023 ScratchFile tmp;
Brian Carlstromb0460ea2011-07-29 10:08:05 -070024 ASSERT_NE(-1, tmp.GetFd());
Elliott Hughes90a33692011-08-30 13:27:07 -070025 UniquePtr<File> file(OS::FileFromFd(tmp.GetFilename(), tmp.GetFd()));
26 ASSERT_TRUE(file.get() != NULL);
Brian Carlstromdb4d5402011-08-09 12:18:28 -070027 bool success = zip_entry->Extract(*file);
Brian Carlstromb0460ea2011-07-29 10:08:05 -070028 ASSERT_TRUE(success);
29 close(tmp.GetFd());
30
31 uint32_t computed_crc = crc32(0L, Z_NULL, 0);
32 int fd = open(tmp.GetFilename(), O_RDONLY);
33 ASSERT_NE(-1, fd);
34 const size_t kBufSize = 32768;
35 uint8_t buf[kBufSize];
36 while (true) {
37 ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buf, kBufSize));
38 if (bytes_read == 0) {
39 break;
40 }
41 computed_crc = crc32(computed_crc, buf, bytes_read);
42 }
43 EXPECT_EQ(zip_entry->GetCrc32(), computed_crc);
44}
45
46} // namespace art