0

Compare to reference images in PDFiumPrintTest

Make it easier to update PDFiumPrintTest by comparing to reference
images, rather than opaque hashes.

Split PDFiumPrintTest.AlterScaling into multiple tests, to minimize the
amount of time spent in each individual test. This avoids timeouts when
a test fails, and large amounts of output are generated.

Also fix PDFiumPageThumbnailTest to check cc::MatchesPNGFile()'s return
value.

Change-Id: Ifd01dac813aee542d2c9b2c3eec10906995b6584
Cq-Do-Not-Cancel-Tryjobs: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2988296
Reviewed-by: Daniel Hosseinian <dhoss@chromium.org>
Commit-Queue: Daniel Hosseinian <dhoss@chromium.org>
Auto-Submit: K. Moon <kmoon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#896227}
This commit is contained in:
K. Moon
2021-06-25 22:19:02 +00:00
committed by Chromium LUCI CQ
parent 5442a0ab0a
commit 047cf35992
10 changed files with 104 additions and 70 deletions

@ -9,7 +9,6 @@
#include "base/check.h"
#include "base/files/file_path.h"
#include "base/path_service.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/test/gtest_util.h"
@ -20,6 +19,7 @@
#include "pdf/pdfium/pdfium_test_base.h"
#include "pdf/ppapi_migration/geometry_conversions.h"
#include "pdf/test/test_client.h"
#include "pdf/test/test_helpers.h"
#include "pdf/ui/thumbnail.h"
#include "ppapi/c/private/ppb_pdf.h"
#include "testing/gtest/include/gtest/gtest.h"
@ -86,13 +86,7 @@ base::FilePath GetThumbnailTestData(const std::string& expectation_file_prefix,
std::string file_dir = base::StringPrintf("%.1fx", device_pixel_ratio);
std::string file_name = base::StringPrintf(
"%s_expected.pdf.%zu.png", expectation_file_prefix.c_str(), page_index);
base::FilePath root_path;
if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &root_path))
return base::FilePath();
return root_path.Append(FILE_PATH_LITERAL("pdf"))
.Append(FILE_PATH_LITERAL("test"))
.Append(FILE_PATH_LITERAL("data"))
.Append(FILE_PATH_LITERAL("thumbnail"))
return base::FilePath(FILE_PATH_LITERAL("thumbnail"))
.AppendASCII(file_dir)
.AppendASCII(file_name);
}
@ -743,8 +737,10 @@ class PDFiumPageThumbnailTest : public PDFiumTestBase {
base::FilePath expectation_png_file_path = GetThumbnailTestData(
expectation_file_prefix, page_index, device_pixel_ratio);
cc::MatchesPNGFile(thumbnail.bitmap(), expectation_png_file_path,
cc::ExactPixelComparator(/*discard_alpha=*/false));
EXPECT_TRUE(cc::MatchesPNGFile(
thumbnail.bitmap(), GetTestDataFilePath(expectation_png_file_path),
cc::ExactPixelComparator(/*discard_alpha=*/false)))
<< "Reference: " << expectation_png_file_path;
}
};

