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