xref: /aosp_15_r20/external/sandboxed-api/oss-internship-2020/guetzli/guetzli_transaction_test.cc (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
1*ec63e07aSXin Li // Copyright 2020 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 "guetzli_transaction.h"  // NOLINT(build/include)
16*ec63e07aSXin Li 
17*ec63e07aSXin Li #include <fcntl.h>
18*ec63e07aSXin Li #include <sys/stat.h>
19*ec63e07aSXin Li #include <sys/types.h>
20*ec63e07aSXin Li #include <unistd.h>
21*ec63e07aSXin Li 
22*ec63e07aSXin Li #include <fstream>
23*ec63e07aSXin Li #include <memory>
24*ec63e07aSXin Li #include <sstream>
25*ec63e07aSXin Li 
26*ec63e07aSXin Li #include "gtest/gtest.h"
27*ec63e07aSXin Li 
28*ec63e07aSXin Li namespace guetzli::sandbox::tests {
29*ec63e07aSXin Li 
30*ec63e07aSXin Li namespace {
31*ec63e07aSXin Li 
32*ec63e07aSXin Li constexpr absl::string_view kInPngFilename = "bees.png";
33*ec63e07aSXin Li constexpr absl::string_view kInJpegFilename = "nature.jpg";
34*ec63e07aSXin Li constexpr absl::string_view kOutJpegFilename = "out_jpeg.jpg";
35*ec63e07aSXin Li constexpr absl::string_view kOutPngFilename = "out_png.png";
36*ec63e07aSXin Li constexpr absl::string_view kPngReferenceFilename = "bees_reference.jpg";
37*ec63e07aSXin Li constexpr absl::string_view kJpegReferenceFIlename = "nature_reference.jpg";
38*ec63e07aSXin Li 
39*ec63e07aSXin Li constexpr int kPngExpectedSize = 38'625;
40*ec63e07aSXin Li constexpr int kJpegExpectedSize = 10'816;
41*ec63e07aSXin Li 
42*ec63e07aSXin Li constexpr int kDefaultQualityTarget = 95;
43*ec63e07aSXin Li constexpr int kDefaultMemlimitMb = 6000;
44*ec63e07aSXin Li 
45*ec63e07aSXin Li constexpr absl::string_view kRelativePathToTestdata =
46*ec63e07aSXin Li     "/guetzli_sandboxed/testdata/";
47*ec63e07aSXin Li 
GetPathToFile(absl::string_view filename)48*ec63e07aSXin Li std::string GetPathToFile(absl::string_view filename) {
49*ec63e07aSXin Li   return absl::StrCat(getenv("TEST_SRCDIR"), kRelativePathToTestdata, filename);
50*ec63e07aSXin Li }
51*ec63e07aSXin Li 
ReadFromFile(const std::string & filename)52*ec63e07aSXin Li std::string ReadFromFile(const std::string& filename) {
53*ec63e07aSXin Li   std::ifstream stream(filename, std::ios::binary);
54*ec63e07aSXin Li 
55*ec63e07aSXin Li   if (!stream.is_open()) {
56*ec63e07aSXin Li     return "";
57*ec63e07aSXin Li   }
58*ec63e07aSXin Li 
59*ec63e07aSXin Li   std::stringstream result;
60*ec63e07aSXin Li   result << stream.rdbuf();
61*ec63e07aSXin Li   return result.str();
62*ec63e07aSXin Li }
63*ec63e07aSXin Li 
64*ec63e07aSXin Li // Helper class to delete file after opening
65*ec63e07aSXin Li class FileRemover {
66*ec63e07aSXin Li  public:
FileRemover(const char * path)67*ec63e07aSXin Li   explicit FileRemover(const char* path)
68*ec63e07aSXin Li       : path_(path), fd_(open(path, O_RDONLY)) {}
69*ec63e07aSXin Li 
~FileRemover()70*ec63e07aSXin Li   ~FileRemover() {
71*ec63e07aSXin Li     close(fd_);
72*ec63e07aSXin Li     remove(path_);
73*ec63e07aSXin Li   }
74*ec63e07aSXin Li 
get() const75*ec63e07aSXin Li   int get() const { return fd_; }
76*ec63e07aSXin Li 
77*ec63e07aSXin Li  private:
78*ec63e07aSXin Li   const char* path_;
79*ec63e07aSXin Li   int fd_;
80*ec63e07aSXin Li };
81*ec63e07aSXin Li 
82*ec63e07aSXin Li }  // namespace
83*ec63e07aSXin Li 
TEST(GuetzliTransactionTest,TestTransactionJpg)84*ec63e07aSXin Li TEST(GuetzliTransactionTest, TestTransactionJpg) {
85*ec63e07aSXin Li   std::string in_path = GetPathToFile(kInJpegFilename);
86*ec63e07aSXin Li   std::string out_path = GetPathToFile(kOutJpegFilename);
87*ec63e07aSXin Li 
88*ec63e07aSXin Li   TransactionParams params = {in_path.c_str(), out_path.c_str(), 0,
89*ec63e07aSXin Li                               kDefaultQualityTarget, kDefaultMemlimitMb};
90*ec63e07aSXin Li   {
91*ec63e07aSXin Li     GuetzliTransaction transaction(std::move(params));
92*ec63e07aSXin Li     absl::Status result = transaction.Run();
93*ec63e07aSXin Li 
94*ec63e07aSXin Li     ASSERT_TRUE(result.ok()) << result.ToString();
95*ec63e07aSXin Li   }
96*ec63e07aSXin Li   std::string reference_data =
97*ec63e07aSXin Li       ReadFromFile(GetPathToFile(kJpegReferenceFIlename));
98*ec63e07aSXin Li   FileRemover file_remover(out_path.c_str());
99*ec63e07aSXin Li   ASSERT_TRUE(file_remover.get() != -1) << "Error opening output file";
100*ec63e07aSXin Li   off_t output_size = lseek(file_remover.get(), 0, SEEK_END);
101*ec63e07aSXin Li   ASSERT_EQ(reference_data.size(), output_size)
102*ec63e07aSXin Li       << "Different sizes of reference and returned data";
103*ec63e07aSXin Li   ASSERT_EQ(lseek(file_remover.get(), 0, SEEK_SET), 0)
104*ec63e07aSXin Li       << "Error repositioning out file";
105*ec63e07aSXin Li 
106*ec63e07aSXin Li   std::string output;
107*ec63e07aSXin Li   output.resize(output_size);
108*ec63e07aSXin Li   ssize_t status = read(file_remover.get(), output.data(), output_size);
109*ec63e07aSXin Li   ASSERT_EQ(status, output_size) << "Error reading data from temp output file";
110*ec63e07aSXin Li 
111*ec63e07aSXin Li   ASSERT_EQ(output, reference_data) << "Returned data doesn't match reference";
112*ec63e07aSXin Li }
113*ec63e07aSXin Li 
TEST(GuetzliTransactionTest,TestTransactionPng)114*ec63e07aSXin Li TEST(GuetzliTransactionTest, TestTransactionPng) {
115*ec63e07aSXin Li   std::string in_path = GetPathToFile(kInPngFilename);
116*ec63e07aSXin Li   std::string out_path = GetPathToFile(kOutPngFilename);
117*ec63e07aSXin Li 
118*ec63e07aSXin Li   TransactionParams params = {in_path.c_str(), out_path.c_str(), 0,
119*ec63e07aSXin Li                               kDefaultQualityTarget, kDefaultMemlimitMb};
120*ec63e07aSXin Li   {
121*ec63e07aSXin Li     GuetzliTransaction transaction(std::move(params));
122*ec63e07aSXin Li     absl::Status result = transaction.Run();
123*ec63e07aSXin Li 
124*ec63e07aSXin Li     ASSERT_TRUE(result.ok()) << result.ToString();
125*ec63e07aSXin Li   }
126*ec63e07aSXin Li   std::string reference_data =
127*ec63e07aSXin Li       ReadFromFile(GetPathToFile(kPngReferenceFilename));
128*ec63e07aSXin Li   FileRemover file_remover(out_path.c_str());
129*ec63e07aSXin Li   ASSERT_TRUE(file_remover.get() != -1) << "Error opening output file";
130*ec63e07aSXin Li   off_t output_size = lseek(file_remover.get(), 0, SEEK_END);
131*ec63e07aSXin Li   ASSERT_EQ(reference_data.size(), output_size)
132*ec63e07aSXin Li       << "Different sizes of reference and returned data";
133*ec63e07aSXin Li   ASSERT_EQ(lseek(file_remover.get(), 0, SEEK_SET), 0)
134*ec63e07aSXin Li       << "Error repositioning out file";
135*ec63e07aSXin Li 
136*ec63e07aSXin Li   std::string output;
137*ec63e07aSXin Li   output.resize(output_size);
138*ec63e07aSXin Li   ssize_t status = read(file_remover.get(), output.data(), output_size);
139*ec63e07aSXin Li   ASSERT_EQ(status, output_size) << "Error reading data from temp output file";
140*ec63e07aSXin Li 
141*ec63e07aSXin Li   ASSERT_EQ(output, reference_data) << "Returned data doesn't match refernce";
142*ec63e07aSXin Li }
143*ec63e07aSXin Li 
144*ec63e07aSXin Li }  // namespace guetzli::sandbox::tests
145