1*ec63e07aSXin Li // Copyright 2022 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li // https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin Li #include <fstream>
16*ec63e07aSXin Li
17*ec63e07aSXin Li #include "contrib/libzip/sandboxed.h"
18*ec63e07aSXin Li #include "contrib/libzip/utils/utils_zip.h"
19*ec63e07aSXin Li #include "sandboxed_api/util/path.h"
20*ec63e07aSXin Li #include "sandboxed_api/util/status_matchers.h"
21*ec63e07aSXin Li #include "sandboxed_api/util/temp_file.h"
22*ec63e07aSXin Li
23*ec63e07aSXin Li namespace {
24*ec63e07aSXin Li
25*ec63e07aSXin Li using ::sapi::IsOk;
26*ec63e07aSXin Li
27*ec63e07aSXin Li class ZipBase : public testing::Test {
28*ec63e07aSXin Li protected:
29*ec63e07aSXin Li std::string GetTestFilePath(const std::string& filename);
30*ec63e07aSXin Li std::string GetTemporaryFile(const std::string& filename);
31*ec63e07aSXin Li std::streamsize GetStreamSize(std::ifstream& stream);
32*ec63e07aSXin Li
33*ec63e07aSXin Li absl::StatusOr<std::vector<uint8_t>> ReadFile(const std::string& filename);
34*ec63e07aSXin Li
35*ec63e07aSXin Li void SetUp() override;
36*ec63e07aSXin Li
37*ec63e07aSXin Li const char* test_files_dir_;
38*ec63e07aSXin Li std::string test_path_zip_;
39*ec63e07aSXin Li
40*ec63e07aSXin Li std::unique_ptr<ZipSapiSandbox> sandbox_;
41*ec63e07aSXin Li };
42*ec63e07aSXin Li
43*ec63e07aSXin Li class ZipMultiFiles
44*ec63e07aSXin Li : public ZipBase,
45*ec63e07aSXin Li public testing::WithParamInterface<std::pair<uint64_t, std::string>> {};
46*ec63e07aSXin Li
SetUp()47*ec63e07aSXin Li void ZipBase::SetUp() {
48*ec63e07aSXin Li test_files_dir_ = getenv("TEST_FILES_DIR");
49*ec63e07aSXin Li ASSERT_NE(test_files_dir_, nullptr);
50*ec63e07aSXin Li
51*ec63e07aSXin Li test_path_zip_ = GetTestFilePath("zip.zip");
52*ec63e07aSXin Li
53*ec63e07aSXin Li sandbox_ = std::make_unique<ZipSapiSandbox>();
54*ec63e07aSXin Li ASSERT_THAT(sandbox_->Init(), IsOk());
55*ec63e07aSXin Li }
56*ec63e07aSXin Li
ReadFile(const std::string & filename)57*ec63e07aSXin Li absl::StatusOr<std::vector<uint8_t>> ZipBase::ReadFile(
58*ec63e07aSXin Li const std::string& filename) {
59*ec63e07aSXin Li std::ifstream file(filename, std::ios::binary);
60*ec63e07aSXin Li if (!file.is_open()) {
61*ec63e07aSXin Li return absl::UnavailableError("Unable to open file");
62*ec63e07aSXin Li }
63*ec63e07aSXin Li
64*ec63e07aSXin Li std::streamsize size = GetStreamSize(file);
65*ec63e07aSXin Li std::vector<uint8_t> buf(size);
66*ec63e07aSXin Li
67*ec63e07aSXin Li file.read(reinterpret_cast<char*>(buf.data()), size);
68*ec63e07aSXin Li
69*ec63e07aSXin Li if (file.gcount() != size) {
70*ec63e07aSXin Li return absl::UnavailableError("Unable to read data");
71*ec63e07aSXin Li }
72*ec63e07aSXin Li
73*ec63e07aSXin Li return buf;
74*ec63e07aSXin Li }
75*ec63e07aSXin Li
GetTestFilePath(const std::string & filename)76*ec63e07aSXin Li std::string ZipBase::GetTestFilePath(const std::string& filename) {
77*ec63e07aSXin Li return sapi::file::JoinPath(test_files_dir_, filename);
78*ec63e07aSXin Li }
79*ec63e07aSXin Li
GetTemporaryFile(const std::string & filename)80*ec63e07aSXin Li std::string ZipBase::GetTemporaryFile(const std::string& filename) {
81*ec63e07aSXin Li absl::StatusOr<std::string> tmp_file =
82*ec63e07aSXin Li sapi::CreateNamedTempFileAndClose(filename);
83*ec63e07aSXin Li if (!tmp_file.ok()) {
84*ec63e07aSXin Li return "";
85*ec63e07aSXin Li }
86*ec63e07aSXin Li
87*ec63e07aSXin Li return sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), *tmp_file);
88*ec63e07aSXin Li }
89*ec63e07aSXin Li
GetStreamSize(std::ifstream & stream)90*ec63e07aSXin Li std::streamsize ZipBase::GetStreamSize(std::ifstream& stream) {
91*ec63e07aSXin Li stream.seekg(0, std::ios_base::end);
92*ec63e07aSXin Li std::streamsize ssize = stream.tellg();
93*ec63e07aSXin Li stream.seekg(0, std::ios_base::beg);
94*ec63e07aSXin Li
95*ec63e07aSXin Li return ssize;
96*ec63e07aSXin Li }
97*ec63e07aSXin Li
TEST_F(ZipBase,CheckInit)98*ec63e07aSXin Li TEST_F(ZipBase, CheckInit) {
99*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
100*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
101*ec63e07aSXin Li }
102*ec63e07aSXin Li
TEST_F(ZipBase,CheckFileCount)103*ec63e07aSXin Li TEST_F(ZipBase, CheckFileCount) {
104*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
105*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
106*ec63e07aSXin Li
107*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t count, zip.GetNumberEntries());
108*ec63e07aSXin Li ASSERT_EQ(count, 2);
109*ec63e07aSXin Li }
110*ec63e07aSXin Li
TEST_F(ZipBase,AddFileBuf)111*ec63e07aSXin Li TEST_F(ZipBase, AddFileBuf) {
112*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
113*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
114*ec63e07aSXin Li
115*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto newdata,
116*ec63e07aSXin Li ReadFile(GetTestFilePath("notinzip")));
117*ec63e07aSXin Li
118*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t index, zip.AddFile("test", newdata));
119*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t count, zip.GetNumberEntries());
120*ec63e07aSXin Li ASSERT_EQ(count, 3);
121*ec63e07aSXin Li
122*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string newname, zip.GetName(index));
123*ec63e07aSXin Li ASSERT_EQ(newname, "test");
124*ec63e07aSXin Li }
125*ec63e07aSXin Li
TEST_F(ZipBase,AddFileFd)126*ec63e07aSXin Li TEST_F(ZipBase, AddFileFd) {
127*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
128*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
129*ec63e07aSXin Li
130*ec63e07aSXin Li int fd = open(GetTestFilePath("notinzip").c_str(), O_RDONLY);
131*ec63e07aSXin Li ASSERT_GE(fd, 0);
132*ec63e07aSXin Li
133*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t index, zip.AddFile("test", fd));
134*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t count, zip.GetNumberEntries());
135*ec63e07aSXin Li ASSERT_EQ(count, 3);
136*ec63e07aSXin Li
137*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string newname, zip.GetName(index));
138*ec63e07aSXin Li ASSERT_EQ(newname, "test");
139*ec63e07aSXin Li }
140*ec63e07aSXin Li
TEST_F(ZipMultiFiles,AddFileBufInplaceStore)141*ec63e07aSXin Li TEST_F(ZipMultiFiles, AddFileBufInplaceStore) {
142*ec63e07aSXin Li std::string new_path_zip = GetTemporaryFile("newzip.zip");
143*ec63e07aSXin Li
144*ec63e07aSXin Li ASSERT_TRUE(
145*ec63e07aSXin Li sapi::file_util::fileops::CopyFile(test_path_zip_, new_path_zip, 0644));
146*ec63e07aSXin Li LibZip zip(sandbox_.get(), new_path_zip, 0);
147*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
148*ec63e07aSXin Li
149*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto newdata,
150*ec63e07aSXin Li ReadFile(GetTestFilePath("notinzip")));
151*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t index, zip.AddFile("test", newdata));
152*ec63e07aSXin Li
153*ec63e07aSXin Li ASSERT_THAT(zip.Finish(), IsOk());
154*ec63e07aSXin Li ASSERT_THAT(zip.Save(), IsOk());
155*ec63e07aSXin Li
156*ec63e07aSXin Li LibZip newzip(sandbox_.get(), new_path_zip, 0);
157*ec63e07aSXin Li ASSERT_THAT(newzip.IsOpen(), true);
158*ec63e07aSXin Li
159*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto nameddata, newzip.ReadFile("test"));
160*ec63e07aSXin Li ASSERT_EQ(newdata, newdata);
161*ec63e07aSXin Li
162*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto indexeddata, newzip.ReadFile(index));
163*ec63e07aSXin Li ASSERT_EQ(indexeddata, newdata);
164*ec63e07aSXin Li }
165*ec63e07aSXin Li
TEST_P(ZipMultiFiles,CheckFileNames)166*ec63e07aSXin Li TEST_P(ZipMultiFiles, CheckFileNames) {
167*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
168*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
169*ec63e07aSXin Li
170*ec63e07aSXin Li uint64_t index = GetParam().first;
171*ec63e07aSXin Li std::string origname = GetParam().second;
172*ec63e07aSXin Li
173*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string name, zip.GetName(index));
174*ec63e07aSXin Li ASSERT_EQ(name, origname);
175*ec63e07aSXin Li }
176*ec63e07aSXin Li
TEST_P(ZipMultiFiles,DeleteFile)177*ec63e07aSXin Li TEST_P(ZipMultiFiles, DeleteFile) {
178*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
179*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
180*ec63e07aSXin Li
181*ec63e07aSXin Li uint64_t index = GetParam().first;
182*ec63e07aSXin Li std::string origname = GetParam().second;
183*ec63e07aSXin Li
184*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t count, zip.GetNumberEntries());
185*ec63e07aSXin Li ASSERT_THAT(zip.DeleteFile(index), IsOk());
186*ec63e07aSXin Li
187*ec63e07aSXin Li for (uint64_t i = 0; i < count; i++) {
188*ec63e07aSXin Li absl::StatusOr<std::string> name = zip.GetName(i);
189*ec63e07aSXin Li if (i == index) {
190*ec63e07aSXin Li ASSERT_FALSE(name.ok());
191*ec63e07aSXin Li } else {
192*ec63e07aSXin Li ASSERT_THAT(name, IsOk());
193*ec63e07aSXin Li ASSERT_NE(*name, origname);
194*ec63e07aSXin Li }
195*ec63e07aSXin Li }
196*ec63e07aSXin Li }
197*ec63e07aSXin Li
TEST_P(ZipMultiFiles,ReadFileName)198*ec63e07aSXin Li TEST_P(ZipMultiFiles, ReadFileName) {
199*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
200*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
201*ec63e07aSXin Li
202*ec63e07aSXin Li std::string name = GetParam().second;
203*ec63e07aSXin Li
204*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto zipdata, zip.ReadFile(name));
205*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto origdata, ReadFile(GetTestFilePath(name)));
206*ec63e07aSXin Li
207*ec63e07aSXin Li ASSERT_EQ(zipdata, origdata);
208*ec63e07aSXin Li }
209*ec63e07aSXin Li
TEST_P(ZipMultiFiles,ReadFileIndex)210*ec63e07aSXin Li TEST_P(ZipMultiFiles, ReadFileIndex) {
211*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
212*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
213*ec63e07aSXin Li
214*ec63e07aSXin Li uint64_t index = GetParam().first;
215*ec63e07aSXin Li std::string name = GetParam().second;
216*ec63e07aSXin Li
217*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto zipdata, zip.ReadFile(index));
218*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto origdata, ReadFile(GetTestFilePath(name)));
219*ec63e07aSXin Li
220*ec63e07aSXin Li ASSERT_EQ(zipdata, origdata);
221*ec63e07aSXin Li }
222*ec63e07aSXin Li
TEST_P(ZipMultiFiles,AddFileBufNewStore)223*ec63e07aSXin Li TEST_P(ZipMultiFiles, AddFileBufNewStore) {
224*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
225*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
226*ec63e07aSXin Li
227*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto newdata,
228*ec63e07aSXin Li ReadFile(GetTestFilePath("notinzip")));
229*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t index, zip.AddFile("test", newdata));
230*ec63e07aSXin Li
231*ec63e07aSXin Li std::string new_zip_file_name = GetTemporaryFile("newzip.zip");
232*ec63e07aSXin Li int newfdzip = open(new_zip_file_name.c_str(), O_WRONLY);
233*ec63e07aSXin Li ASSERT_GE(newfdzip, 0);
234*ec63e07aSXin Li ASSERT_THAT(zip.Finish(), IsOk());
235*ec63e07aSXin Li ASSERT_THAT(zip.Save(newfdzip), IsOk());
236*ec63e07aSXin Li close(newfdzip);
237*ec63e07aSXin Li
238*ec63e07aSXin Li LibZip newzip(sandbox_.get(), new_zip_file_name, 0);
239*ec63e07aSXin Li ASSERT_THAT(newzip.IsOpen(), true);
240*ec63e07aSXin Li
241*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto nameddata, newzip.ReadFile("test"));
242*ec63e07aSXin Li ASSERT_EQ(newdata, newdata);
243*ec63e07aSXin Li
244*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto indexeddata, newzip.ReadFile(index));
245*ec63e07aSXin Li ASSERT_EQ(indexeddata, newdata);
246*ec63e07aSXin Li
247*ec63e07aSXin Li // We also check if non other data was corrupted
248*ec63e07aSXin Li uint64_t oldindex = GetParam().first;
249*ec63e07aSXin Li std::string name = GetParam().second;
250*ec63e07aSXin Li
251*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto zipdata, newzip.ReadFile(oldindex));
252*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto origdata, ReadFile(GetTestFilePath(name)));
253*ec63e07aSXin Li
254*ec63e07aSXin Li ASSERT_EQ(zipdata, origdata);
255*ec63e07aSXin Li }
256*ec63e07aSXin Li
TEST_P(ZipMultiFiles,AddFileFdStore)257*ec63e07aSXin Li TEST_P(ZipMultiFiles, AddFileFdStore) {
258*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
259*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
260*ec63e07aSXin Li
261*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto newdata,
262*ec63e07aSXin Li ReadFile(GetTestFilePath("notinzip")));
263*ec63e07aSXin Li int fd = open(GetTestFilePath("notinzip").c_str(), O_RDONLY);
264*ec63e07aSXin Li ASSERT_GE(fd, 0);
265*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t index, zip.AddFile("test", fd));
266*ec63e07aSXin Li
267*ec63e07aSXin Li std::string new_zip_file_name = GetTemporaryFile("newzip.zip");
268*ec63e07aSXin Li int newfdzip = open(new_zip_file_name.c_str(), O_WRONLY);
269*ec63e07aSXin Li ASSERT_GE(newfdzip, 0);
270*ec63e07aSXin Li ASSERT_THAT(zip.Finish(), IsOk());
271*ec63e07aSXin Li ASSERT_THAT(zip.Save(newfdzip), IsOk());
272*ec63e07aSXin Li close(newfdzip);
273*ec63e07aSXin Li
274*ec63e07aSXin Li LibZip newzip(sandbox_.get(), new_zip_file_name, 0);
275*ec63e07aSXin Li ASSERT_THAT(newzip.IsOpen(), true);
276*ec63e07aSXin Li
277*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto nameddata, newzip.ReadFile("test"));
278*ec63e07aSXin Li ASSERT_EQ(nameddata, newdata);
279*ec63e07aSXin Li
280*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto indexeddata, newzip.ReadFile(index));
281*ec63e07aSXin Li ASSERT_EQ(indexeddata, newdata);
282*ec63e07aSXin Li
283*ec63e07aSXin Li // We also check if non other data was corrupted
284*ec63e07aSXin Li uint64_t oldindex = GetParam().first;
285*ec63e07aSXin Li std::string name = GetParam().second;
286*ec63e07aSXin Li
287*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto zipdata, newzip.ReadFile(oldindex));
288*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto origdata, ReadFile(GetTestFilePath(name)));
289*ec63e07aSXin Li
290*ec63e07aSXin Li ASSERT_EQ(zipdata, origdata);
291*ec63e07aSXin Li }
292*ec63e07aSXin Li
TEST_P(ZipMultiFiles,ReplaceFileBufStore)293*ec63e07aSXin Li TEST_P(ZipMultiFiles, ReplaceFileBufStore) {
294*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
295*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
296*ec63e07aSXin Li
297*ec63e07aSXin Li uint64_t index = GetParam().first;
298*ec63e07aSXin Li std::string name = GetParam().second;
299*ec63e07aSXin Li
300*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto newdata,
301*ec63e07aSXin Li ReadFile(GetTestFilePath("notinzip")));
302*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto zipdata, zip.ReadFile(index));
303*ec63e07aSXin Li ASSERT_NE(zipdata, newdata);
304*ec63e07aSXin Li
305*ec63e07aSXin Li ASSERT_THAT(zip.ReplaceFile(index, newdata), IsOk());
306*ec63e07aSXin Li
307*ec63e07aSXin Li std::string new_zip_file_name = GetTemporaryFile("newzip.zip");
308*ec63e07aSXin Li int newfdzip = open(new_zip_file_name.c_str(), O_WRONLY);
309*ec63e07aSXin Li ASSERT_GE(newfdzip, 0);
310*ec63e07aSXin Li ASSERT_THAT(zip.Finish(), IsOk());
311*ec63e07aSXin Li ASSERT_THAT(zip.Save(newfdzip), IsOk());
312*ec63e07aSXin Li close(newfdzip);
313*ec63e07aSXin Li
314*ec63e07aSXin Li LibZip newzip(sandbox_.get(), new_zip_file_name, 0);
315*ec63e07aSXin Li ASSERT_THAT(newzip.IsOpen(), true);
316*ec63e07aSXin Li
317*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto nameddata, newzip.ReadFile(name));
318*ec63e07aSXin Li ASSERT_EQ(nameddata, newdata);
319*ec63e07aSXin Li
320*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto indexeddata, newzip.ReadFile(index));
321*ec63e07aSXin Li ASSERT_EQ(indexeddata, newdata);
322*ec63e07aSXin Li }
323*ec63e07aSXin Li
TEST_P(ZipMultiFiles,ReplaceFileFdStore)324*ec63e07aSXin Li TEST_P(ZipMultiFiles, ReplaceFileFdStore) {
325*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
326*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
327*ec63e07aSXin Li
328*ec63e07aSXin Li uint64_t index = GetParam().first;
329*ec63e07aSXin Li std::string name = GetParam().second;
330*ec63e07aSXin Li
331*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto newdata,
332*ec63e07aSXin Li ReadFile(GetTestFilePath("notinzip")));
333*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto zipdata, zip.ReadFile(index));
334*ec63e07aSXin Li ASSERT_NE(zipdata, newdata);
335*ec63e07aSXin Li
336*ec63e07aSXin Li int fd = open(GetTestFilePath("notinzip").c_str(), O_RDONLY);
337*ec63e07aSXin Li ASSERT_GE(fd, 0);
338*ec63e07aSXin Li
339*ec63e07aSXin Li ASSERT_THAT(zip.ReplaceFile(index, fd), IsOk());
340*ec63e07aSXin Li
341*ec63e07aSXin Li std::string new_zip_file_name = GetTemporaryFile("newzip.zip");
342*ec63e07aSXin Li int newfdzip = open(new_zip_file_name.c_str(), O_WRONLY);
343*ec63e07aSXin Li ASSERT_GE(newfdzip, 0);
344*ec63e07aSXin Li ASSERT_THAT(zip.Finish(), IsOk());
345*ec63e07aSXin Li ASSERT_THAT(zip.Save(newfdzip), IsOk());
346*ec63e07aSXin Li close(newfdzip);
347*ec63e07aSXin Li
348*ec63e07aSXin Li LibZip newzip(sandbox_.get(), new_zip_file_name, 0);
349*ec63e07aSXin Li ASSERT_THAT(newzip.IsOpen(), true);
350*ec63e07aSXin Li
351*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto nameddata, newzip.ReadFile(name));
352*ec63e07aSXin Li ASSERT_EQ(nameddata, newdata);
353*ec63e07aSXin Li
354*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto indexeddata, newzip.ReadFile(index));
355*ec63e07aSXin Li ASSERT_EQ(indexeddata, newdata);
356*ec63e07aSXin Li }
357*ec63e07aSXin Li
TEST_P(ZipMultiFiles,DeleteFileStore)358*ec63e07aSXin Li TEST_P(ZipMultiFiles, DeleteFileStore) {
359*ec63e07aSXin Li LibZip zip(sandbox_.get(), test_path_zip_, 0);
360*ec63e07aSXin Li ASSERT_THAT(zip.IsOpen(), true);
361*ec63e07aSXin Li
362*ec63e07aSXin Li uint64_t index = GetParam().first;
363*ec63e07aSXin Li std::string origname = GetParam().second;
364*ec63e07aSXin Li
365*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t oldcount, zip.GetNumberEntries());
366*ec63e07aSXin Li
367*ec63e07aSXin Li ASSERT_THAT(zip.DeleteFile(index), IsOk());
368*ec63e07aSXin Li
369*ec63e07aSXin Li std::string new_zip_file_name = GetTemporaryFile("newzip.zip");
370*ec63e07aSXin Li int newfdzip = open(new_zip_file_name.c_str(), O_WRONLY);
371*ec63e07aSXin Li ASSERT_GE(newfdzip, 0);
372*ec63e07aSXin Li ASSERT_THAT(zip.Finish(), IsOk());
373*ec63e07aSXin Li ASSERT_THAT(zip.Save(newfdzip), IsOk());
374*ec63e07aSXin Li close(newfdzip);
375*ec63e07aSXin Li
376*ec63e07aSXin Li LibZip newzip(sandbox_.get(), new_zip_file_name, 0);
377*ec63e07aSXin Li ASSERT_THAT(newzip.IsOpen(), true);
378*ec63e07aSXin Li
379*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(uint64_t newcount, newzip.GetNumberEntries());
380*ec63e07aSXin Li ASSERT_LT(newcount, oldcount);
381*ec63e07aSXin Li
382*ec63e07aSXin Li for (uint64_t i = 0; i < newcount; i++) {
383*ec63e07aSXin Li absl::StatusOr<std::string> name = newzip.GetName(i);
384*ec63e07aSXin Li ASSERT_THAT(name, IsOk());
385*ec63e07aSXin Li ASSERT_NE(*name, origname);
386*ec63e07aSXin Li }
387*ec63e07aSXin Li }
388*ec63e07aSXin Li
389*ec63e07aSXin Li INSTANTIATE_TEST_SUITE_P(ZipBase, ZipMultiFiles,
390*ec63e07aSXin Li testing::Values(std::make_pair(0, "binary"),
391*ec63e07aSXin Li std::make_pair(1, "text")));
392*ec63e07aSXin Li } // namespace
393