xref: /aosp_15_r20/external/sandboxed-api/contrib/libzip/test/test_zip.cc (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
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