From 418bc3f356c3f746b1d860d7dd6bf0a0d002ebf7 Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Thu, 22 Oct 2020 16:19:27 +0000 Subject: [PATCH 1/3] using absl --- .../libtiff/example/main_sandboxed.cc | 93 ++++++----- oss-internship-2020/libtiff/sandboxed.h | 8 +- .../libtiff/test/defer_strile_writing.cc | 21 ++- oss-internship-2020/libtiff/test/long_tag.cc | 17 +- .../libtiff/test/raw_decode.cc | 147 +++++++----------- oss-internship-2020/libtiff/test/short_tag.cc | 17 +- 6 files changed, 130 insertions(+), 173 deletions(-) diff --git a/oss-internship-2020/libtiff/example/main_sandboxed.cc b/oss-internship-2020/libtiff/example/main_sandboxed.cc index 5ab32cc..5529f63 100644 --- a/oss-internship-2020/libtiff/example/main_sandboxed.cc +++ b/oss-internship-2020/libtiff/example/main_sandboxed.cc @@ -18,6 +18,8 @@ #include #include "../sandboxed.h" // NOLINT(build/include) +#include "absl/algorithm/container.h" +#include "absl/strings/str_join.h" #include "sandboxed_api/sandbox2/util/fileops.h" #include "sandboxed_api/sandbox2/util/path.h" #include "sandboxed_api/vars.h" @@ -56,45 +58,46 @@ constexpr std::array, kTestCount> kLimits = { constexpr absl::string_view kClusterErrorFormatStr = "Cluster %d did not match expected results.\n" - "Expect:\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\n" - "Got:\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\n"; + "Expect:\t%s\n" + "Got:\t%s"; constexpr absl::string_view kRgbPixelErrorFormatStr = "Pixel %d did not match expected results.\n" "Got R=%d (expected %d..%d), G=%d (expected %d..%d), " - "B=%d (expected %d..%d)\n"; + "B=%d (expected %d..%d)"; constexpr absl::string_view kRgbaPixelErrorFormatStr = "Pixel %d did not match expected results.\n" "Got R=%d (expected %d..%d), G=%d (expected %d..%d), " - "B=%d (expected %d..%d), A=%d (expected %d..%d)\n"; + "B=%d (expected %d..%d), A=%d (expected %d..%d)"; absl::Status CheckCluster(uint32_t cluster, const sapi::v::Array& buffer, const ClusterData& expected_cluster) { - if (buffer.GetSize() <= cluster * kClusterSize) { - return absl::InternalError("Buffer overrun\n"); + if (buffer.GetSize() < (cluster + 1) * kClusterSize) { + return absl::InternalError("Buffer overrun"); } - auto* target = buffer.GetData() + cluster * kClusterSize; - if (!std::memcmp(target, expected_cluster.data(), kClusterSize)) { + std::vector target(buffer.GetData() + cluster * kClusterSize, + buffer.GetData() + (cluster + 1) * kClusterSize); + + if (absl::c_equal(absl::MakeSpan(target), expected_cluster)) { return absl::OkStatus(); } // the image is split on 6-bit clusters because it has YCbCr color format return absl::InternalError(absl::StrFormat( - kClusterErrorFormatStr, cluster, expected_cluster[0], expected_cluster[1], - expected_cluster[2], expected_cluster[3], expected_cluster[4], - expected_cluster[5], target[0], target[1], target[2], target[3], - target[4], target[5])); + kClusterErrorFormatStr, cluster, absl::StrJoin(expected_cluster, "\t"), + absl::StrJoin(target, "\t"))); } absl::Status CheckRgbPixel(uint32_t pixel, const ChannelLimits& limits, const sapi::v::Array& buffer) { - if (buffer.GetSize() <= pixel * kChannelsInPixel) { - return absl::InternalError("Buffer overrun\n"); + if (buffer.GetSize() < (pixel + 1) * kChannelsInPixel) { + return absl::InternalError("Buffer overrun"); } - auto* rgb = buffer.GetData() + kChannelsInPixel * pixel; + + uint8_t* rgb = buffer.GetData() + pixel * kChannelsInPixel; if (rgb[0] >= limits.min_red && rgb[0] <= limits.max_red && rgb[1] >= limits.min_green && rgb[1] <= limits.max_green && @@ -114,10 +117,10 @@ absl::Status CheckRgbaPixel(uint32_t pixel, const ChannelLimits& limits, uint32_t adjusted_pixel = pixel % 128 + (127 - (pixel / 128)) * 128; if (buffer.GetSize() <= adjusted_pixel) { - return absl::InternalError("Buffer overrun\n"); + return absl::InternalError("Buffer overrun"); } - auto rgba = buffer[adjusted_pixel]; + uint32_t rgba = buffer[adjusted_pixel]; if (TIFFGetR(rgba) >= static_cast(limits.min_red) && TIFFGetR(rgba) <= static_cast(limits.max_red) && TIFFGetG(rgba) >= static_cast(limits.min_green) && @@ -138,11 +141,12 @@ absl::Status CheckRgbaPixel(uint32_t pixel, const ChannelLimits& limits, } // namespace -std::string GetFilePath(const std::string& dir, const std::string& filename) { +std::string GetFilePath(const absl::string_view dir, + const absl::string_view filename) { return sandbox2::file::JoinPath(dir, "test", "images", filename); } -std::string GetFilePath(const std::string filename) { +std::string GetFilePath(const absl::string_view filename) { std::string cwd = sandbox2::file_util::fileops::GetCWD(); auto find = cwd.rfind("build"); @@ -161,7 +165,7 @@ std::string GetFilePath(const std::string filename) { return sandbox2::file::JoinPath(project_path, "test", "images", filename); } -absl::Status LibTIFFMain(const std::string& srcfile) { +absl::Status LibTIFFMain(const absl::string_view srcfile) { // to use dir and file inside sapi-libtiff, use // sandbox(file) – file only -- or // sandbox(file, dir) -- file and dir -- or @@ -171,24 +175,15 @@ absl::Status LibTIFFMain(const std::string& srcfile) { TiffSapiSandbox sandbox(srcfile); - bool pixel_status_ok = true; - bool cluster_status_ok = true; // initialize sapi vars after constructing TiffSapiSandbox - sapi::v::UShort h; - sapi::v::UShort v; - absl::StatusOr status_or_tif; - absl::StatusOr status_or_int; - absl::StatusOr status_or_long; - absl::Status status; - - status = sandbox.Init(); SAPI_RETURN_IF_ERROR(sandbox.Init()); TiffApi api(&sandbox); - sapi::v::ConstCStr srcfile_var(srcfile.c_str()); + sapi::v::ConstCStr srcfile_var(srcfile.data()); sapi::v::ConstCStr r_var("r"); + absl::StatusOr status_or_tif; SAPI_ASSIGN_OR_RETURN( status_or_tif, api.TIFFOpen(srcfile_var.PtrBefore(), r_var.PtrBefore())); @@ -197,7 +192,9 @@ absl::Status LibTIFFMain(const std::string& srcfile) { return absl::InternalError(absl::StrCat("Could not open ", srcfile)); } - SAPI_ASSIGN_OR_RETURN(auto return_value, + sapi::v::UShort h; + sapi::v::UShort v; + SAPI_ASSIGN_OR_RETURN(int return_value, api.TIFFGetField2(&tif, TIFFTAG_YCBCRSUBSAMPLING, h.PtrBoth(), v.PtrBoth())); if (return_value == 0 || h.GetValue() != 2 || v.GetValue() != 2) { @@ -208,23 +205,25 @@ absl::Status LibTIFFMain(const std::string& srcfile) { if (sz != kClusterSize * kClusterImageSize) { return absl::InternalError( absl::StrCat("Unexpected TileSize ", sz, ". Expected ", - kClusterSize * kClusterImageSize, " bytes\n")); + kClusterSize * kClusterImageSize, " bytes")); } - sapi::v::Array buffer_(sz); + sapi::v::Array buffer(sz); // Read a tile in decompressed form, but still YCbCr subsampled SAPI_ASSIGN_OR_RETURN( tsize_t new_sz, - api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer_.PtrBoth(), sz)); + api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer.PtrBoth(), sz)); if (new_sz != sz) { return absl::InternalError(absl::StrCat( - "Did not get expected result code from TIFFReadEncodedTile(): ", - status_or_long.value(), " instead of ", sz)); + "Did not get expected result code from TIFFReadEncodedTile(): ", new_sz, + " instead of ", sz)); } + absl::Status status; + bool cluster_status_ok = true; for (const auto& [id, data] : kClusters) { - if (status = CheckCluster(id, buffer_, data); !status.ok()) { - LOG(ERROR) << "CheckCluster failed:\n" << status.ToString(); + if (status = CheckCluster(id, buffer, data); !status.ok()) { + LOG(ERROR) << "CheckCluster failed:\n" << status.ToString() << '\n'; } cluster_status_ok &= status.ok(); } @@ -244,11 +243,10 @@ absl::Status LibTIFFMain(const std::string& srcfile) { if (sz != kChannelsInPixel * kImageSize) { return absl::InternalError( absl::StrCat("Unexpected TileSize ", sz, ". Expected ", - kChannelsInPixel * kImageSize, " bytes\n")); + kChannelsInPixel * kImageSize, " bytes")); } sapi::v::Array buffer2_(sz); - SAPI_ASSIGN_OR_RETURN( new_sz, api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer2_.PtrBoth(), sz)); @@ -258,9 +256,10 @@ absl::Status LibTIFFMain(const std::string& srcfile) { " instead of ", sz)); } + bool pixel_status_ok = true; for (const auto& [id, data] : kLimits) { if (status = CheckRgbPixel(id, data, buffer2_); !status.ok()) { - LOG(ERROR) << "CheckRgbPixel failed:\n" << status.ToString(); + LOG(ERROR) << "CheckRgbPixel failed:\n" << status.ToString() << '\n'; } pixel_status_ok &= status.ok(); } @@ -275,20 +274,20 @@ absl::Status LibTIFFMain(const std::string& srcfile) { return absl::InternalError(absl::StrCat("Could not reopen ", srcfile)); } - sapi::v::Array rgba_buffer_(kImageSize); + sapi::v::Array rgba_buffer(kImageSize); // read as rgba SAPI_ASSIGN_OR_RETURN( return_value, - api.TIFFReadRGBATile(&tif2, 1 * 128, 2 * 128, rgba_buffer_.PtrBoth())); + api.TIFFReadRGBATile(&tif2, 1 * 128, 2 * 128, rgba_buffer.PtrBoth())); if (return_value == 0) { return absl::InternalError("TIFFReadRGBATile() returned failure code"); } // Checking specific pixels from the test data, 0th, 64th and 512th for (const auto& [id, data] : kLimits) { - if (status = CheckRgbaPixel(id, data, rgba_buffer_); !status.ok()) { - LOG(ERROR) << "CheckRgbaPixel failed:\n" << status.ToString(); + if (status = CheckRgbaPixel(id, data, rgba_buffer); !status.ok()) { + LOG(ERROR) << "CheckRgbaPixel failed:\n" << status.ToString() << '\n'; } pixel_status_ok &= status.ok(); } @@ -314,7 +313,7 @@ int main(int argc, char** argv) { srcfile = GetFilePath(argv[1], srcfilerel); } - auto status = LibTIFFMain(srcfile); + absl::Status status = LibTIFFMain(srcfile); if (!status.ok()) { LOG(ERROR) << "LibTIFFMain failed with error:\n" << status.ToString() << '\n'; diff --git a/oss-internship-2020/libtiff/sandboxed.h b/oss-internship-2020/libtiff/sandboxed.h index 031c633..9015522 100644 --- a/oss-internship-2020/libtiff/sandboxed.h +++ b/oss-internship-2020/libtiff/sandboxed.h @@ -24,8 +24,8 @@ namespace { class TiffSapiSandbox : public TiffSandbox { public: - TiffSapiSandbox(std::optional file = std::nullopt, - std::optional dir = std::nullopt) + TiffSapiSandbox(std::optional file = std::nullopt, + std::optional dir = std::nullopt) : file_(std::move(file)), dir_(std::move(dir)) {} private: @@ -61,8 +61,8 @@ class TiffSapiSandbox : public TiffSandbox { return builder.get()->BuildOrDie(); } - std::optional file_; - std::optional dir_; + std::optional file_; + std::optional dir_; }; } // namespace diff --git a/oss-internship-2020/libtiff/test/defer_strile_writing.cc b/oss-internship-2020/libtiff/test/defer_strile_writing.cc index 5403d2a..e3b9847 100644 --- a/oss-internship-2020/libtiff/test/defer_strile_writing.cc +++ b/oss-internship-2020/libtiff/test/defer_strile_writing.cc @@ -37,10 +37,7 @@ void TestWriting(const char* mode, int tiled, int height) { std::string srcfile = sandbox2::file::JoinPath( sandbox2::file_util::fileops::GetCWD(), status_or_path.value()); - - absl::StatusOr status_or_int; absl::StatusOr status_or_long; - absl::StatusOr status_or_tif; TiffSapiSandbox sandbox(srcfile); ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API"; @@ -49,14 +46,15 @@ void TestWriting(const char* mode, int tiled, int height) { sapi::v::ConstCStr srcfile_var(srcfile.c_str()); sapi::v::ConstCStr mode_var(mode); - status_or_tif = api.TIFFOpen(srcfile_var.PtrBefore(), mode_var.PtrBefore()); + absl::StatusOr status_or_tif = + api.TIFFOpen(srcfile_var.PtrBefore(), mode_var.PtrBefore()); ASSERT_THAT(status_or_tif, IsOk()) << "Could not open " << srcfile; sapi::v::RemotePtr tif(status_or_tif.value()); ASSERT_THAT(tif.GetValue(), NotNull()) << "Can't create test TIFF file " << srcfile; - status_or_int = + absl::StatusOr status_or_int = api.TIFFSetFieldU1(&tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); ASSERT_THAT(status_or_int, IsOk()) << "TIFFSetFieldU1 fatal error"; EXPECT_THAT(status_or_int.value(), IsTrue()) @@ -214,10 +212,11 @@ void TestWriting(const char* mode, int tiled, int height) { for (int i = 0; i < (height + 15) / 16; ++i) { std::array tilebuffer; tilebuffer.fill(i); - sapi::v::Array tilebuffer_(tilebuffer.data(), tilebuffer.size()); + sapi::v::Array tilebuffer_sapi(tilebuffer.data(), + tilebuffer.size()); - status_or_int = api.TIFFWriteEncodedTile(&tif, i, tilebuffer_.PtrBoth(), - kTileBufferSize); + status_or_int = api.TIFFWriteEncodedTile( + &tif, i, tilebuffer_sapi.PtrBoth(), kTileBufferSize); ASSERT_THAT(status_or_int, IsOk()) << "TIFFWriteEncodedTile fatal error"; EXPECT_THAT(status_or_int.value(), Eq(kTileBufferSize)) << "line " << i << ": expected " << kTileBufferSize << ", got " @@ -254,11 +253,11 @@ void TestWriting(const char* mode, int tiled, int height) { uint8_t expected_c = static_cast(i); tilebuffer.fill(0); - sapi::v::Array tilebuffer_(tilebuffer.data(), - tilebuffer.size()); + sapi::v::Array tilebuffer_sapi(tilebuffer.data(), + tilebuffer.size()); status_or_long = api.TIFFReadEncodedTile( - &tif2, i, tilebuffer_.PtrBoth(), kTileBufferSize); + &tif2, i, tilebuffer_sapi.PtrBoth(), kTileBufferSize); ASSERT_THAT(status_or_long, IsOk()) << "TIFFReadEncodedTile fatal error"; EXPECT_THAT(status_or_long.value(), Eq(kTileBufferSize)) diff --git a/oss-internship-2020/libtiff/test/long_tag.cc b/oss-internship-2020/libtiff/test/long_tag.cc index 1c7d75d..c9f465e 100644 --- a/oss-internship-2020/libtiff/test/long_tag.cc +++ b/oss-internship-2020/libtiff/test/long_tag.cc @@ -50,24 +50,20 @@ TEST(SandboxTest, LongTag) { TiffSapiSandbox sandbox(srcfile); ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API"; - std::array buffer = {0, 127, 255}; - sapi::v::Array buffer_(buffer.data(), buffer.size()); - - absl::StatusOr status_or_int; - absl::StatusOr status_or_tif; - TiffApi api(&sandbox); sapi::v::ConstCStr srcfile_var(srcfile.c_str()); sapi::v::ConstCStr w_var("w"); - status_or_tif = api.TIFFOpen(srcfile_var.PtrBefore(), w_var.PtrBefore()); + absl::StatusOr status_or_tif = + api.TIFFOpen(srcfile_var.PtrBefore(), w_var.PtrBefore()); ASSERT_THAT(status_or_tif, IsOk()) << "Could not open " << srcfile; sapi::v::RemotePtr tif(status_or_tif.value()); ASSERT_THAT(tif.GetValue(), NotNull()) << "Can't create test TIFF file " << srcfile; - status_or_int = api.TIFFSetFieldU1(&tif, TIFFTAG_IMAGEWIDTH, kWidth); + absl::StatusOr status_or_int = + api.TIFFSetFieldU1(&tif, TIFFTAG_IMAGEWIDTH, kWidth); ASSERT_THAT(status_or_int, IsOk()) << "TIFFSetFieldU1 fatal error"; EXPECT_THAT(status_or_int.value(), IsTrue()) << "Can't set ImageWidth tag"; @@ -107,7 +103,10 @@ TEST(SandboxTest, LongTag) { EXPECT_THAT(status_or_int.value(), IsTrue()) << "Can't set tag " << tag.tag; } - status_or_int = api.TIFFWriteScanline(&tif, buffer_.PtrBoth(), 0, 0); + std::array buffer = {0, 127, 255}; + sapi::v::Array buffer_sapi(buffer.data(), buffer.size()); + + status_or_int = api.TIFFWriteScanline(&tif, buffer_sapi.PtrBoth(), 0, 0); ASSERT_THAT(status_or_int, IsOk()) << "TIFFWriteScanline fatal error"; ASSERT_THAT(status_or_int.value(), Ne(-1)) << "Can't write image data"; diff --git a/oss-internship-2020/libtiff/test/raw_decode.cc b/oss-internship-2020/libtiff/test/raw_decode.cc index d5cb1c2..2cea127 100644 --- a/oss-internship-2020/libtiff/test/raw_decode.cc +++ b/oss-internship-2020/libtiff/test/raw_decode.cc @@ -15,15 +15,21 @@ #include #include +#include "absl/algorithm/container.h" +#include "absl/strings/str_join.h" #include "helper.h" // NOLINT(build/include) #include "tiffio.h" // NOLINT(build/include) namespace { using ::sapi::IsOk; +using ::testing::ContainerEq; using ::testing::Eq; +using ::testing::Ge; +using ::testing::Gt; using ::testing::IsFalse; using ::testing::IsTrue; +using ::testing::Le; using ::testing::NotNull; struct ChannelLimits { @@ -55,141 +61,98 @@ constexpr std::array, kTestCount> kLimits = { {64, {0, 0, 0, 0, 0, 2, 255, 255}}, {512, {5, 6, 34, 36, 182, 196, 255, 255}}}}; -bool CheckCluster(uint32_t cluster, const sapi::v::Array& buffer, +void CheckCluster(uint32_t cluster, const sapi::v::Array& buffer, const ClusterData& expected_cluster) { - bool is_overrun = (buffer.GetSize() <= cluster * kClusterSize); - EXPECT_THAT(is_overrun, IsFalse()) << "Overrun"; - - if (is_overrun) { - return true; - } - - auto* target = buffer.GetData() + cluster * kClusterSize; - bool comp = - !(std::memcmp(target, expected_cluster.data(), kClusterSize) == 0); + ASSERT_THAT(buffer.GetSize(), Ge((cluster + 1) * kClusterSize)) << "Overrun"; // the image is split on 6-bit clusters because it has YCbCr color format - EXPECT_THAT(comp, IsFalse()) - << "Cluster " << cluster << " did not match expected results.\n" - << "Expect: " << expected_cluster[0] << "\t" << expected_cluster[1] - << "\t" << expected_cluster[2] << "\t" << expected_cluster[3] << "\t" - << expected_cluster[4] << "\t" << expected_cluster[5] << "\n" - << "Got: " << target[0] << "\t" << target[1] << "\t" << target[2] << "\t" - << target[3] << "\t" << target[4] << "\t" << target[5]; - - return comp; + EXPECT_THAT( + absl::MakeSpan(buffer.GetData() + cluster * kClusterSize, kClusterSize), + ContainerEq(absl::MakeSpan(expected_cluster))) + << "Cluster " << cluster << " did not match expected results."; } -bool CheckRgbPixel(uint32_t pixel, const ChannelLimits& limits, +void CheckRgbPixel(uint32_t pixel, const ChannelLimits& limits, const sapi::v::Array& buffer) { - bool is_overrun = (buffer.GetSize() <= pixel * kChannelsInPixel); - EXPECT_THAT(is_overrun, IsFalse()) << "Overrun"; + ASSERT_THAT(buffer.GetSize(), Ge((pixel + 1) * kChannelsInPixel)) + << "Overrun"; - if (is_overrun) { - return true; - } - - auto* rgb = buffer.GetData() + pixel * kChannelsInPixel; - bool comp = !(rgb[0] >= limits.min_red && rgb[0] <= limits.max_red && - rgb[1] >= limits.min_green && rgb[1] <= limits.max_green && - rgb[2] >= limits.min_blue && rgb[2] <= limits.max_blue); - - EXPECT_THAT(comp, IsFalse()) - << "Pixel " << pixel << " did not match expected results.\n" - << "Got R=" << rgb[0] << " (expected " << limits.min_red - << "..=" << limits.max_red << "), G=" << rgb[1] << " (expected " - << limits.min_green << "..=" << limits.max_green << "), B=" << rgb[2] - << " (expected " << limits.min_blue << "..=" << limits.max_blue << ")"; - return comp; + uint8_t* rgb = buffer.GetData() + pixel * kChannelsInPixel; + EXPECT_THAT(rgb[0], Ge(limits.min_red)); + EXPECT_THAT(rgb[0], Le(limits.max_red)); + EXPECT_THAT(rgb[1], Ge(limits.min_green)); + EXPECT_THAT(rgb[1], Le(limits.max_green)); + EXPECT_THAT(rgb[2], Ge(limits.min_blue)); + EXPECT_THAT(rgb[2], Le(limits.max_blue)); } -bool CheckRgbaPixel(uint32_t pixel, const ChannelLimits& limits, +void CheckRgbaPixel(uint32_t pixel, const ChannelLimits& limits, const sapi::v::Array& buffer) { // RGBA images are upside down - adjust for normal ordering uint32_t adjusted_pixel = pixel % 128 + (127 - (pixel / 128)) * 128; - bool is_overrun = (buffer.GetSize() <= adjusted_pixel); - EXPECT_THAT(is_overrun, IsFalse()) << "Overrun"; + ASSERT_THAT(buffer.GetSize(), Gt(adjusted_pixel)) << "Overrun"; - if (is_overrun) { - return true; - } - - auto rgba = buffer[adjusted_pixel]; - bool comp = !(TIFFGetR(rgba) >= static_cast(limits.min_red) && - TIFFGetR(rgba) <= static_cast(limits.max_red) && - TIFFGetG(rgba) >= static_cast(limits.min_green) && - TIFFGetG(rgba) <= static_cast(limits.max_green) && - TIFFGetB(rgba) >= static_cast(limits.min_blue) && - TIFFGetB(rgba) <= static_cast(limits.max_blue) && - TIFFGetA(rgba) >= static_cast(limits.min_alpha) && - TIFFGetA(rgba) <= static_cast(limits.max_alpha)); - - EXPECT_THAT(comp, IsFalse()) - << "Pixel " << pixel << " did not match expected results.\n" - << "Got R=" << TIFFGetR(rgba) << " (expected " << limits.min_red - << "..=" << limits.max_red << "), G=" << TIFFGetG(rgba) << " (expected " - << limits.min_green << "..=" << limits.max_green - << "), B=" << TIFFGetB(rgba) << " (expected " << limits.min_blue - << "..=" << limits.max_blue << "), A=" << TIFFGetA(rgba) << " (expected " - << limits.min_alpha << "..=" << limits.max_alpha << ")"; - return comp; + uint32_t rgba = buffer[adjusted_pixel]; + EXPECT_THAT(TIFFGetR(rgba), Ge(limits.min_red)); + EXPECT_THAT(TIFFGetR(rgba), Le(limits.max_red)); + EXPECT_THAT(TIFFGetG(rgba), Ge(limits.min_green)); + EXPECT_THAT(TIFFGetG(rgba), Le(limits.max_green)); + EXPECT_THAT(TIFFGetB(rgba), Ge(limits.min_blue)); + EXPECT_THAT(TIFFGetB(rgba), Le(limits.max_blue)); + EXPECT_THAT(TIFFGetA(rgba), Ge(limits.min_alpha)); + EXPECT_THAT(TIFFGetA(rgba), Le(limits.max_alpha)); } TEST(SandboxTest, RawDecode) { - tsize_t sz; - bool pixel_status_ok = false; - bool cluster_status_ok = false; std::string srcfile = GetFilePath("quad-tile.jpg.tiff"); TiffSapiSandbox sandbox(srcfile); ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API"; - sapi::v::UShort h; - sapi::v::UShort v; - absl::StatusOr status_or_tif; - absl::StatusOr status_or_int; - absl::StatusOr status_or_long; - TiffApi api(&sandbox); sapi::v::ConstCStr srcfile_var(srcfile.c_str()); sapi::v::ConstCStr r_var("r"); - status_or_tif = api.TIFFOpen(srcfile_var.PtrBefore(), r_var.PtrBefore()); + absl::StatusOr status_or_tif = + api.TIFFOpen(srcfile_var.PtrBefore(), r_var.PtrBefore()); ASSERT_THAT(status_or_tif, IsOk()) << "Could not open " << srcfile; sapi::v::RemotePtr tif(status_or_tif.value()); ASSERT_THAT(tif.GetValue(), NotNull()) << "Could not open " << srcfile << ", TIFFOpen return NULL"; - status_or_int = api.TIFFGetField2(&tif, TIFFTAG_YCBCRSUBSAMPLING, h.PtrBoth(), - v.PtrBoth()); + sapi::v::UShort h; + sapi::v::UShort v; + absl::StatusOr status_or_int = api.TIFFGetField2( + &tif, TIFFTAG_YCBCRSUBSAMPLING, h.PtrBoth(), v.PtrBoth()); ASSERT_THAT(status_or_int, IsOk()) << "TIFFGetField2 fatal error"; EXPECT_THAT( status_or_int.value() == 0 || h.GetValue() != 2 || v.GetValue() != 2, IsFalse()) << "Could not retrieve subsampling tag"; - status_or_long = api.TIFFTileSize(&tif); + tsize_t sz; + absl::StatusOr status_or_long = api.TIFFTileSize(&tif); ASSERT_THAT(status_or_int, IsOk()) << "TIFFTileSize fatal error"; EXPECT_THAT(status_or_long.value(), Eq(kClusterImageSize * kClusterSize)) << "Unexpected TileSize " << status_or_long.value() << ". Expected " - << kClusterImageSize * kClusterSize << " bytes\n"; + << kClusterImageSize * kClusterSize << " bytes"; sz = status_or_long.value(); - sapi::v::Array buffer_(sz); + sapi::v::Array buffer(sz); // Read a tile in decompressed form, but still YCbCr subsampled status_or_long = - api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer_.PtrBoth(), sz); + api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer.PtrBoth(), sz); ASSERT_THAT(status_or_long, IsOk()) << "TIFFReadEncodedTile fatal error"; EXPECT_THAT(status_or_long.value(), Eq(sz)) << "Did not get expected result code from TIFFReadEncodedTile()(" - << (int)status_or_long.value() << " instead of " << (int)sz << ")"; + << static_cast(status_or_long.value()) << " instead of " + << static_cast(sz) << ")"; for (const auto& [id, data] : kClusters) { - cluster_status_ok |= CheckCluster(id, buffer_, data); + CheckCluster(id, buffer, data); } - ASSERT_FALSE(cluster_status_ok) << "Clusters did not match expected results"; status_or_int = api.TIFFSetFieldU1(&tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); @@ -201,19 +164,19 @@ TEST(SandboxTest, RawDecode) { ASSERT_THAT(status_or_long, IsOk()) << "TIFFTileSize fatal error"; EXPECT_THAT(status_or_long.value(), Eq(kImageSize * kChannelsInPixel)) << "Unexpected TileSize " << status_or_long.value() << ". Expected " - << kImageSize * kChannelsInPixel << " bytes\n"; + << kImageSize * kChannelsInPixel << " bytes"; sz = status_or_long.value(); - sapi::v::Array buffer2_(sz); + sapi::v::Array buffer2(sz); status_or_long = - api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer2_.PtrBoth(), sz); + api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer2.PtrBoth(), sz); ASSERT_THAT(status_or_long, IsOk()) << "TIFFReadEncodedTile fatal error"; EXPECT_THAT(status_or_long.value(), Eq(sz)) << "Did not get expected result code from TIFFReadEncodedTile()(" << status_or_long.value() << " instead of " << sz; for (const auto& [id, data] : kLimits) { - pixel_status_ok |= CheckRgbPixel(id, data, buffer2_); + CheckRgbPixel(id, data, buffer2); } ASSERT_THAT(api.TIFFClose(&tif), IsOk()) << "TIFFClose fatal error"; @@ -225,20 +188,18 @@ TEST(SandboxTest, RawDecode) { ASSERT_THAT(tif2.GetValue(), NotNull()) << "Could not open " << srcfile << ", TIFFOpen return NULL"; - sapi::v::Array rgba_buffer_(kImageSize); - + sapi::v::Array rgba_buffer(kImageSize); status_or_int = - api.TIFFReadRGBATile(&tif2, 1 * 128, 2 * 128, rgba_buffer_.PtrBoth()); + api.TIFFReadRGBATile(&tif2, 1 * 128, 2 * 128, rgba_buffer.PtrBoth()); ASSERT_THAT(status_or_int, IsOk()) << "TIFFReadRGBATile fatal error"; EXPECT_THAT(status_or_int.value(), IsTrue()) << "TIFFReadRGBATile() returned failure code"; for (const auto& [id, data] : kLimits) { - pixel_status_ok |= CheckRgbaPixel(id, data, rgba_buffer_); + CheckRgbaPixel(id, data, rgba_buffer); } EXPECT_THAT(api.TIFFClose(&tif2), IsOk()) << "TIFFClose fatal error"; - EXPECT_THAT(pixel_status_ok, IsFalse()) << "wrong encoding"; } } // namespace diff --git a/oss-internship-2020/libtiff/test/short_tag.cc b/oss-internship-2020/libtiff/test/short_tag.cc index 7f1c0d6..f9da1ba 100644 --- a/oss-internship-2020/libtiff/test/short_tag.cc +++ b/oss-internship-2020/libtiff/test/short_tag.cc @@ -71,24 +71,20 @@ TEST(SandboxTest, ShortTag) { TiffSapiSandbox sandbox(srcfile); ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API"; - std::array buffer = {0, 127, 255}; - sapi::v::Array buffer_(buffer.data(), buffer.size()); - - absl::StatusOr status_or_int; - absl::StatusOr status_or_tif; - TiffApi api(&sandbox); sapi::v::ConstCStr srcfile_var(srcfile.c_str()); sapi::v::ConstCStr w_var("w"); - status_or_tif = api.TIFFOpen(srcfile_var.PtrBefore(), w_var.PtrBefore()); + absl::StatusOr status_or_tif = + api.TIFFOpen(srcfile_var.PtrBefore(), w_var.PtrBefore()); ASSERT_THAT(status_or_tif, IsOk()) << "Could not open " << srcfile; sapi::v::RemotePtr tif(status_or_tif.value()); ASSERT_THAT(tif.GetValue(), NotNull()) << "Can't create test TIFF file " << srcfile; - status_or_int = api.TIFFSetFieldUShort1(&tif, TIFFTAG_IMAGEWIDTH, kWidth); + absl::StatusOr status_or_int = + api.TIFFSetFieldUShort1(&tif, TIFFTAG_IMAGEWIDTH, kWidth); ASSERT_THAT(status_or_int, IsOk()) << "TIFFSetFieldUShort1 fatal error"; EXPECT_THAT(status_or_int.value(), IsTrue()) << "Can't set ImagekWidth tag"; @@ -136,7 +132,10 @@ TEST(SandboxTest, ShortTag) { EXPECT_THAT(status_or_int.value(), IsTrue()) << "Can't set tag " << tag.tag; } - status_or_int = api.TIFFWriteScanline(&tif, buffer_.PtrBoth(), 0, 0); + std::array buffer = {0, 127, 255}; + sapi::v::Array buffer_sapi(buffer.data(), buffer.size()); + + status_or_int = api.TIFFWriteScanline(&tif, buffer_sapi.PtrBoth(), 0, 0); ASSERT_THAT(status_or_int, IsOk()) << "TIFFWriteScanline fatal error"; ASSERT_THAT(status_or_int.value(), Ne(-1)) << "Can't write image data"; From b6a47abf019881e419cc416a0dbc00fd28f670e5 Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 23 Oct 2020 06:54:36 +0000 Subject: [PATCH 2/3] PtrBefore/PtrBoth/PtrAfter --- .../libtiff/example/main_sandboxed.cc | 12 ++++++------ .../libtiff/test/defer_strile_writing.cc | 4 ++-- oss-internship-2020/libtiff/test/long_tag.cc | 2 +- oss-internship-2020/libtiff/test/raw_decode.cc | 8 ++++---- oss-internship-2020/libtiff/test/short_tag.cc | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/oss-internship-2020/libtiff/example/main_sandboxed.cc b/oss-internship-2020/libtiff/example/main_sandboxed.cc index 5529f63..11e8a9e 100644 --- a/oss-internship-2020/libtiff/example/main_sandboxed.cc +++ b/oss-internship-2020/libtiff/example/main_sandboxed.cc @@ -196,7 +196,7 @@ absl::Status LibTIFFMain(const absl::string_view srcfile) { sapi::v::UShort v; SAPI_ASSIGN_OR_RETURN(int return_value, api.TIFFGetField2(&tif, TIFFTAG_YCBCRSUBSAMPLING, - h.PtrBoth(), v.PtrBoth())); + h.PtrAfter(), v.PtrAfter())); if (return_value == 0 || h.GetValue() != 2 || v.GetValue() != 2) { return absl::InternalError("Could not retrieve subsampling tag"); } @@ -212,7 +212,7 @@ absl::Status LibTIFFMain(const absl::string_view srcfile) { // Read a tile in decompressed form, but still YCbCr subsampled SAPI_ASSIGN_OR_RETURN( tsize_t new_sz, - api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer.PtrBoth(), sz)); + api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer.PtrAfter(), sz)); if (new_sz != sz) { return absl::InternalError(absl::StrCat( "Did not get expected result code from TIFFReadEncodedTile(): ", new_sz, @@ -246,10 +246,10 @@ absl::Status LibTIFFMain(const absl::string_view srcfile) { kChannelsInPixel * kImageSize, " bytes")); } - sapi::v::Array buffer2_(sz); + sapi::v::Array buffer2(sz); SAPI_ASSIGN_OR_RETURN( new_sz, - api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer2_.PtrBoth(), sz)); + api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer2.PtrAfter(), sz)); if (new_sz != sz) { return absl::InternalError(absl::StrCat( "Did not get expected result code from TIFFReadEncodedTile(): ", new_sz, @@ -258,7 +258,7 @@ absl::Status LibTIFFMain(const absl::string_view srcfile) { bool pixel_status_ok = true; for (const auto& [id, data] : kLimits) { - if (status = CheckRgbPixel(id, data, buffer2_); !status.ok()) { + if (status = CheckRgbPixel(id, data, buffer2); !status.ok()) { LOG(ERROR) << "CheckRgbPixel failed:\n" << status.ToString() << '\n'; } pixel_status_ok &= status.ok(); @@ -279,7 +279,7 @@ absl::Status LibTIFFMain(const absl::string_view srcfile) { // read as rgba SAPI_ASSIGN_OR_RETURN( return_value, - api.TIFFReadRGBATile(&tif2, 1 * 128, 2 * 128, rgba_buffer.PtrBoth())); + api.TIFFReadRGBATile(&tif2, 1 * 128, 2 * 128, rgba_buffer.PtrAfter())); if (return_value == 0) { return absl::InternalError("TIFFReadRGBATile() returned failure code"); } diff --git a/oss-internship-2020/libtiff/test/defer_strile_writing.cc b/oss-internship-2020/libtiff/test/defer_strile_writing.cc index e3b9847..017c2a8 100644 --- a/oss-internship-2020/libtiff/test/defer_strile_writing.cc +++ b/oss-internship-2020/libtiff/test/defer_strile_writing.cc @@ -216,7 +216,7 @@ void TestWriting(const char* mode, int tiled, int height) { tilebuffer.size()); status_or_int = api.TIFFWriteEncodedTile( - &tif, i, tilebuffer_sapi.PtrBoth(), kTileBufferSize); + &tif, i, tilebuffer_sapi.PtrBefore(), kTileBufferSize); ASSERT_THAT(status_or_int, IsOk()) << "TIFFWriteEncodedTile fatal error"; EXPECT_THAT(status_or_int.value(), Eq(kTileBufferSize)) << "line " << i << ": expected " << kTileBufferSize << ", got " @@ -225,7 +225,7 @@ void TestWriting(const char* mode, int tiled, int height) { } else { for (int i = 0; i < height; ++i) { sapi::v::UChar c(i); - status_or_long = api.TIFFWriteEncodedStrip(&tif, i, c.PtrBoth(), 1); + status_or_long = api.TIFFWriteEncodedStrip(&tif, i, c.PtrBefore(), 1); ASSERT_THAT(status_or_long, IsOk()) << "TIFFWriteEncodedStrip fatal error"; EXPECT_THAT(status_or_int.value(), Eq(1)) diff --git a/oss-internship-2020/libtiff/test/long_tag.cc b/oss-internship-2020/libtiff/test/long_tag.cc index c9f465e..5843e35 100644 --- a/oss-internship-2020/libtiff/test/long_tag.cc +++ b/oss-internship-2020/libtiff/test/long_tag.cc @@ -106,7 +106,7 @@ TEST(SandboxTest, LongTag) { std::array buffer = {0, 127, 255}; sapi::v::Array buffer_sapi(buffer.data(), buffer.size()); - status_or_int = api.TIFFWriteScanline(&tif, buffer_sapi.PtrBoth(), 0, 0); + status_or_int = api.TIFFWriteScanline(&tif, buffer_sapi.PtrBefore(), 0, 0); ASSERT_THAT(status_or_int, IsOk()) << "TIFFWriteScanline fatal error"; ASSERT_THAT(status_or_int.value(), Ne(-1)) << "Can't write image data"; diff --git a/oss-internship-2020/libtiff/test/raw_decode.cc b/oss-internship-2020/libtiff/test/raw_decode.cc index 2cea127..83b7edc 100644 --- a/oss-internship-2020/libtiff/test/raw_decode.cc +++ b/oss-internship-2020/libtiff/test/raw_decode.cc @@ -125,7 +125,7 @@ TEST(SandboxTest, RawDecode) { sapi::v::UShort h; sapi::v::UShort v; absl::StatusOr status_or_int = api.TIFFGetField2( - &tif, TIFFTAG_YCBCRSUBSAMPLING, h.PtrBoth(), v.PtrBoth()); + &tif, TIFFTAG_YCBCRSUBSAMPLING, h.PtrAfter(), v.PtrAfter()); ASSERT_THAT(status_or_int, IsOk()) << "TIFFGetField2 fatal error"; EXPECT_THAT( status_or_int.value() == 0 || h.GetValue() != 2 || v.GetValue() != 2, @@ -143,7 +143,7 @@ TEST(SandboxTest, RawDecode) { sapi::v::Array buffer(sz); // Read a tile in decompressed form, but still YCbCr subsampled status_or_long = - api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer.PtrBoth(), sz); + api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer.PtrAfter(), sz); ASSERT_THAT(status_or_long, IsOk()) << "TIFFReadEncodedTile fatal error"; EXPECT_THAT(status_or_long.value(), Eq(sz)) << "Did not get expected result code from TIFFReadEncodedTile()(" @@ -169,7 +169,7 @@ TEST(SandboxTest, RawDecode) { sapi::v::Array buffer2(sz); status_or_long = - api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer2.PtrBoth(), sz); + api.TIFFReadEncodedTile(&tif, kRawTileNumber, buffer2.PtrAfter(), sz); ASSERT_THAT(status_or_long, IsOk()) << "TIFFReadEncodedTile fatal error"; EXPECT_THAT(status_or_long.value(), Eq(sz)) << "Did not get expected result code from TIFFReadEncodedTile()(" @@ -190,7 +190,7 @@ TEST(SandboxTest, RawDecode) { sapi::v::Array rgba_buffer(kImageSize); status_or_int = - api.TIFFReadRGBATile(&tif2, 1 * 128, 2 * 128, rgba_buffer.PtrBoth()); + api.TIFFReadRGBATile(&tif2, 1 * 128, 2 * 128, rgba_buffer.PtrAfter()); ASSERT_THAT(status_or_int, IsOk()) << "TIFFReadRGBATile fatal error"; EXPECT_THAT(status_or_int.value(), IsTrue()) << "TIFFReadRGBATile() returned failure code"; diff --git a/oss-internship-2020/libtiff/test/short_tag.cc b/oss-internship-2020/libtiff/test/short_tag.cc index f9da1ba..f2c1d6b 100644 --- a/oss-internship-2020/libtiff/test/short_tag.cc +++ b/oss-internship-2020/libtiff/test/short_tag.cc @@ -135,7 +135,7 @@ TEST(SandboxTest, ShortTag) { std::array buffer = {0, 127, 255}; sapi::v::Array buffer_sapi(buffer.data(), buffer.size()); - status_or_int = api.TIFFWriteScanline(&tif, buffer_sapi.PtrBoth(), 0, 0); + status_or_int = api.TIFFWriteScanline(&tif, buffer_sapi.PtrBefore(), 0, 0); ASSERT_THAT(status_or_int, IsOk()) << "TIFFWriteScanline fatal error"; ASSERT_THAT(status_or_int.value(), Ne(-1)) << "Can't write image data"; From de377ffd2dd6ed8ff28db0cc856974361e0cd662 Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 23 Oct 2020 12:39:52 +0000 Subject: [PATCH 3/3] default values (remove 123 and 456) --- oss-internship-2020/libtiff/test/check_tag.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/oss-internship-2020/libtiff/test/check_tag.cc b/oss-internship-2020/libtiff/test/check_tag.cc index b30f23d..051891b 100644 --- a/oss-internship-2020/libtiff/test/check_tag.cc +++ b/oss-internship-2020/libtiff/test/check_tag.cc @@ -20,7 +20,7 @@ using ::testing::IsTrue; void CheckShortField(TiffApi& api, sapi::v::RemotePtr& tif, const ttag_t field, const uint16_t value) { - sapi::v::UShort tmp(123); + sapi::v::UShort tmp(value + 1); absl::StatusOr status_or_int; status_or_int = api.TIFFGetField1(&tif, field, tmp.PtrBoth()); @@ -34,8 +34,8 @@ void CheckShortField(TiffApi& api, sapi::v::RemotePtr& tif, const ttag_t field, void CheckShortPairedField(TiffApi& api, sapi::v::RemotePtr& tif, const ttag_t field, const std::array& values) { - sapi::v::UShort tmp0(123); - sapi::v::UShort tmp1(456); + sapi::v::UShort tmp0(values[0] + 1); + sapi::v::UShort tmp1(values[1] + 1); absl::StatusOr status_or_int; status_or_int = @@ -51,7 +51,7 @@ void CheckShortPairedField(TiffApi& api, sapi::v::RemotePtr& tif, void CheckLongField(TiffApi& api, sapi::v::RemotePtr& tif, const ttag_t field, const uint32_t value) { - sapi::v::UInt tmp(123); + sapi::v::UInt tmp(value + 1); absl::StatusOr status_or_int; status_or_int = api.TIFFGetField1(&tif, field, tmp.PtrBoth());