xref: /aosp_15_r20/external/sandboxed-api/contrib/zstd/test/zstd_test.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 <fcntl.h>
16*ec63e07aSXin Li #include <unistd.h>
17*ec63e07aSXin Li 
18*ec63e07aSXin Li #include <fstream>
19*ec63e07aSXin Li #include <string>
20*ec63e07aSXin Li 
21*ec63e07aSXin Li #include "gmock/gmock.h"
22*ec63e07aSXin Li #include "gtest/gtest.h"
23*ec63e07aSXin Li #include "contrib/zstd/sandboxed.h"
24*ec63e07aSXin Li #include "contrib/zstd/utils/utils_zstd.h"
25*ec63e07aSXin Li #include "sandboxed_api/util/path.h"
26*ec63e07aSXin Li #include "sandboxed_api/util/status_matchers.h"
27*ec63e07aSXin Li #include "sandboxed_api/util/temp_file.h"
28*ec63e07aSXin Li 
29*ec63e07aSXin Li namespace {
30*ec63e07aSXin Li 
31*ec63e07aSXin Li using ::sapi::IsOk;
32*ec63e07aSXin Li 
GetTestFilePath(const std::string & filename)33*ec63e07aSXin Li std::string GetTestFilePath(const std::string& filename) {
34*ec63e07aSXin Li   return sapi::file::JoinPath(getenv("TEST_FILES_DIR"), filename);
35*ec63e07aSXin Li }
36*ec63e07aSXin Li 
CompareFiles(const std::string & name1,const std::string & name2)37*ec63e07aSXin Li bool CompareFiles(const std::string& name1, const std::string& name2) {
38*ec63e07aSXin Li   std::ifstream f1(name1, std::ios::binary);
39*ec63e07aSXin Li   if (!f1.is_open()) {
40*ec63e07aSXin Li     return false;
41*ec63e07aSXin Li   }
42*ec63e07aSXin Li 
43*ec63e07aSXin Li   std::ifstream f2(name2, std::ios::binary);
44*ec63e07aSXin Li   if (!f2.is_open()) {
45*ec63e07aSXin Li     return false;
46*ec63e07aSXin Li   }
47*ec63e07aSXin Li 
48*ec63e07aSXin Li   while (!f1.eof() && !f2.eof()) {
49*ec63e07aSXin Li     char buf1[128];
50*ec63e07aSXin Li     char buf2[128];
51*ec63e07aSXin Li 
52*ec63e07aSXin Li     f1.read(buf1, sizeof(buf1));
53*ec63e07aSXin Li     f2.read(buf2, sizeof(buf2));
54*ec63e07aSXin Li 
55*ec63e07aSXin Li     if (f1.gcount() != f2.gcount()) {
56*ec63e07aSXin Li       return false;
57*ec63e07aSXin Li     }
58*ec63e07aSXin Li     if (memcmp(&buf1, &buf2, f2.gcount()) != 0) {
59*ec63e07aSXin Li       return false;
60*ec63e07aSXin Li     }
61*ec63e07aSXin Li   }
62*ec63e07aSXin Li 
63*ec63e07aSXin Li   return f1.eof() == f2.eof();
64*ec63e07aSXin Li }
65*ec63e07aSXin Li 
TEST(SandboxTest,CheckVersion)66*ec63e07aSXin Li TEST(SandboxTest, CheckVersion) {
67*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
68*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
69*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
70*ec63e07aSXin Li 
71*ec63e07aSXin Li   absl::StatusOr<unsigned> version = api.ZSTD_versionNumber();
72*ec63e07aSXin Li   ASSERT_THAT(version, IsOk())
73*ec63e07aSXin Li       << "fatal error when invoking ZSTD_versionNumber";
74*ec63e07aSXin Li 
75*ec63e07aSXin Li   ASSERT_GE(*version, 10000);
76*ec63e07aSXin Li }
77*ec63e07aSXin Li 
TEST(SandboxTest,CheckMinCLevel)78*ec63e07aSXin Li TEST(SandboxTest, CheckMinCLevel) {
79*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
80*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
81*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
82*ec63e07aSXin Li 
83*ec63e07aSXin Li   absl::StatusOr<int> level = api.ZSTD_minCLevel();
84*ec63e07aSXin Li   ASSERT_THAT(level, IsOk()) << "fatal error when invoking ZSTD_minCLevel";
85*ec63e07aSXin Li 
86*ec63e07aSXin Li   ASSERT_LT(*level, 0);
87*ec63e07aSXin Li }
88*ec63e07aSXin Li 
TEST(SandboxTest,CheckMaxCLevel)89*ec63e07aSXin Li TEST(SandboxTest, CheckMaxCLevel) {
90*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
91*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
92*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
93*ec63e07aSXin Li 
94*ec63e07aSXin Li   absl::StatusOr<int> level = api.ZSTD_maxCLevel();
95*ec63e07aSXin Li   ASSERT_THAT(level, IsOk()) << "fatal error when invoking ZSTD_maxCLevel";
96*ec63e07aSXin Li 
97*ec63e07aSXin Li   ASSERT_GT(*level, 0);
98*ec63e07aSXin Li }
99*ec63e07aSXin Li 
TEST(SandboxTest,CheckCompressInMemory)100*ec63e07aSXin Li TEST(SandboxTest, CheckCompressInMemory) {
101*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
102*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
103*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
104*ec63e07aSXin Li 
105*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
106*ec63e07aSXin Li 
107*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
108*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out.zstd"));
109*ec63e07aSXin Li   std::string outfile_s =
110*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
111*ec63e07aSXin Li 
112*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
113*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
114*ec63e07aSXin Li 
115*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
116*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
117*ec63e07aSXin Li 
118*ec63e07aSXin Li   absl::Status status = CompressInMemory(api, infile, outfile, 0);
119*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file in memory";
120*ec63e07aSXin Li 
121*ec63e07aSXin Li   ASSERT_LT(outfile.tellp(), infile.tellg());
122*ec63e07aSXin Li }
123*ec63e07aSXin Li 
TEST(SandboxTest,CheckDecompressInMemory)124*ec63e07aSXin Li TEST(SandboxTest, CheckDecompressInMemory) {
125*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
126*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
127*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
128*ec63e07aSXin Li 
129*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text.blob.zstd");
130*ec63e07aSXin Li 
131*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
132*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out"));
133*ec63e07aSXin Li   std::string outfile_s =
134*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
135*ec63e07aSXin Li 
136*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
137*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
138*ec63e07aSXin Li 
139*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
140*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
141*ec63e07aSXin Li 
142*ec63e07aSXin Li   absl::Status status = DecompressInMemory(api, infile, outfile);
143*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to decompress file in memory";
144*ec63e07aSXin Li 
145*ec63e07aSXin Li   ASSERT_GT(outfile.tellp(), infile.tellg());
146*ec63e07aSXin Li 
147*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(GetTestFilePath("text"), outfile_s));
148*ec63e07aSXin Li }
149*ec63e07aSXin Li 
TEST(SandboxTest,CheckCompressAndDecompressInMemory)150*ec63e07aSXin Li TEST(SandboxTest, CheckCompressAndDecompressInMemory) {
151*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
152*ec63e07aSXin Li   absl::Status status;
153*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
154*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
155*ec63e07aSXin Li 
156*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
157*ec63e07aSXin Li 
158*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path_middle,
159*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("middle.zstd"));
160*ec63e07aSXin Li   std::string middle_s =
161*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path_middle);
162*ec63e07aSXin Li 
163*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
164*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out"));
165*ec63e07aSXin Li   std::string outfile_s =
166*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
167*ec63e07aSXin Li 
168*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
169*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
170*ec63e07aSXin Li 
171*ec63e07aSXin Li   std::ofstream outmiddle(middle_s, std::ios::binary);
172*ec63e07aSXin Li   ASSERT_TRUE(outmiddle.is_open());
173*ec63e07aSXin Li 
174*ec63e07aSXin Li   status = CompressInMemory(api, infile, outmiddle, 0);
175*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file in memory";
176*ec63e07aSXin Li 
177*ec63e07aSXin Li   ASSERT_LT(outmiddle.tellp(), infile.tellg());
178*ec63e07aSXin Li 
179*ec63e07aSXin Li   std::ifstream inmiddle(middle_s, std::ios::binary);
180*ec63e07aSXin Li   ASSERT_TRUE(inmiddle.is_open());
181*ec63e07aSXin Li 
182*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
183*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
184*ec63e07aSXin Li 
185*ec63e07aSXin Li   status = DecompressInMemory(api, inmiddle, outfile);
186*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to decompress file in memory";
187*ec63e07aSXin Li 
188*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(infile_s, outfile_s));
189*ec63e07aSXin Li }
190*ec63e07aSXin Li 
TEST(SandboxTest,CheckCompressStream)191*ec63e07aSXin Li TEST(SandboxTest, CheckCompressStream) {
192*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
193*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
194*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
195*ec63e07aSXin Li 
196*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
197*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
198*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out.zstd"));
199*ec63e07aSXin Li   std::string outfile_s =
200*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
201*ec63e07aSXin Li 
202*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
203*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
204*ec63e07aSXin Li 
205*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
206*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
207*ec63e07aSXin Li 
208*ec63e07aSXin Li   absl::Status status = CompressStream(api, infile, outfile, 0);
209*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress stream";
210*ec63e07aSXin Li 
211*ec63e07aSXin Li   infile.clear();
212*ec63e07aSXin Li 
213*ec63e07aSXin Li   ASSERT_LT(outfile.tellp(), infile.tellg());
214*ec63e07aSXin Li }
215*ec63e07aSXin Li 
TEST(SandboxTest,CheckDecompressStream)216*ec63e07aSXin Li TEST(SandboxTest, CheckDecompressStream) {
217*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
218*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
219*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
220*ec63e07aSXin Li 
221*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text.stream.zstd");
222*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
223*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out"));
224*ec63e07aSXin Li   std::string outfile_s =
225*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
226*ec63e07aSXin Li 
227*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
228*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
229*ec63e07aSXin Li 
230*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
231*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
232*ec63e07aSXin Li 
233*ec63e07aSXin Li   absl::Status status = DecompressStream(api, infile, outfile);
234*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to decompress stream";
235*ec63e07aSXin Li 
236*ec63e07aSXin Li   ASSERT_GT(outfile.tellp(), infile.tellg());
237*ec63e07aSXin Li 
238*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(GetTestFilePath("text"), outfile_s));
239*ec63e07aSXin Li }
240*ec63e07aSXin Li 
TEST(SandboxTest,CheckCompressAndDecompressStream)241*ec63e07aSXin Li TEST(SandboxTest, CheckCompressAndDecompressStream) {
242*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
243*ec63e07aSXin Li   absl::Status status;
244*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
245*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
246*ec63e07aSXin Li 
247*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
248*ec63e07aSXin Li 
249*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path_middle,
250*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("middle.zstd"));
251*ec63e07aSXin Li   std::string middle_s =
252*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path_middle);
253*ec63e07aSXin Li 
254*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
255*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out"));
256*ec63e07aSXin Li   std::string outfile_s =
257*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
258*ec63e07aSXin Li 
259*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
260*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
261*ec63e07aSXin Li 
262*ec63e07aSXin Li   std::ofstream outmiddle(middle_s, std::ios::binary);
263*ec63e07aSXin Li   ASSERT_TRUE(outmiddle.is_open());
264*ec63e07aSXin Li 
265*ec63e07aSXin Li   status = CompressStream(api, infile, outmiddle, 0);
266*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress stream";
267*ec63e07aSXin Li 
268*ec63e07aSXin Li   infile.clear();
269*ec63e07aSXin Li   ASSERT_LT(outmiddle.tellp(), infile.tellg());
270*ec63e07aSXin Li 
271*ec63e07aSXin Li   std::ifstream inmiddle(middle_s, std::ios::binary);
272*ec63e07aSXin Li   ASSERT_TRUE(inmiddle.is_open());
273*ec63e07aSXin Li 
274*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
275*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
276*ec63e07aSXin Li 
277*ec63e07aSXin Li   status = DecompressStream(api, inmiddle, outfile);
278*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to decompress";
279*ec63e07aSXin Li 
280*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(infile_s, outfile_s));
281*ec63e07aSXin Li }
282*ec63e07aSXin Li 
TEST(SandboxTest,CheckCompressInMemoryFD)283*ec63e07aSXin Li TEST(SandboxTest, CheckCompressInMemoryFD) {
284*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
285*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
286*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
287*ec63e07aSXin Li 
288*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
289*ec63e07aSXin Li 
290*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
291*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out.zstd"));
292*ec63e07aSXin Li   std::string outfile_s =
293*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
294*ec63e07aSXin Li 
295*ec63e07aSXin Li   sapi::v::Fd infd(open(infile_s.c_str(), O_RDONLY));
296*ec63e07aSXin Li   ASSERT_GE(infd.GetValue(), 0);
297*ec63e07aSXin Li   sapi::v::Fd outfd(open(outfile_s.c_str(), O_WRONLY));
298*ec63e07aSXin Li   ASSERT_GE(outfd.GetValue(), 0);
299*ec63e07aSXin Li 
300*ec63e07aSXin Li   absl::Status status = CompressInMemoryFD(api, infd, outfd, 0);
301*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file in memory";
302*ec63e07aSXin Li 
303*ec63e07aSXin Li   off_t inpos = lseek(infd.GetValue(), 0, SEEK_END);
304*ec63e07aSXin Li   EXPECT_GE(inpos, 0);
305*ec63e07aSXin Li   off_t outpos = lseek(outfd.GetValue(), 0, SEEK_END);
306*ec63e07aSXin Li   EXPECT_GE(outpos, 0);
307*ec63e07aSXin Li 
308*ec63e07aSXin Li   EXPECT_LT(outpos, inpos);
309*ec63e07aSXin Li }
310*ec63e07aSXin Li 
TEST(SandboxTest,CheckDecompressInMemoryFD)311*ec63e07aSXin Li TEST(SandboxTest, CheckDecompressInMemoryFD) {
312*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
313*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
314*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
315*ec63e07aSXin Li 
316*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text.blob.zstd");
317*ec63e07aSXin Li   sapi::v::Fd infd(open(infile_s.c_str(), O_RDONLY));
318*ec63e07aSXin Li   ASSERT_GE(infd.GetValue(), 0);
319*ec63e07aSXin Li 
320*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
321*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out"));
322*ec63e07aSXin Li   std::string outfile_s =
323*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
324*ec63e07aSXin Li   sapi::v::Fd outfd(open(outfile_s.c_str(), O_WRONLY));
325*ec63e07aSXin Li   ASSERT_GE(outfd.GetValue(), 0);
326*ec63e07aSXin Li 
327*ec63e07aSXin Li   absl::Status status = DecompressInMemoryFD(api, infd, outfd);
328*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file in memory";
329*ec63e07aSXin Li 
330*ec63e07aSXin Li   off_t inpos = lseek(infd.GetValue(), 0, SEEK_END);
331*ec63e07aSXin Li   EXPECT_GE(inpos, 0);
332*ec63e07aSXin Li 
333*ec63e07aSXin Li   off_t outpos = lseek(outfd.GetValue(), 0, SEEK_END);
334*ec63e07aSXin Li   EXPECT_GE(outpos, 0);
335*ec63e07aSXin Li 
336*ec63e07aSXin Li   EXPECT_GT(outpos, inpos);
337*ec63e07aSXin Li 
338*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(GetTestFilePath("text"), outfile_s));
339*ec63e07aSXin Li }
340*ec63e07aSXin Li 
TEST(SandboxTest,CheckCompressAndDecompressInMemoryFD)341*ec63e07aSXin Li TEST(SandboxTest, CheckCompressAndDecompressInMemoryFD) {
342*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
343*ec63e07aSXin Li   absl::Status status;
344*ec63e07aSXin Li   int ret;
345*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
346*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
347*ec63e07aSXin Li 
348*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
349*ec63e07aSXin Li 
350*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path_middle,
351*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("middle.zstd"));
352*ec63e07aSXin Li   std::string middle_s =
353*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path_middle);
354*ec63e07aSXin Li 
355*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
356*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out"));
357*ec63e07aSXin Li   std::string outfile_s =
358*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
359*ec63e07aSXin Li 
360*ec63e07aSXin Li   sapi::v::Fd infd(open(infile_s.c_str(), O_RDONLY));
361*ec63e07aSXin Li   ASSERT_GE(infd.GetValue(), 0);
362*ec63e07aSXin Li 
363*ec63e07aSXin Li   sapi::v::Fd outmiddlefd(open(middle_s.c_str(), O_WRONLY));
364*ec63e07aSXin Li   ASSERT_GE(outmiddlefd.GetValue(), 0);
365*ec63e07aSXin Li 
366*ec63e07aSXin Li   status = CompressInMemoryFD(api, infd, outmiddlefd, 0);
367*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file in memory";
368*ec63e07aSXin Li 
369*ec63e07aSXin Li   off_t inpos = lseek(infd.GetValue(), 0, SEEK_END);
370*ec63e07aSXin Li   EXPECT_GE(inpos, 0);
371*ec63e07aSXin Li 
372*ec63e07aSXin Li   off_t outpos = lseek(outmiddlefd.GetValue(), 0, SEEK_END);
373*ec63e07aSXin Li   EXPECT_GE(outpos, 0);
374*ec63e07aSXin Li 
375*ec63e07aSXin Li   EXPECT_LT(outpos, inpos);
376*ec63e07aSXin Li 
377*ec63e07aSXin Li   infd.CloseLocalFd();
378*ec63e07aSXin Li   outmiddlefd.CloseLocalFd();
379*ec63e07aSXin Li 
380*ec63e07aSXin Li   sapi::v::Fd inmiddlefd(open(middle_s.c_str(), O_RDONLY));
381*ec63e07aSXin Li   ASSERT_GE(inmiddlefd.GetValue(), 0);
382*ec63e07aSXin Li 
383*ec63e07aSXin Li   sapi::v::Fd outfd(open(outfile_s.c_str(), O_WRONLY));
384*ec63e07aSXin Li   ASSERT_GE(outfd.GetValue(), 0);
385*ec63e07aSXin Li 
386*ec63e07aSXin Li   status = DecompressInMemoryFD(api, inmiddlefd, outfd);
387*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to decompress file in memory";
388*ec63e07aSXin Li 
389*ec63e07aSXin Li   outfd.CloseLocalFd();
390*ec63e07aSXin Li   inmiddlefd.CloseLocalFd();
391*ec63e07aSXin Li 
392*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(infile_s, outfile_s));
393*ec63e07aSXin Li }
394*ec63e07aSXin Li 
TEST(SandboxTest,CheckCompressStreamFD)395*ec63e07aSXin Li TEST(SandboxTest, CheckCompressStreamFD) {
396*ec63e07aSXin Li   absl::Status status;
397*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
398*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
399*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
400*ec63e07aSXin Li 
401*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
402*ec63e07aSXin Li 
403*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
404*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out.zstd"));
405*ec63e07aSXin Li   std::string outfile_s =
406*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
407*ec63e07aSXin Li 
408*ec63e07aSXin Li   sapi::v::Fd infd(open(infile_s.c_str(), O_RDONLY));
409*ec63e07aSXin Li   ASSERT_GE(infd.GetValue(), 0);
410*ec63e07aSXin Li 
411*ec63e07aSXin Li   sapi::v::Fd outfd(open(outfile_s.c_str(), O_WRONLY));
412*ec63e07aSXin Li   ASSERT_GE(outfd.GetValue(), 0);
413*ec63e07aSXin Li 
414*ec63e07aSXin Li   status = CompressStreamFD(api, infd, outfd, 0);
415*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress stream";
416*ec63e07aSXin Li 
417*ec63e07aSXin Li   off_t inpos = lseek(infd.GetValue(), 0, SEEK_END);
418*ec63e07aSXin Li   EXPECT_GE(inpos, 0);
419*ec63e07aSXin Li 
420*ec63e07aSXin Li   off_t outpos = lseek(outfd.GetValue(), 0, SEEK_END);
421*ec63e07aSXin Li   EXPECT_GE(outpos, 0);
422*ec63e07aSXin Li 
423*ec63e07aSXin Li   EXPECT_LT(outpos, inpos);
424*ec63e07aSXin Li }
425*ec63e07aSXin Li 
TEST(SandboxTest,CheckDecompressStreamFD)426*ec63e07aSXin Li TEST(SandboxTest, CheckDecompressStreamFD) {
427*ec63e07aSXin Li   absl::Status status;
428*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
429*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
430*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
431*ec63e07aSXin Li 
432*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text.stream.zstd");
433*ec63e07aSXin Li 
434*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
435*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out"));
436*ec63e07aSXin Li   std::string outfile_s =
437*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
438*ec63e07aSXin Li 
439*ec63e07aSXin Li   sapi::v::Fd infd(open(infile_s.c_str(), O_RDONLY));
440*ec63e07aSXin Li   ASSERT_GE(infd.GetValue(), 0);
441*ec63e07aSXin Li 
442*ec63e07aSXin Li   sapi::v::Fd outfd(open(outfile_s.c_str(), O_WRONLY));
443*ec63e07aSXin Li   ASSERT_GE(outfd.GetValue(), 0);
444*ec63e07aSXin Li 
445*ec63e07aSXin Li   status = DecompressStreamFD(api, infd, outfd);
446*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to decompress stream";
447*ec63e07aSXin Li 
448*ec63e07aSXin Li   off_t inpos = lseek(infd.GetValue(), 0, SEEK_END);
449*ec63e07aSXin Li   EXPECT_GE(inpos, 0);
450*ec63e07aSXin Li 
451*ec63e07aSXin Li   off_t outpos = lseek(outfd.GetValue(), 0, SEEK_END);
452*ec63e07aSXin Li   EXPECT_GE(outpos, 0);
453*ec63e07aSXin Li 
454*ec63e07aSXin Li   EXPECT_GT(outpos, inpos);
455*ec63e07aSXin Li 
456*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(GetTestFilePath("text"), outfile_s));
457*ec63e07aSXin Li }
458*ec63e07aSXin Li 
TEST(SandboxTest,CheckCompressAndDecompressStreamFD)459*ec63e07aSXin Li TEST(SandboxTest, CheckCompressAndDecompressStreamFD) {
460*ec63e07aSXin Li   ZstdSapiSandbox sandbox;
461*ec63e07aSXin Li   absl::Status status;
462*ec63e07aSXin Li   int ret;
463*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
464*ec63e07aSXin Li   ZstdApi api = ZstdApi(&sandbox);
465*ec63e07aSXin Li 
466*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
467*ec63e07aSXin Li 
468*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path_middle,
469*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("middle.zstd"));
470*ec63e07aSXin Li   std::string middle_s =
471*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path_middle);
472*ec63e07aSXin Li 
473*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(std::string path,
474*ec63e07aSXin Li                             sapi::CreateNamedTempFileAndClose("out"));
475*ec63e07aSXin Li   std::string outfile_s =
476*ec63e07aSXin Li       sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), path);
477*ec63e07aSXin Li 
478*ec63e07aSXin Li   sapi::v::Fd infd(open(infile_s.c_str(), O_RDONLY));
479*ec63e07aSXin Li   ASSERT_GE(infd.GetValue(), 0);
480*ec63e07aSXin Li 
481*ec63e07aSXin Li   sapi::v::Fd outmiddlefd(open(middle_s.c_str(), O_WRONLY));
482*ec63e07aSXin Li   ASSERT_GE(outmiddlefd.GetValue(), 0);
483*ec63e07aSXin Li 
484*ec63e07aSXin Li   status = CompressStreamFD(api, infd, outmiddlefd, 0);
485*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress stream";
486*ec63e07aSXin Li 
487*ec63e07aSXin Li   off_t inpos = lseek(infd.GetValue(), 0, SEEK_END);
488*ec63e07aSXin Li   EXPECT_GE(inpos, 0);
489*ec63e07aSXin Li 
490*ec63e07aSXin Li   off_t outmiddlepos = lseek(outmiddlefd.GetValue(), 0, SEEK_END);
491*ec63e07aSXin Li   EXPECT_GE(outmiddlepos, 0);
492*ec63e07aSXin Li 
493*ec63e07aSXin Li   EXPECT_LT(outmiddlepos, inpos);
494*ec63e07aSXin Li 
495*ec63e07aSXin Li   infd.CloseLocalFd();
496*ec63e07aSXin Li   outmiddlefd.CloseLocalFd();
497*ec63e07aSXin Li 
498*ec63e07aSXin Li   sapi::v::Fd inmiddlefd(open(middle_s.c_str(), O_RDONLY));
499*ec63e07aSXin Li   ASSERT_GE(inmiddlefd.GetValue(), 0);
500*ec63e07aSXin Li 
501*ec63e07aSXin Li   sapi::v::Fd outfd(open(outfile_s.c_str(), O_WRONLY));
502*ec63e07aSXin Li   ASSERT_GE(outfd.GetValue(), 0);
503*ec63e07aSXin Li 
504*ec63e07aSXin Li   status = DecompressStreamFD(api, inmiddlefd, outfd);
505*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to decompress stream";
506*ec63e07aSXin Li 
507*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(infile_s, outfile_s));
508*ec63e07aSXin Li }
509*ec63e07aSXin Li 
510*ec63e07aSXin Li }  // namespace
511