12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
16b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
1790a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes#include "zip_archive.h"
1890a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes
19b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <fcntl.h>
20b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <sys/stat.h>
21b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <sys/types.h>
22b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
2390a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes#include "UniquePtr.h"
24b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include "common_test.h"
2590a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes#include "os.h"
26b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
27b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstromnamespace art {
28b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
29f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstromclass ZipArchiveTest : public CommonTest {};
30b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
31b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian CarlstromTEST_F(ZipArchiveTest, FindAndExtract) {
3290a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes  UniquePtr<ZipArchive> zip_archive(ZipArchive::Open(GetLibCoreDexFileName()));
3390a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes  ASSERT_TRUE(zip_archive.get() != false);
3490a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes  UniquePtr<ZipEntry> zip_entry(zip_archive->Find("classes.dex"));
3590a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes  ASSERT_TRUE(zip_entry.get() != false);
36b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
37db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  ScratchFile tmp;
38b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  ASSERT_NE(-1, tmp.GetFd());
39761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes  UniquePtr<File> file(new File(tmp.GetFd(), tmp.GetFilename()));
4090a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes  ASSERT_TRUE(file.get() != NULL);
4189521898b56f2ebc3fb68acfb6bc6dde9b6f5c38Brian Carlstrom  bool success = zip_entry->ExtractToFile(*file);
42b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  ASSERT_TRUE(success);
43761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes  file.reset(NULL);
44b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
45b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  uint32_t computed_crc = crc32(0L, Z_NULL, 0);
46a004aa933a58428489e42d77f707c2b063b73747Brian Carlstrom  int fd = open(tmp.GetFilename().c_str(), O_RDONLY);
47b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  ASSERT_NE(-1, fd);
48b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  const size_t kBufSize = 32768;
49b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  uint8_t buf[kBufSize];
50b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  while (true) {
51b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buf, kBufSize));
52b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    if (bytes_read == 0) {
53b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      break;
54b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    }
55b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    computed_crc = crc32(computed_crc, buf, bytes_read);
56b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  }
57b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  EXPECT_EQ(zip_entry->GetCrc32(), computed_crc);
58b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom}
59b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
60b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom}  // namespace art
61