From 6f7110dd4fe54d68827e371ca7c72cac90265347 Mon Sep 17 00:00:00 2001 From: Bohdan Tyshchenko Date: Wed, 12 Aug 2020 03:45:08 -0700 Subject: [PATCH] Added tests for sandboxed library and transaction --- oss-internship-2020/guetzli/tests/BUILD.bazel | 43 ++--- .../guetzli/tests/guetzli_sapi_test.cc | 168 ++++++++---------- .../guetzli/tests/guetzli_transaction_test.cc | 129 ++++++++++++++ .../guetzli/tests/testdata/bees_reference.jpg | Bin 0 -> 38625 bytes .../testdata/{landscape.jpg => nature.jpg} | Bin .../tests/testdata/nature_reference.jpg | Bin 0 -> 10816 bytes 6 files changed, 223 insertions(+), 117 deletions(-) create mode 100644 oss-internship-2020/guetzli/tests/testdata/bees_reference.jpg rename oss-internship-2020/guetzli/tests/testdata/{landscape.jpg => nature.jpg} (100%) create mode 100644 oss-internship-2020/guetzli/tests/testdata/nature_reference.jpg diff --git a/oss-internship-2020/guetzli/tests/BUILD.bazel b/oss-internship-2020/guetzli/tests/BUILD.bazel index b7c7517..fa8b4ae 100644 --- a/oss-internship-2020/guetzli/tests/BUILD.bazel +++ b/oss-internship-2020/guetzli/tests/BUILD.bazel @@ -1,22 +1,23 @@ -# cc_test( -# name = "transaction_tests", -# srcs = ["guetzli_transaction_test.cc"], -# visibility=["//visibility:public"], -# includes = ["."], -# deps = [ -# "//:guetzli_sapi", -# "@googletest//:gtest_main" -# ], -# ) +cc_test( + name = "transaction_tests", + srcs = ["guetzli_transaction_test.cc"], + visibility=["//visibility:public"], + deps = [ + "//:guetzli_sapi", + "@googletest//:gtest_main" + ], + size = "large", + data = glob(["testdata/*"]) +) -# cc_test( -# name = "sapi_lib_tests", -# srcs = ["guetzli_sapi_test.cc"], -# visibility=["//visibility:public"], -# includes=[".."], -# deps = [ -# "//:guetzli_sapi", -# "@googletest//:gtest_main" -# ], -# data = glob(["testdata/*"]) -# ) \ No newline at end of file +cc_test( + name = "sapi_lib_tests", + srcs = ["guetzli_sapi_test.cc"], + visibility=["//visibility:public"], + deps = [ + "//:guetzli_sapi", + "@googletest//:gtest_main" + ], + size = "large", + data = glob(["testdata/*"]) +) \ No newline at end of file diff --git a/oss-internship-2020/guetzli/tests/guetzli_sapi_test.cc b/oss-internship-2020/guetzli/tests/guetzli_sapi_test.cc index 73e54d6..2de4cb3 100644 --- a/oss-internship-2020/guetzli/tests/guetzli_sapi_test.cc +++ b/oss-internship-2020/guetzli/tests/guetzli_sapi_test.cc @@ -10,6 +10,7 @@ #include #include #include +#include namespace guetzli { namespace sandbox { @@ -18,15 +19,18 @@ namespace tests { namespace { constexpr const char* IN_PNG_FILENAME = "bees.png"; -constexpr const char* IN_JPG_FILENAME = "landscape.jpg"; +constexpr const char* IN_JPG_FILENAME = "nature.jpg"; +constexpr const char* PNG_REFERENCE_FILENAME = "bees_reference.jpg"; +constexpr const char* JPG_REFERENCE_FILENAME = "nature_reference.jpg"; -constexpr int IN_PNG_FILE_SIZE = 177'424; -constexpr int IN_JPG_FILE_SIZE = 14'418; +constexpr int PNG_EXPECTED_SIZE = 38'625; +constexpr int JPG_EXPECTED_SIZE = 10'816; constexpr int DEFAULT_QUALITY_TARGET = 95; +constexpr int DEFAULT_MEMLIMIT_MB = 6000; constexpr const char* RELATIVE_PATH_TO_TESTDATA = - "/guetzli/guetzli-sandboxed/tests/testdata/"; + "/guetzli_sandboxed/tests/testdata/"; std::string GetPathToInputFile(const char* filename) { return std::string(getenv("TEST_SRCDIR")) @@ -46,6 +50,18 @@ std::string ReadFromFile(const std::string& filename) { return result.str(); } +template +bool CompareBytesInLenValAndContainer(const sapi::v::LenVal& lenval, + const Container& container) { + return std::equal( + lenval.GetData(), lenval.GetData() + lenval.GetDataSize(), + container.begin(), + [](const uint8_t lhs, const auto rhs) { + return lhs == static_cast(rhs); + } + ); +} + } // namespace class GuetzliSapiTest : public ::testing::Test { @@ -60,106 +76,66 @@ protected: std::unique_ptr api_; }; -TEST_F(GuetzliSapiTest, ReadDataFromFd) { - std::string input_file_path = GetPathToInputFile(IN_PNG_FILENAME); - int fd = open(input_file_path.c_str(), O_RDONLY); - ASSERT_TRUE(fd != -1) << "Error opening input file"; - sapi::v::Fd remote_fd(fd); - auto send_fd_status = sandbox_->TransferToSandboxee(&remote_fd); - ASSERT_TRUE(send_fd_status.ok()) << "Error sending fd to sandboxee"; - ASSERT_TRUE(remote_fd.GetRemoteFd() != -1) << "Error opening remote fd"; - sapi::v::LenVal data(0); - auto read_status = - api_->ReadDataFromFd(remote_fd.GetRemoteFd(), data.PtrBoth()); - ASSERT_TRUE(read_status.value_or(false)) << "Error reading data from fd"; - ASSERT_EQ(data.GetDataSize(), IN_PNG_FILE_SIZE) << "Wrong size of file"; -} - -// TEST_F(GuetzliSapiTest, WriteDataToFd) { - -// } - -TEST_F(GuetzliSapiTest, ReadPng) { - std::string data = ReadFromFile(GetPathToInputFile(IN_PNG_FILENAME)); - ASSERT_EQ(data.size(), IN_PNG_FILE_SIZE) << "Error reading input file"; - sapi::v::LenVal in_data(data.data(), data.size()); - sapi::v::Int xsize, ysize; - sapi::v::LenVal rgb_out(0); - - auto status = api_->ReadPng(in_data.PtrBefore(), xsize.PtrBoth(), - ysize.PtrBoth(), rgb_out.PtrBoth()); - ASSERT_TRUE(status.value_or(false)) << "Error processing png data"; - ASSERT_EQ(xsize.GetValue(), 444) << "Error parsing width"; - ASSERT_EQ(ysize.GetValue(), 258) << "Error parsing height"; -} - -TEST_F(GuetzliSapiTest, ReadJpeg) { - std::string data = ReadFromFile(GetPathToInputFile(IN_JPG_FILENAME)); - ASSERT_EQ(data.size(), IN_JPG_FILE_SIZE) << "Error reading input file"; - sapi::v::LenVal in_data(data.data(), data.size()); - sapi::v::Int xsize, ysize; - - auto status = api_->ReadJpegData(in_data.PtrBefore(), 0, - xsize.PtrBoth(), ysize.PtrBoth()); - ASSERT_TRUE(status.value_or(false)) << "Error processing jpeg data"; - ASSERT_EQ(xsize.GetValue(), 180) << "Error parsing width"; - ASSERT_EQ(ysize.GetValue(), 180) << "Error parsing height"; -} - // This test can take up to few minutes depending on your hardware TEST_F(GuetzliSapiTest, ProcessRGB) { - std::string data = ReadFromFile(GetPathToInputFile(IN_PNG_FILENAME)); - ASSERT_EQ(data.size(), IN_PNG_FILE_SIZE) << "Error reading input file"; - sapi::v::LenVal in_data(data.data(), data.size()); - sapi::v::Int xsize, ysize; - sapi::v::LenVal rgb_out(0); - - auto status = api_->ReadPng(in_data.PtrBefore(), xsize.PtrBoth(), - ysize.PtrBoth(), rgb_out.PtrBoth()); - ASSERT_TRUE(status.value_or(false)) << "Error processing png data"; - ASSERT_EQ(xsize.GetValue(), 444) << "Error parsing width"; - ASSERT_EQ(ysize.GetValue(), 258) << "Error parsing height"; - auto quality = - api_->ButteraugliScoreQuality(static_cast(DEFAULT_QUALITY_TARGET)); - ASSERT_TRUE(quality.ok()) << "Error calculating butteraugli quality"; - sapi::v::Struct params; - sapi::v::LenVal out_data(0); - params.mutable_data()->butteraugli_target = quality.value(); - - status = api_->ProcessRGBData(params.PtrBefore(), 0, rgb_out.PtrBefore(), - xsize.GetValue(), ysize.GetValue(), out_data.PtrBoth()); - ASSERT_TRUE(status.value_or(false)) << "Error processing png file"; - ASSERT_EQ(out_data.GetDataSize(), 38'625); - //ADD COMPARSION WITH REFERENCE OUTPUT + sapi::v::Fd in_fd(open(GetPathToInputFile(IN_PNG_FILENAME).c_str(), + O_RDONLY)); + ASSERT_TRUE(in_fd.GetValue() != -1) << "Error opening input file"; + ASSERT_EQ(api_->sandbox()->TransferToSandboxee(&in_fd), absl::OkStatus()) + << "Error transfering fd to sandbox"; + ASSERT_TRUE(in_fd.GetRemoteFd() != -1) << "Error opening remote fd"; + sapi::v::Struct processing_params; + *processing_params.mutable_data() = {in_fd.GetRemoteFd(), + 0, + DEFAULT_QUALITY_TARGET, + DEFAULT_MEMLIMIT_MB + }; + sapi::v::LenVal output(0); + auto processing_result = api_->ProcessRgb(processing_params.PtrBefore(), + output.PtrBoth()); + ASSERT_TRUE(processing_result.value_or(false)) << "Error processing rgb data"; + ASSERT_EQ(output.GetDataSize(), PNG_EXPECTED_SIZE) + << "Incorrect result data size"; + std::string reference_data = + ReadFromFile(GetPathToInputFile(PNG_REFERENCE_FILENAME)); + ASSERT_EQ(output.GetDataSize(), reference_data.size()) + << "Incorrect result data size"; + ASSERT_TRUE(CompareBytesInLenValAndContainer(output, reference_data)) + << "Processed data doesn't match reference output"; } // This test can take up to few minutes depending on your hardware TEST_F(GuetzliSapiTest, ProcessJpeg) { - std::string data = ReadFromFile(GetPathToInputFile(IN_JPG_FILENAME)); - ASSERT_EQ(data.size(), IN_JPG_FILE_SIZE) << "Error reading input file"; - sapi::v::LenVal in_data(data.data(), data.size()); - sapi::v::Int xsize, ysize; - - auto status = api_->ReadJpegData(in_data.PtrBefore(), 0, - xsize.PtrBoth(), ysize.PtrBoth()); - ASSERT_TRUE(status.value_or(false)) << "Error processing jpeg data"; - ASSERT_EQ(xsize.GetValue(), 180) << "Error parsing width"; - ASSERT_EQ(ysize.GetValue(), 180) << "Error parsing height"; - - auto quality = - api_->ButteraugliScoreQuality(static_cast(DEFAULT_QUALITY_TARGET)); - ASSERT_TRUE(quality.ok()) << "Error calculating butteraugli quality"; - sapi::v::Struct params; - params.mutable_data()->butteraugli_target = quality.value(); - sapi::v::LenVal out_data(0); - - status = api_->ProcessJPEGString(params.PtrBefore(), 0, in_data.PtrBefore(), - out_data.PtrBoth()); - ASSERT_TRUE(status.value_or(false)) << "Error processing jpeg file"; - ASSERT_EQ(out_data.GetDataSize(), 10'816); - //ADD COMPARSION WITH REFERENCE OUTPUT + sapi::v::Fd in_fd(open(GetPathToInputFile(IN_JPG_FILENAME).c_str(), + O_RDONLY)); + ASSERT_TRUE(in_fd.GetValue() != -1) << "Error opening input file"; + ASSERT_EQ(api_->sandbox()->TransferToSandboxee(&in_fd), absl::OkStatus()) + << "Error transfering fd to sandbox"; + ASSERT_TRUE(in_fd.GetRemoteFd() != -1) << "Error opening remote fd"; + sapi::v::Struct processing_params; + *processing_params.mutable_data() = {in_fd.GetRemoteFd(), + 0, + DEFAULT_QUALITY_TARGET, + DEFAULT_MEMLIMIT_MB + }; + sapi::v::LenVal output(0); + auto processing_result = api_->ProcessJpeg(processing_params.PtrBefore(), + output.PtrBoth()); + ASSERT_TRUE(processing_result.value_or(false)) << "Error processing jpg data"; + ASSERT_EQ(output.GetDataSize(), JPG_EXPECTED_SIZE) + << "Incorrect result data size"; + std::string reference_data = + ReadFromFile(GetPathToInputFile(JPG_REFERENCE_FILENAME)); + ASSERT_EQ(output.GetDataSize(), reference_data.size()) + << "Incorrect result data size"; + ASSERT_TRUE(CompareBytesInLenValAndContainer(output, reference_data)) + << "Processed data doesn't match reference output"; } +// TEST_F(GuetzliSapiTest, WriteDataToFd) { +// sapi::v::Fd fd(open(".", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR)); +// } + } // namespace tests } // namespace sandbox } // namespace guetzli \ No newline at end of file diff --git a/oss-internship-2020/guetzli/tests/guetzli_transaction_test.cc b/oss-internship-2020/guetzli/tests/guetzli_transaction_test.cc index 8471d1e..b9e3a22 100644 --- a/oss-internship-2020/guetzli/tests/guetzli_transaction_test.cc +++ b/oss-internship-2020/guetzli/tests/guetzli_transaction_test.cc @@ -1,2 +1,131 @@ #include "gtest/gtest.h" #include "guetzli_transaction.h" +#include "sandboxed_api/sandbox2/util/fileops.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace guetzli { +namespace sandbox { +namespace tests { + +namespace { + +constexpr const char* IN_PNG_FILENAME = "bees.png"; +constexpr const char* IN_JPG_FILENAME = "nature.jpg"; +constexpr const char* PNG_REFERENCE_FILENAME = "bees_reference.jpg"; +constexpr const char* JPG_REFERENCE_FILENAME = "nature_reference.jpg"; + +constexpr int PNG_EXPECTED_SIZE = 38'625; +constexpr int JPG_EXPECTED_SIZE = 10'816; + +constexpr int DEFAULT_QUALITY_TARGET = 95; +constexpr int DEFAULT_MEMLIMIT_MB = 6000; + +constexpr const char* RELATIVE_PATH_TO_TESTDATA = + "/guetzli_sandboxed/tests/testdata/"; + +std::string GetPathToInputFile(const char* filename) { + return std::string(getenv("TEST_SRCDIR")) + + std::string(RELATIVE_PATH_TO_TESTDATA) + + std::string(filename); +} + +std::string ReadFromFile(const std::string& filename) { + std::ifstream stream(filename, std::ios::binary); + + if (!stream.is_open()) { + return ""; + } + + std::stringstream result; + result << stream.rdbuf(); + return result.str(); +} + +} // namespace + +TEST(GuetzliTransactionTest, TestTransactionJpg) { + sandbox2::file_util::fileops::FDCloser in_fd_closer( + open(GetPathToInputFile(IN_JPG_FILENAME).c_str(), O_RDONLY)); + ASSERT_TRUE(in_fd_closer.get() != -1) << "Error opening input jpg file"; + sandbox2::file_util::fileops::FDCloser out_fd_closer( + open(".", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR)); + ASSERT_TRUE(out_fd_closer.get() != -1) << "Error creating temp output file"; + TransactionParams params = { + in_fd_closer.get(), + out_fd_closer.get(), + 0, + DEFAULT_QUALITY_TARGET, + DEFAULT_MEMLIMIT_MB + }; + { + GuetzliTransaction transaction(std::move(params)); + auto result = transaction.Run(); + + ASSERT_TRUE(result.ok()) << result.ToString(); + } + ASSERT_TRUE(fcntl(out_fd_closer.get(), F_GETFD) != -1 || errno != EBADF) + << "Local output fd closed"; + auto reference_data = ReadFromFile(GetPathToInputFile(JPG_REFERENCE_FILENAME)); + auto output_size = lseek(out_fd_closer.get(), 0, SEEK_END); + ASSERT_EQ(reference_data.size(), output_size) + << "Different sizes of reference and returned data"; + ASSERT_EQ(lseek(out_fd_closer.get(), 0, SEEK_SET), 0) + << "Error repositioning out file"; + + std::unique_ptr buf(new char[output_size]); + auto status = read(out_fd_closer.get(), buf.get(), output_size); + ASSERT_EQ(status, output_size) << "Error reading data from temp output file"; + + ASSERT_TRUE( + std::equal(buf.get(), buf.get() + output_size, reference_data.begin())) + << "Returned data doesn't match reference"; +} + +TEST(GuetzliTransactionTest, TestTransactionPng) { + sandbox2::file_util::fileops::FDCloser in_fd_closer( + open(GetPathToInputFile(IN_PNG_FILENAME).c_str(), O_RDONLY)); + ASSERT_TRUE(in_fd_closer.get() != -1) << "Error opening input png file"; + sandbox2::file_util::fileops::FDCloser out_fd_closer( + open(".", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR)); + ASSERT_TRUE(out_fd_closer.get() != -1) << "Error creating temp output file"; + TransactionParams params = { + in_fd_closer.get(), + out_fd_closer.get(), + 0, + DEFAULT_QUALITY_TARGET, + DEFAULT_MEMLIMIT_MB + }; + { + GuetzliTransaction transaction(std::move(params)); + auto result = transaction.Run(); + + ASSERT_TRUE(result.ok()) << result.ToString(); + } + ASSERT_TRUE(fcntl(out_fd_closer.get(), F_GETFD) != -1 || errno != EBADF) + << "Local output fd closed"; + auto reference_data = ReadFromFile(GetPathToInputFile(PNG_REFERENCE_FILENAME)); + auto output_size = lseek(out_fd_closer.get(), 0, SEEK_END); + ASSERT_EQ(reference_data.size(), output_size) + << "Different sizes of reference and returned data"; + ASSERT_EQ(lseek(out_fd_closer.get(), 0, SEEK_SET), 0) + << "Error repositioning out file"; + + std::unique_ptr buf(new char[output_size]); + auto status = read(out_fd_closer.get(), buf.get(), output_size); + ASSERT_EQ(status, output_size) << "Error reading data from temp output file"; + + ASSERT_TRUE( + std::equal(buf.get(), buf.get() + output_size, reference_data.begin())) + << "Returned data doesn't match refernce"; +} + +} // namespace tests +} // namespace sandbox +} // namespace guetzli \ No newline at end of file diff --git a/oss-internship-2020/guetzli/tests/testdata/bees_reference.jpg b/oss-internship-2020/guetzli/tests/testdata/bees_reference.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24700673fecdef2b805ee1a2529631fd923b5621 GIT binary patch literal 38625 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 XWVO%er7V6NB4LbF?W=O^%+LSXDy^Ji literal 0 HcmV?d00001 diff --git a/oss-internship-2020/guetzli/tests/testdata/landscape.jpg b/oss-internship-2020/guetzli/tests/testdata/nature.jpg similarity index 100% rename from oss-internship-2020/guetzli/tests/testdata/landscape.jpg rename to oss-internship-2020/guetzli/tests/testdata/nature.jpg diff --git a/oss-internship-2020/guetzli/tests/testdata/nature_reference.jpg b/oss-internship-2020/guetzli/tests/testdata/nature_reference.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4f1c42fa4459d2bee59df5f6ccc50019062781c GIT binary patch literal 10816 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 jl;qmYi+>0s