blob: e6b40024dae894cfd72761abbc55859617a478c1 [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"
Brian Carlstromb0460ea2011-07-29 10:08:05 -070011#include "gtest/gtest.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070012#include "os.h"
Brian Carlstromb0460ea2011-07-29 10:08:05 -070013
14namespace art {
15
Brian Carlstromf734cf52011-08-17 16:28:14 -070016class ZipArchiveTest : public CommonTest {};
Brian Carlstromb0460ea2011-07-29 10:08:05 -070017
Brian Carlstromb0460ea2011-07-29 10:08:05 -070018TEST_F(ZipArchiveTest, FindAndExtract) {
Elliott Hughes90a33692011-08-30 13:27:07 -070019 UniquePtr<ZipArchive> zip_archive(ZipArchive::Open(GetLibCoreDexFileName()));
20 ASSERT_TRUE(zip_archive.get() != false);
21 UniquePtr<ZipEntry> zip_entry(zip_archive->Find("classes.dex"));
22 ASSERT_TRUE(zip_entry.get() != false);
Brian Carlstromb0460ea2011-07-29 10:08:05 -070023
Brian Carlstromdb4d5402011-08-09 12:18:28 -070024 ScratchFile tmp;
Brian Carlstromb0460ea2011-07-29 10:08:05 -070025 ASSERT_NE(-1, tmp.GetFd());
Elliott Hughes90a33692011-08-30 13:27:07 -070026 UniquePtr<File> file(OS::FileFromFd(tmp.GetFilename(), tmp.GetFd()));
27 ASSERT_TRUE(file.get() != NULL);
Brian Carlstromdb4d5402011-08-09 12:18:28 -070028 bool success = zip_entry->Extract(*file);
Brian Carlstromb0460ea2011-07-29 10:08:05 -070029 ASSERT_TRUE(success);
30 close(tmp.GetFd());
31
32 uint32_t computed_crc = crc32(0L, Z_NULL, 0);
33 int fd = open(tmp.GetFilename(), O_RDONLY);
34 ASSERT_NE(-1, fd);
35 const size_t kBufSize = 32768;
36 uint8_t buf[kBufSize];
37 while (true) {
38 ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buf, kBufSize));
39 if (bytes_read == 0) {
40 break;
41 }
42 computed_crc = crc32(computed_crc, buf, bytes_read);
43 }
44 EXPECT_EQ(zip_entry->GetCrc32(), computed_crc);
45}
46
47} // namespace art