xref: /aosp_15_r20/external/sandboxed-api/contrib/zopfli/test/zopfli_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 
17*ec63e07aSXin Li #include <fstream>
18*ec63e07aSXin Li 
19*ec63e07aSXin Li #include "contrib/zopfli/sandboxed.h"
20*ec63e07aSXin Li #include "contrib/zopfli/utils/utils_zopfli.h"
21*ec63e07aSXin Li #include "sandboxed_api/util/path.h"
22*ec63e07aSXin Li #include "sandboxed_api/util/status_matchers.h"
23*ec63e07aSXin Li #include "sandboxed_api/util/temp_file.h"
24*ec63e07aSXin Li 
25*ec63e07aSXin Li namespace {
26*ec63e07aSXin Li 
27*ec63e07aSXin Li using ::sapi::IsOk;
28*ec63e07aSXin Li using ::testing::IsEmpty;
29*ec63e07aSXin Li using ::testing::Not;
30*ec63e07aSXin Li 
GetTestFilePath(const std::string & filename)31*ec63e07aSXin Li std::string GetTestFilePath(const std::string& filename) {
32*ec63e07aSXin Li   return sapi::file::JoinPath(getenv("TEST_FILES_DIR"), filename);
33*ec63e07aSXin Li }
34*ec63e07aSXin Li 
GetTemporaryFile(const std::string & filename)35*ec63e07aSXin Li std::string GetTemporaryFile(const std::string& filename) {
36*ec63e07aSXin Li   absl::StatusOr<std::string> tmp_file =
37*ec63e07aSXin Li       sapi::CreateNamedTempFileAndClose(filename);
38*ec63e07aSXin Li   if (!tmp_file.ok()) {
39*ec63e07aSXin Li     return "";
40*ec63e07aSXin Li   }
41*ec63e07aSXin Li 
42*ec63e07aSXin Li   return sapi::file::JoinPath(sapi::file_util::fileops::GetCWD(), *tmp_file);
43*ec63e07aSXin Li }
44*ec63e07aSXin Li 
45*ec63e07aSXin Li class TestText : public testing::TestWithParam<ZopfliFormat> {};
46*ec63e07aSXin Li class TestBinary : public testing::TestWithParam<ZopfliFormat> {};
47*ec63e07aSXin Li class TestTextFD : public testing::TestWithParam<ZopfliFormat> {};
48*ec63e07aSXin Li class TestBinaryFD : public testing::TestWithParam<ZopfliFormat> {};
49*ec63e07aSXin Li 
TEST_P(TestText,Compress)50*ec63e07aSXin Li TEST_P(TestText, Compress) {
51*ec63e07aSXin Li   ZopfliSapiSandbox sandbox;
52*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
53*ec63e07aSXin Li   ZopfliApi api(&sandbox);
54*ec63e07aSXin Li 
55*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
56*ec63e07aSXin Li   std::string outfile_s = GetTemporaryFile("text.out");
57*ec63e07aSXin Li   ASSERT_THAT(outfile_s, Not(IsEmpty()));
58*ec63e07aSXin Li 
59*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
60*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
61*ec63e07aSXin Li 
62*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
63*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
64*ec63e07aSXin Li 
65*ec63e07aSXin Li   absl::Status status = Compress(api, infile, outfile, GetParam());
66*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file";
67*ec63e07aSXin Li 
68*ec63e07aSXin Li   ASSERT_LT(outfile.tellp(), infile.tellg());
69*ec63e07aSXin Li }
70*ec63e07aSXin Li 
71*ec63e07aSXin Li INSTANTIATE_TEST_SUITE_P(SandboxTest, TestText,
72*ec63e07aSXin Li                          testing::Values(ZOPFLI_FORMAT_DEFLATE,
73*ec63e07aSXin Li                                          ZOPFLI_FORMAT_GZIP,
74*ec63e07aSXin Li                                          ZOPFLI_FORMAT_ZLIB));
75*ec63e07aSXin Li 
TEST_P(TestBinary,Compress)76*ec63e07aSXin Li TEST_P(TestBinary, Compress) {
77*ec63e07aSXin Li   ZopfliSapiSandbox sandbox;
78*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
79*ec63e07aSXin Li   ZopfliApi api(&sandbox);
80*ec63e07aSXin Li 
81*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("binary");
82*ec63e07aSXin Li   std::string outfile_s = GetTemporaryFile("binary.out");
83*ec63e07aSXin Li   ASSERT_THAT(outfile_s, Not(IsEmpty()));
84*ec63e07aSXin Li 
85*ec63e07aSXin Li   std::ifstream infile(infile_s, std::ios::binary);
86*ec63e07aSXin Li   ASSERT_TRUE(infile.is_open());
87*ec63e07aSXin Li 
88*ec63e07aSXin Li   std::ofstream outfile(outfile_s, std::ios::binary);
89*ec63e07aSXin Li   ASSERT_TRUE(outfile.is_open());
90*ec63e07aSXin Li 
91*ec63e07aSXin Li   absl::Status status = Compress(api, infile, outfile, GetParam());
92*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file";
93*ec63e07aSXin Li 
94*ec63e07aSXin Li   ASSERT_LT(outfile.tellp(), infile.tellg());
95*ec63e07aSXin Li }
96*ec63e07aSXin Li 
97*ec63e07aSXin Li INSTANTIATE_TEST_SUITE_P(SandboxTest, TestBinary,
98*ec63e07aSXin Li                          testing::Values(ZOPFLI_FORMAT_DEFLATE,
99*ec63e07aSXin Li                                          ZOPFLI_FORMAT_GZIP,
100*ec63e07aSXin Li                                          ZOPFLI_FORMAT_ZLIB));
101*ec63e07aSXin Li 
TEST_P(TestTextFD,Compress)102*ec63e07aSXin Li TEST_P(TestTextFD, Compress) {
103*ec63e07aSXin Li   ZopfliSapiSandbox sandbox;
104*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
105*ec63e07aSXin Li   ZopfliApi api = ZopfliApi(&sandbox);
106*ec63e07aSXin Li 
107*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("text");
108*ec63e07aSXin Li   std::string outfile_s = GetTemporaryFile("text.out");
109*ec63e07aSXin Li   ASSERT_THAT(outfile_s, Not(IsEmpty()));
110*ec63e07aSXin Li 
111*ec63e07aSXin Li   sapi::v::Fd infd(open(infile_s.c_str(), O_RDONLY));
112*ec63e07aSXin Li   ASSERT_GE(infd.GetValue(), 0);
113*ec63e07aSXin Li 
114*ec63e07aSXin Li   sapi::v::Fd outfd(open(outfile_s.c_str(), O_WRONLY));
115*ec63e07aSXin Li   ASSERT_GE(outfd.GetValue(), 0);
116*ec63e07aSXin Li 
117*ec63e07aSXin Li   absl::Status status = CompressFD(api, infd, outfd, GetParam());
118*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file";
119*ec63e07aSXin Li 
120*ec63e07aSXin Li   off_t inpos = lseek(infd.GetValue(), 0, SEEK_END);
121*ec63e07aSXin Li   EXPECT_GE(inpos, 0);
122*ec63e07aSXin Li 
123*ec63e07aSXin Li   off_t outpos = lseek(outfd.GetValue(), 0, SEEK_END);
124*ec63e07aSXin Li   EXPECT_GE(outpos, 0);
125*ec63e07aSXin Li 
126*ec63e07aSXin Li   EXPECT_LT(outpos, inpos);
127*ec63e07aSXin Li }
128*ec63e07aSXin Li 
129*ec63e07aSXin Li INSTANTIATE_TEST_SUITE_P(SandboxTest, TestTextFD,
130*ec63e07aSXin Li                          testing::Values(ZOPFLI_FORMAT_DEFLATE,
131*ec63e07aSXin Li                                          ZOPFLI_FORMAT_GZIP,
132*ec63e07aSXin Li                                          ZOPFLI_FORMAT_ZLIB));
133*ec63e07aSXin Li 
TEST_P(TestBinaryFD,Compress)134*ec63e07aSXin Li TEST_P(TestBinaryFD, Compress) {
135*ec63e07aSXin Li   ZopfliSapiSandbox sandbox;
136*ec63e07aSXin Li   ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API";
137*ec63e07aSXin Li   ZopfliApi api = ZopfliApi(&sandbox);
138*ec63e07aSXin Li 
139*ec63e07aSXin Li   std::string infile_s = GetTestFilePath("binary");
140*ec63e07aSXin Li   std::string outfile_s = GetTemporaryFile("binary.out");
141*ec63e07aSXin Li   ASSERT_THAT(outfile_s, Not(IsEmpty()));
142*ec63e07aSXin Li 
143*ec63e07aSXin Li   sapi::v::Fd infd(open(infile_s.c_str(), O_RDONLY));
144*ec63e07aSXin Li   ASSERT_GE(infd.GetValue(), 0);
145*ec63e07aSXin Li 
146*ec63e07aSXin Li   sapi::v::Fd outfd(open(outfile_s.c_str(), O_WRONLY));
147*ec63e07aSXin Li   ASSERT_GE(outfd.GetValue(), 0);
148*ec63e07aSXin Li 
149*ec63e07aSXin Li   absl::Status status = CompressFD(api, infd, outfd, GetParam());
150*ec63e07aSXin Li   ASSERT_THAT(status, IsOk()) << "Unable to compress file";
151*ec63e07aSXin Li 
152*ec63e07aSXin Li   off_t inpos = lseek(infd.GetValue(), 0, SEEK_END);
153*ec63e07aSXin Li   EXPECT_GE(inpos, 0);
154*ec63e07aSXin Li 
155*ec63e07aSXin Li   off_t outpos = lseek(outfd.GetValue(), 0, SEEK_END);
156*ec63e07aSXin Li   EXPECT_GE(outpos, 0);
157*ec63e07aSXin Li 
158*ec63e07aSXin Li   EXPECT_LT(outpos, inpos);
159*ec63e07aSXin Li }
160*ec63e07aSXin Li 
161*ec63e07aSXin Li INSTANTIATE_TEST_SUITE_P(SandboxTest, TestBinaryFD,
162*ec63e07aSXin Li                          testing::Values(ZOPFLI_FORMAT_DEFLATE,
163*ec63e07aSXin Li                                          ZOPFLI_FORMAT_GZIP,
164*ec63e07aSXin Li                                          ZOPFLI_FORMAT_ZLIB));
165*ec63e07aSXin Li }  // namespace
166