blob: 5269730d773d4fed7653057c380d61c37581db35 [file] [log] [blame]
Adam Lesinski622f3042015-10-05 18:16:18 -07001/*
2 * Copyright (C) 2015 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#include "ziparchive/zip_archive.h"
18#include "ziparchive/zip_writer.h"
19
20#include <base/test_utils.h>
21#include <gtest/gtest.h>
22#include <memory>
23
24struct zipwriter : public ::testing::Test {
25 TemporaryFile* temp_file_;
26 int fd_;
27 FILE* file_;
28
29 void SetUp() override {
30 temp_file_ = new TemporaryFile();
31 fd_ = temp_file_->fd;
32 file_ = fdopen(fd_, "w");
33 ASSERT_NE(file_, nullptr);
34 }
35
36 void TearDown() override {
37 fclose(file_);
38 delete temp_file_;
39 }
40};
41
42TEST_F(zipwriter, WriteUncompressedZipWithOneFile) {
43 ZipWriter writer(file_);
44
45 const char* expected = "hello";
46
47 ASSERT_EQ(writer.StartEntry("file.txt", 0), 0);
48 ASSERT_EQ(writer.WriteBytes("he", 2), 0);
49 ASSERT_EQ(writer.WriteBytes("llo", 3), 0);
50 ASSERT_EQ(writer.FinishEntry(), 0);
51 ASSERT_EQ(writer.Finish(), 0);
52
53 ASSERT_GE(lseek(fd_, 0, SEEK_SET), 0);
54
55 ZipArchiveHandle handle;
56 ASSERT_EQ(OpenArchiveFd(fd_, "temp", &handle, false), 0);
57
58 ZipEntry data;
59 ASSERT_EQ(FindEntry(handle, ZipString("file.txt"), &data), 0);
60 EXPECT_EQ(data.compressed_length, strlen(expected));
61 EXPECT_EQ(data.uncompressed_length, strlen(expected));
62 EXPECT_EQ(data.method, kCompressStored);
63
64 char buffer[6];
65 EXPECT_EQ(ExtractToMemory(handle, &data, reinterpret_cast<uint8_t*>(&buffer), sizeof(buffer)),
66 0);
67 buffer[5] = 0;
68
69 EXPECT_STREQ(expected, buffer);
70
71 CloseArchive(handle);
72}
73
74TEST_F(zipwriter, WriteUncompressedZipWithMultipleFiles) {
75 ZipWriter writer(file_);
76
77 ASSERT_EQ(writer.StartEntry("file.txt", 0), 0);
78 ASSERT_EQ(writer.WriteBytes("he", 2), 0);
79 ASSERT_EQ(writer.FinishEntry(), 0);
80
81 ASSERT_EQ(writer.StartEntry("file/file.txt", 0), 0);
82 ASSERT_EQ(writer.WriteBytes("llo", 3), 0);
83 ASSERT_EQ(writer.FinishEntry(), 0);
84
85 ASSERT_EQ(writer.StartEntry("file/file2.txt", 0), 0);
86 ASSERT_EQ(writer.FinishEntry(), 0);
87
88 ASSERT_EQ(writer.Finish(), 0);
89
90 ASSERT_GE(lseek(fd_, 0, SEEK_SET), 0);
91
92 ZipArchiveHandle handle;
93 ASSERT_EQ(OpenArchiveFd(fd_, "temp", &handle, false), 0);
94
95 char buffer[4];
96 ZipEntry data;
97
98 ASSERT_EQ(FindEntry(handle, ZipString("file.txt"), &data), 0);
99 EXPECT_EQ(data.method, kCompressStored);
100 EXPECT_EQ(data.compressed_length, 2u);
101 EXPECT_EQ(data.uncompressed_length, 2u);
102 ASSERT_EQ(ExtractToMemory(handle, &data, reinterpret_cast<uint8_t*>(buffer), arraysize(buffer)),
103 0);
104 buffer[2] = 0;
105 EXPECT_STREQ("he", buffer);
106
107 ASSERT_EQ(FindEntry(handle, ZipString("file/file.txt"), &data), 0);
108 EXPECT_EQ(data.method, kCompressStored);
109 EXPECT_EQ(data.compressed_length, 3u);
110 EXPECT_EQ(data.uncompressed_length, 3u);
111 ASSERT_EQ(ExtractToMemory(handle, &data, reinterpret_cast<uint8_t*>(buffer), arraysize(buffer)),
112 0);
113 buffer[3] = 0;
114 EXPECT_STREQ("llo", buffer);
115
116 ASSERT_EQ(FindEntry(handle, ZipString("file/file2.txt"), &data), 0);
117 EXPECT_EQ(data.method, kCompressStored);
118 EXPECT_EQ(data.compressed_length, 0u);
119 EXPECT_EQ(data.uncompressed_length, 0u);
120
121 CloseArchive(handle);
122}
123
124TEST_F(zipwriter, WriteUncompressedZipWithAlignedFile) {
125 ZipWriter writer(file_);
126
127 ASSERT_EQ(writer.StartEntry("align.txt", ZipWriter::kAlign32), 0);
128 ASSERT_EQ(writer.WriteBytes("he", 2), 0);
129 ASSERT_EQ(writer.FinishEntry(), 0);
130 ASSERT_EQ(writer.Finish(), 0);
131
132 ASSERT_GE(lseek(fd_, 0, SEEK_SET), 0);
133
134 ZipArchiveHandle handle;
135 ASSERT_EQ(OpenArchiveFd(fd_, "temp", &handle, false), 0);
136
137 ZipEntry data;
138 ASSERT_EQ(FindEntry(handle, ZipString("align.txt"), &data), 0);
139 EXPECT_EQ(data.offset & 0x03, 0);
140}