@ -6,19 +6,25 @@
#include <memory>
#include "base/hash/md5.h"
#include "base/files/file_path.h"
#include "base/stl_util.h"
#include "base/strings/string_piece.h"
#include "cc/test/pixel_test_utils.h"
#include "pdf/pdfium/pdfium_engine.h"
#include "pdf/pdfium/pdfium_engine_exports.h"
#include "pdf/pdfium/pdfium_test_base.h"
#include "pdf/test/test_client.h"
#include "pdf/test/test_helpers.h"
#include "printing/pdf_render_settings.h"
#include "printing/units.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/public/web/web_print_params.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size_f.h"
#include "ui/gfx/skia_util.h"
namespace chrome_pdf {
@ -27,15 +33,17 @@ using ::testing::ElementsAre;
namespace {
// Number of color channels in a BGRA bitmap.
constexpr int kColorChannels = 4;
constexpr gfx::Size kUSLetterSize = {612, 792};
constexpr gfx::Rect kUSLetterRect = {{0, 0}, kUSLetterSize};
constexpr gfx::Rect kPrintableAreaRect = {{18, 18}, {576, 733}};
using ExpectedDimensions = std::vector<gfx::SizeF>;
base::FilePath GetReferenceFilePath(base::StringPiece test_filename) {
return GetTestDataFilePath(base::FilePath(FILE_PATH_LITERAL("pdfium_print"))
.AppendASCII(test_filename));
}
blink::WebPrintParams GetDefaultPrintParams() {
blink::WebPrintParams params;
params.print_content_area = kUSLetterRect;
@ -64,7 +72,7 @@ void CheckPdfDimensions(const std::vector<uint8_t>& pdf_data,
void CheckPdfRendering(const std::vector<uint8_t>& pdf_data,
int page_number,
const gfx::SizeF& size_in_points,
const char* expected_md5_hash) {
base::StringPiece expected_png_filename) {
int width_in_pixels =
printing::ConvertUnit(size_in_points.width(), printing::kPointsPerInch,
printing::kDefaultPdfDpi);
@ -73,8 +81,10 @@ void CheckPdfRendering(const std::vector<uint8_t>& pdf_data,
printing::kDefaultPdfDpi);
const gfx::Rect page_rect(width_in_pixels, height_in_pixels);
std::vector<uint8_t> page_bitmap_data(kColorChannels * page_rect.width() *
page_rect.height());
SkBitmap page_bitmap;
page_bitmap.allocPixels(
SkImageInfo::Make(gfx::SizeToSkISize(page_rect.size()),
kBGRA_8888_SkColorType, kPremul_SkAlphaType));
PDFEngineExports::RenderingSettings settings(
gfx::Size(printing::kDefaultPdfDpi, printing::kDefaultPdfDpi), page_rect,
@ -86,11 +96,12 @@ void CheckPdfRendering(const std::vector<uint8_t>& pdf_data,
PDFiumEngineExports exports;
ASSERT_TRUE(exports.RenderPDFPageToBitmap(pdf_data, page_number, settings,
page_bitmap_data.data()));
page_bitmap.getPixels()));
base::MD5Digest hash;
base::MD5Sum(page_bitmap_data.data(), page_bitmap_data.size(), &hash);
EXPECT_STREQ(expected_md5_hash, base::MD5DigestToBase16(hash).c_str());
EXPECT_TRUE(cc::MatchesPNGFile(
page_bitmap, GetReferenceFilePath(expected_png_filename),
cc::ExactPixelComparator(/*discard_alpha=*/false)))
<< "Reference: " << expected_png_filename;
}
} // namespace
@ -140,7 +151,7 @@ TEST_F(PDFiumPrintTest, Basic) {
}
}
TEST_F(PDFiumPrintTest, AlterScaling) {
TEST_F(PDFiumPrintTest, AlterScalingDefault) {
TestClient client;
std::unique_ptr<PDFiumEngine> engine =
InitializeEngine(&client, FILE_PATH_LITERAL("rectangles.pdf"));
@ -148,67 +159,75 @@ TEST_F(PDFiumPrintTest, AlterScaling) {
PDFiumPrint print(engine.get());
const ExpectedDimensions kExpectedDimensions = {{612.0, 792.0}};
const std::vector<int> pages = {0};
blink::WebPrintParams print_params = GetDefaultPrintParams();
print_params.printable_area = kPrintableAreaRect;
std::vector<uint8_t> pdf_data = print.PrintPagesAsPdf(pages, print_params);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0],
"alter_scaling_default.png");
blink::WebPrintParams print_params_raster = print_params;
print_params_raster.rasterize_pdf = true;
print_params.rasterize_pdf = true;
pdf_data = print.PrintPagesAsPdf(pages, print_params);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0],
"alter_scaling_default_raster.png");
}
TEST_F(PDFiumPrintTest, AlterScalingFitPaper) {
TestClient client;
std::unique_ptr<PDFiumEngine> engine =
InitializeEngine(&client, FILE_PATH_LITERAL("rectangles.pdf"));
ASSERT_TRUE(engine);
PDFiumPrint print(engine.get());
const ExpectedDimensions kExpectedDimensions = {{612.0, 792.0}};
const std::vector<int> pages = {0};
{
// Default scaling
static constexpr char kChecksum[] = "40e2e16416015cdde5c6e5735c1d06ac";
static constexpr char kChecksumRaster[] =
"535659885de1ba060222cb13df995ca7";
blink::WebPrintParams print_params = GetDefaultPrintParams();
print_params.printable_area = kPrintableAreaRect;
print_params.print_scaling_option =
printing::mojom::PrintScalingOption::kFitToPaper;
std::vector<uint8_t> pdf_data = print.PrintPagesAsPdf(pages, print_params);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0],
"alter_scaling_fit-paper.png");
std::vector<uint8_t> pdf_data = print.PrintPagesAsPdf(pages, print_params);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0], kChecksum);
print_params.rasterize_pdf = true;
pdf_data = print.PrintPagesAsPdf(pages, print_params);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0],
"alter_scaling_fit-paper_raster.png");
}
pdf_data = print.PrintPagesAsPdf(pages, print_params_raster);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0], kChecksumRaster);
}
{
// "Fit to Printable Area" scaling
print_params.print_scaling_option =
printing::mojom::PrintScalingOption::kFitToPrintableArea;
print_params_raster.print_scaling_option =
printing::mojom::PrintScalingOption::kFitToPrintableArea;
TEST_F(PDFiumPrintTest, AlterScalingFitPrintable) {
TestClient client;
std::unique_ptr<PDFiumEngine> engine =
InitializeEngine(&client, FILE_PATH_LITERAL("rectangles.pdf"));
ASSERT_TRUE(engine);
static constexpr char kChecksum[] = "41847e1f0c581150a84794482528f790";
static constexpr char kChecksumRaster[] =
"63e36d3b991bbd3126fbb6f6c95af336";
PDFiumPrint print(engine.get());
std::vector<uint8_t> pdf_data = print.PrintPagesAsPdf(pages, print_params);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0], kChecksum);
const ExpectedDimensions kExpectedDimensions = {{612.0, 792.0}};
const std::vector<int> pages = {0};
pdf_data = print.PrintPagesAsPdf(pages, print_params_raster);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0], kChecksumRaster);
}
{
// "Fit to Paper" scaling
print_params.print_scaling_option =
printing::mojom::PrintScalingOption::kFitToPaper;
print_params_raster.print_scaling_option =
printing::mojom::PrintScalingOption::kFitToPaper;
blink::WebPrintParams print_params = GetDefaultPrintParams();
print_params.printable_area = kPrintableAreaRect;
print_params.print_scaling_option =
printing::mojom::PrintScalingOption::kFitToPrintableArea;
std::vector<uint8_t> pdf_data = print.PrintPagesAsPdf(pages, print_params);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0],
"alter_scaling_fit-printable.png");
static constexpr char kChecksum[] = "3a4828228bcbae230574c057b7a0669e";
static constexpr char kChecksumRaster[] =
"3ca8f6ead6fe5e41b5e2d8817bedecbb";
std::vector<uint8_t> pdf_data = print.PrintPagesAsPdf(pages, print_params);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0], kChecksum);
pdf_data = print.PrintPagesAsPdf(pages, print_params_raster);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0], kChecksumRaster);
}
print_params.rasterize_pdf = true;
pdf_data = print.PrintPagesAsPdf(pages, print_params);
CheckPdfDimensions(pdf_data, kExpectedDimensions);
CheckPdfRendering(pdf_data, 0, kExpectedDimensions[0],
"alter_scaling_fit-printable_raster.png");
}
} // namespace chrome_pdf

