xref: /aosp_15_r20/external/sandboxed-api/contrib/c-blosc/test/test_blosc.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/c-blosc/sandboxed.h"
18*ec63e07aSXin Li #include "contrib/c-blosc/utils/utils_blosc.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 constexpr size_t kDefaultBlockSize = 19059;
28*ec63e07aSXin Li 
CompareFiles(const std::string & name1,const std::string & name2)29*ec63e07aSXin Li bool CompareFiles(const std::string& name1, const std::string& name2) {
30*ec63e07aSXin Li   std::ifstream f1(name1, std::ios::binary);
31*ec63e07aSXin Li   if (!f1.is_open()) {
32*ec63e07aSXin Li     return false;
33*ec63e07aSXin Li   }
34*ec63e07aSXin Li 
35*ec63e07aSXin Li   std::ifstream f2(name2, std::ios::binary);
36*ec63e07aSXin Li   if (!f2.is_open()) {
37*ec63e07aSXin Li     return false;
38*ec63e07aSXin Li   }
39*ec63e07aSXin Li 
40*ec63e07aSXin Li   while (!f1.eof() && !f2.eof()) {
41*ec63e07aSXin Li     char buf1[128];
42*ec63e07aSXin Li     char buf2[128];
43*ec63e07aSXin Li 
44*ec63e07aSXin Li     f1.read(buf1, sizeof(buf1));
45*ec63e07aSXin Li     f2.read(buf2, sizeof(buf2));
46*ec63e07aSXin Li 
47*ec63e07aSXin Li     if (f1.gcount() != f2.gcount()) {
48*ec63e07aSXin Li       return false;
49*ec63e07aSXin Li     }
50*ec63e07aSXin Li     if (memcmp(&buf1, &buf2, f2.gcount()) != 0) {
51*ec63e07aSXin Li       return false;
52*ec63e07aSXin Li     }
53*ec63e07aSXin Li   }
54*ec63e07aSXin Li 
55*ec63e07aSXin Li   return f1.eof() == f2.eof();
56*ec63e07aSXin Li }
57*ec63e07aSXin Li 
GetTestFilePath(const std::string & filename)58*ec63e07aSXin Li std::string GetTestFilePath(const std::string& filename) {
59*ec63e07aSXin Li   return sapi::file::JoinPath(getenv("TEST_FILES_DIR"), filename);
60*ec63e07aSXin Li }
61*ec63e07aSXin Li 
GetTemporaryFile(const std::string & filename)62*ec63e07aSXin Li std::string GetTemporaryFile(const std::string& filename) {
63*ec63e07aSXin Li   absl::StatusOr<std::string> tmp_file =
64*ec63e07aSXin Li       sapi::CreateNamedTempFileAndClose(filename);
65*ec63e07aSXin Li   if (!tmp_file.ok()) {
66*ec63e07aSXin Li     return "";
67*ec63e07aSXin Li   }
68*ec63e07aSXin Li 
69*ec63e07aSXin Li   return sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), *tmp_file);
70*ec63e07aSXin Li }
71*ec63e07aSXin Li 
GetStreamSize(std::ifstream & stream)72*ec63e07aSXin Li std::streamsize GetStreamSize(std::ifstream& stream) {
73*ec63e07aSXin Li   stream.seekg(0, std::ios_base::end);
74*ec63e07aSXin Li   std::streamsize ssize = stream.tellg();
75*ec63e07aSXin Li   stream.seekg(0, std::ios_base::beg);
76*ec63e07aSXin Li 
77*ec63e07aSXin Li   return ssize;
78*ec63e07aSXin Li }
79*ec63e07aSXin Li 
80*ec63e07aSXin Li class TestText : public testing::TestWithParam<std::string> {};
81*ec63e07aSXin Li 
TEST(SandboxTest,CheckInit)82*ec63e07aSXin Li TEST(SandboxTest, CheckInit) {
83*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
84*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
85*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
86*ec63e07aSXin Li 
87*ec63e07aSXin Li   ASSERT_THAT(api.blosc_init(), IsOk());
88*ec63e07aSXin Li }
89*ec63e07aSXin Li 
TEST(SandboxTest,CheckDestroy)90*ec63e07aSXin Li TEST(SandboxTest, CheckDestroy) {
91*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
92*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
93*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
94*ec63e07aSXin Li 
95*ec63e07aSXin Li   ASSERT_THAT(api.blosc_init(), IsOk());
96*ec63e07aSXin Li   ASSERT_THAT(api.blosc_destroy(), IsOk());
97*ec63e07aSXin Li }
98*ec63e07aSXin Li 
TEST(SandboxTest,CheckGetNThreads)99*ec63e07aSXin Li TEST(SandboxTest, CheckGetNThreads) {
100*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
101*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
102*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
103*ec63e07aSXin Li 
104*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(int nthreads, api.blosc_get_nthreads());
105*ec63e07aSXin Li 
106*ec63e07aSXin Li   ASSERT_GT(nthreads, 0);
107*ec63e07aSXin Li }
108*ec63e07aSXin Li 
TEST(SandboxTest,CheckSetNThreads)109*ec63e07aSXin Li TEST(SandboxTest, CheckSetNThreads) {
110*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
111*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
112*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
113*ec63e07aSXin Li 
114*ec63e07aSXin Li   int nthreads;
115*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(nthreads, api.blosc_get_nthreads());
116*ec63e07aSXin Li   ASSERT_NE(nthreads, 3);
117*ec63e07aSXin Li   ASSERT_THAT(api.blosc_set_nthreads(3), IsOk());
118*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(nthreads, api.blosc_get_nthreads());
119*ec63e07aSXin Li   ASSERT_EQ(nthreads, 3);
120*ec63e07aSXin Li }
121*ec63e07aSXin Li 
TEST(SandboxTest,CheckGetBlocksize)122*ec63e07aSXin Li TEST(SandboxTest, CheckGetBlocksize) {
123*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
124*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
125*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
126*ec63e07aSXin Li 
127*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(size_t blocksize, api.blosc_get_blocksize());
128*ec63e07aSXin Li   ASSERT_NE(blocksize, kDefaultBlockSize);
129*ec63e07aSXin Li }
130*ec63e07aSXin Li 
TEST(SandboxTest,CheckSetBlocksize)131*ec63e07aSXin Li TEST(SandboxTest, CheckSetBlocksize) {
132*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
133*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
134*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
135*ec63e07aSXin Li 
136*ec63e07aSXin Li   size_t blocksize;
137*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(blocksize, api.blosc_get_blocksize());
138*ec63e07aSXin Li   ASSERT_NE(blocksize, 1337);
139*ec63e07aSXin Li   ASSERT_THAT(api.blosc_set_blocksize(1337), IsOk());
140*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(blocksize, api.blosc_get_blocksize());
141*ec63e07aSXin Li   ASSERT_EQ(blocksize, 1337);
142*ec63e07aSXin Li }
143*ec63e07aSXin Li 
TEST_P(TestText,CheckSizes)144*ec63e07aSXin Li TEST_P(TestText, CheckSizes) {
145*ec63e07aSXin Li   absl::Status status;
146*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
147*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
148*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
149*ec63e07aSXin Li 
150*ec63e07aSXin Li   std::string compressor(GetParam());
151*ec63e07aSXin Li 
152*ec63e07aSXin Li   std::string origfile_s = GetTestFilePath("text");
153*ec63e07aSXin Li   std::string infile_s = GetTestFilePath(absl::StrCat("text.", compressor));
154*ec63e07aSXin Li 
155*ec63e07aSXin Li   std::ifstream origfile(origfile_s, std::ios::binary);
156*ec63e07aSXin Li   ASSERT_TRUE(origfile.is_open());
157*ec63e07aSXin Li   ssize_t origsize = GetStreamSize(origfile);
158*ec63e07aSXin Li 
159*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
160*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
161*ec63e07aSXin Li 
162*ec63e07aSXin Li   std::streamsize insize = GetStreamSize(infile);
163*ec63e07aSXin Li   sapi::v::Array<uint8_t> inbuf(insize);
164*ec63e07aSXin Li   infile.read(reinterpret_cast<char*>(inbuf.GetData()), insize);
165*ec63e07aSXin Li 
166*ec63e07aSXin Li   sapi::v::IntBase<size_t> nbytes;
167*ec63e07aSXin Li   sapi::v::IntBase<size_t> cbytes;
168*ec63e07aSXin Li   sapi::v::IntBase<size_t> blocksize;
169*ec63e07aSXin Li 
170*ec63e07aSXin Li   ASSERT_THAT(api.blosc_cbuffer_sizes(inbuf.PtrBefore(), nbytes.PtrAfter(),
171*ec63e07aSXin Li                                       cbytes.PtrAfter(), blocksize.PtrAfter()),
172*ec63e07aSXin Li               IsOk());
173*ec63e07aSXin Li 
174*ec63e07aSXin Li   ASSERT_EQ(nbytes.GetValue(), origsize);
175*ec63e07aSXin Li   ASSERT_EQ(cbytes.GetValue(), insize);
176*ec63e07aSXin Li   ASSERT_EQ(blocksize.GetValue(), kDefaultBlockSize);
177*ec63e07aSXin Li }
178*ec63e07aSXin Li 
TEST_P(TestText,CheckValidate)179*ec63e07aSXin Li TEST_P(TestText, CheckValidate) {
180*ec63e07aSXin Li   absl::Status status;
181*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
182*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
183*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
184*ec63e07aSXin Li 
185*ec63e07aSXin Li   std::string compressor(GetParam());
186*ec63e07aSXin Li 
187*ec63e07aSXin Li   std::string origfile_s = GetTestFilePath("text");
188*ec63e07aSXin Li   std::string infile_s = GetTestFilePath(absl::StrCat("text.", compressor));
189*ec63e07aSXin Li 
190*ec63e07aSXin Li   std::ifstream origfile(origfile_s, std::ios::binary);
191*ec63e07aSXin Li   ASSERT_TRUE(origfile.is_open());
192*ec63e07aSXin Li   ssize_t origsize = GetStreamSize(origfile);
193*ec63e07aSXin Li 
194*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
195*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
196*ec63e07aSXin Li 
197*ec63e07aSXin Li   std::streamsize insize = GetStreamSize(infile);
198*ec63e07aSXin Li   sapi::v::Array<uint8_t> inbuf(insize);
199*ec63e07aSXin Li   infile.read(reinterpret_cast<char*>(inbuf.GetData()), insize);
200*ec63e07aSXin Li 
201*ec63e07aSXin Li   sapi::v::IntBase<size_t> nbytes;
202*ec63e07aSXin Li 
203*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
204*ec63e07aSXin Li       int ret, api.blosc_cbuffer_validate(inbuf.PtrBefore(), inbuf.GetSize(),
205*ec63e07aSXin Li                                           nbytes.PtrAfter()));
206*ec63e07aSXin Li 
207*ec63e07aSXin Li   ASSERT_GE(ret, 0);
208*ec63e07aSXin Li   ASSERT_EQ(nbytes.GetValue(), origsize);
209*ec63e07aSXin Li }
210*ec63e07aSXin Li 
TEST_P(TestText,SetCompress)211*ec63e07aSXin Li TEST_P(TestText, SetCompress) {
212*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
213*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
214*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
215*ec63e07aSXin Li 
216*ec63e07aSXin Li   std::string compressor(GetParam());
217*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
218*ec63e07aSXin Li       int ret, api.blosc_set_compressor(
219*ec63e07aSXin Li                    sapi::v::ConstCStr(compressor.c_str()).PtrBefore()));
220*ec63e07aSXin Li   ASSERT_GE(ret, 0);
221*ec63e07aSXin Li 
222*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(char* c_compressor_ret, api.blosc_get_compressor());
223*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
224*ec63e07aSXin Li       std::string compressor_ret,
225*ec63e07aSXin Li       api.GetSandbox()->GetCString(sapi::v::RemotePtr(c_compressor_ret)));
226*ec63e07aSXin Li 
227*ec63e07aSXin Li   EXPECT_EQ(compressor_ret, compressor);
228*ec63e07aSXin Li }
229*ec63e07aSXin Li 
TEST_P(TestText,Compress)230*ec63e07aSXin Li TEST_P(TestText, Compress) {
231*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
232*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
233*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
234*ec63e07aSXin Li 
235*ec63e07aSXin Li   std::string compressor(GetParam());
236*ec63e07aSXin Li 
237*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
238*ec63e07aSXin Li   std::string outfile_s = GetTemporaryFile(absl::StrCat("out", compressor));
239*ec63e07aSXin Li   ASSERT_FALSE(outfile_s.empty());
240*ec63e07aSXin Li 
241*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
242*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
243*ec63e07aSXin Li 
244*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
245*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
246*ec63e07aSXin Li 
247*ec63e07aSXin Li   absl::Status status = Compress(api, infile, outfile, 5, compressor, 5);
248*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file";
249*ec63e07aSXin Li 
250*ec63e07aSXin Li   ASSERT_LT(outfile.tellp(), infile.tellg());
251*ec63e07aSXin Li }
252*ec63e07aSXin Li 
TEST_P(TestText,Decompress)253*ec63e07aSXin Li TEST_P(TestText, Decompress) {
254*ec63e07aSXin Li   absl::Status status;
255*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
256*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
257*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
258*ec63e07aSXin Li 
259*ec63e07aSXin Li   std::string compressor(GetParam());
260*ec63e07aSXin Li 
261*ec63e07aSXin Li   std::string origfile_s = GetTestFilePath("text");
262*ec63e07aSXin Li   std::string infile_s = GetTestFilePath(absl::StrCat("text.", compressor));
263*ec63e07aSXin Li   std::string outfile_s = GetTemporaryFile(absl::StrCat("middle", compressor));
264*ec63e07aSXin Li   ASSERT_FALSE(outfile_s.empty());
265*ec63e07aSXin Li 
266*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
267*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
268*ec63e07aSXin Li 
269*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
270*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
271*ec63e07aSXin Li 
272*ec63e07aSXin Li   status = Decompress(api, infile, outfile, 5);
273*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file";
274*ec63e07aSXin Li 
275*ec63e07aSXin Li   ASSERT_GT(outfile.tellp(), infile.tellg());
276*ec63e07aSXin Li 
277*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(origfile_s, outfile_s));
278*ec63e07aSXin Li }
279*ec63e07aSXin Li 
TEST_P(TestText,CompressDecompress)280*ec63e07aSXin Li TEST_P(TestText, CompressDecompress) {
281*ec63e07aSXin Li   absl::Status status;
282*ec63e07aSXin Li   CbloscSapiSandbox sandbox;
283*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
284*ec63e07aSXin Li   CbloscApi api = CbloscApi(&sandbox);
285*ec63e07aSXin Li 
286*ec63e07aSXin Li   std::string compressor(GetParam());
287*ec63e07aSXin Li 
288*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
289*ec63e07aSXin Li   std::string middlefile_s =
290*ec63e07aSXin Li       GetTemporaryFile(absl::StrCat("middle", compressor));
291*ec63e07aSXin Li   ASSERT_FALSE(middlefile_s.empty());
292*ec63e07aSXin Li 
293*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
294*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
295*ec63e07aSXin Li 
296*ec63e07aSXin Li   std::ofstream outmiddlefile(middlefile_s, std::ios::binary);
297*ec63e07aSXin Li   ASSERT_TRUE(outmiddlefile.is_open());
298*ec63e07aSXin Li 
299*ec63e07aSXin Li   status = Compress(api, infile, outmiddlefile, 5, compressor, 5);
300*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file";
301*ec63e07aSXin Li 
302*ec63e07aSXin Li   ASSERT_LT(outmiddlefile.tellp(), infile.tellg());
303*ec63e07aSXin Li 
304*ec63e07aSXin Li   std::string outfile_s = GetTemporaryFile(absl::StrCat("out", compressor));
305*ec63e07aSXin Li   ASSERT_FALSE(outfile_s.empty());
306*ec63e07aSXin Li 
307*ec63e07aSXin Li   std::ifstream inmiddlefile(middlefile_s, std::ios::binary);
308*ec63e07aSXin Li   ASSERT_TRUE(inmiddlefile.is_open());
309*ec63e07aSXin Li 
310*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
311*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
312*ec63e07aSXin Li 
313*ec63e07aSXin Li   status = Decompress(api, inmiddlefile, outfile, 5);
314*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file";
315*ec63e07aSXin Li 
316*ec63e07aSXin Li   ASSERT_GT(outfile.tellp(), inmiddlefile.tellg());
317*ec63e07aSXin Li 
318*ec63e07aSXin Li   ASSERT_TRUE(CompareFiles(infile_s, outfile_s));
319*ec63e07aSXin Li }
320*ec63e07aSXin Li 
321*ec63e07aSXin Li INSTANTIATE_TEST_SUITE_P(SandboxTest, TestText,
322*ec63e07aSXin Li                          testing::Values("blosclz", "lz4", "lz4hc", "zlib",
323*ec63e07aSXin Li                                          "zstd"));
324*ec63e07aSXin Li 
325*ec63e07aSXin Li }  // namespace
326