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