Binary file not shown.

After

(image error) Size: 13 KiB

Binary file not shown.

After

(image error) Size: 48 KiB

Binary file not shown.

After

(image error) Size: 13 KiB

Binary file not shown.

After

(image error) Size: 53 KiB

Binary file not shown.

After

(image error) Size: 13 KiB

Binary file not shown.

After

(image error) Size: 52 KiB

@ -4,6 +4,9 @@
#include "pdf/test/test_helpers.h"
#include "base/base_paths.h"
#include "base/files/file_path.h"
#include "base/path_service.h"
#include "pdf/ppapi_migration/bitmap.h"
#include "pdf/ppapi_migration/image.h"
#include "third_party/skia/include/core/SkBitmap.h"
@ -12,6 +15,17 @@
namespace chrome_pdf {
base::FilePath GetTestDataFilePath(const base::FilePath& path) {
base::FilePath source_root;
if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &source_root))
return {};
return source_root.Append(FILE_PATH_LITERAL("pdf"))
.Append(FILE_PATH_LITERAL("test"))
.Append(FILE_PATH_LITERAL("data"))
.Append(path);
}
Image CreateSkiaImageForTesting(const gfx::Size& size, SkColor color) {
SkBitmap bitmap = CreateN32PremulSkBitmap(gfx::SizeToSkISize(size));
bitmap.eraseColor(color);

@ -5,6 +5,7 @@
#ifndef PDF_TEST_TEST_HELPERS_H_
#define PDF_TEST_TEST_HELPERS_H_
#include "base/files/file_path.h"
#include "pdf/ppapi_migration/image.h"
#include "third_party/skia/include/core/SkColor.h"
@ -14,6 +15,10 @@ class Size;
namespace chrome_pdf {
// Resolves a file path within //pdf/test/data. `path` must be relative. Returns
// the empty path if the source root can't be found.
base::FilePath GetTestDataFilePath(const base::FilePath& path);
// Creates a Skia-format `Image` of a given size filled with a given color.
Image CreateSkiaImageForTesting(const gfx::Size& size, SkColor color);