0

[pdf] Migrate printing unit tests

Migrates PdfViewPluginBase tests that exercise printing.

Also replaces the ad hoc TestPDFiumEngine::SetPermissions() API with a
gMock-based equivalent.

Bug: 1323307
Change-Id: I6fe7cd54a5bc208990fccdbef16a6e5cdf7aa879
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3696484
Commit-Queue: K. Moon <kmoon@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1012236}
This commit is contained in:
K. Moon
2022-06-09 00:02:08 +00:00
committed by Chromium LUCI CQ
parent f2177b39b8
commit fac20b00e9
4 changed files with 141 additions and 110 deletions

@ -39,14 +39,9 @@ namespace chrome_pdf {
namespace {
using blink::WebPrintParams;
using ::testing::ByMove;
using ::testing::ElementsAre;
using ::testing::Field;
using ::testing::InSequence;
using ::testing::IsEmpty;
using ::testing::IsFalse;
using ::testing::IsTrue;
using ::testing::NiceMock;
using ::testing::Return;
using ::testing::SaveArg;
@ -197,6 +192,24 @@ class PdfViewPluginBaseWithEngineTest : public PdfViewPluginBaseTest {
})");
fake_plugin_.HandleMessage(message.GetDict());
}
void SetEnginePermissions(
const std::vector<DocumentPermission>& permissions) {
TestPDFiumEngine& engine =
*static_cast<TestPDFiumEngine*>(fake_plugin_.engine());
// TODO(crbug.com/1323307): Break up tests instead of "resetting" mocks.
for (DocumentPermission permission :
{DocumentPermission::kCopy, DocumentPermission::kCopyAccessible,
DocumentPermission::kPrintLowQuality,
DocumentPermission::kPrintHighQuality}) {
ON_CALL(engine, HasPermission(permission)).WillByDefault(Return(false));
}
for (DocumentPermission permission : permissions) {
ON_CALL(engine, HasPermission(permission)).WillByDefault(Return(true));
}
}
};
class PdfViewPluginBaseWithScopedLocaleTest
@ -571,80 +584,12 @@ TEST_F(PdfViewPluginBaseWithEngineTest, SelectionChangedScaled) {
EXPECT_EQ(gfx::Point(-300, -56), viewport_info.scroll);
}
TEST_F(PdfViewPluginBaseWithEngineTest, NormalPrinting) {
WebPrintParams params;
const std::vector<int> kPageNumbers = {0};
auto* engine = static_cast<TestPDFiumEngine*>(fake_plugin_.engine());
engine->SetPermissions({DocumentPermission::kPrintHighQuality,
DocumentPermission::kPrintLowQuality});
InSequence sequence;
EXPECT_CALL(*engine,
PrintPages(kPageNumbers,
Field(&WebPrintParams::rasterize_pdf, IsFalse())))
.Times(1);
EXPECT_CALL(
*engine,
PrintPages(kPageNumbers, Field(&WebPrintParams::rasterize_pdf, IsTrue())))
.Times(1);
ASSERT_EQ(static_cast<int>(TestPDFiumEngine::kPageNumber),
fake_plugin_.PrintBegin(params));
fake_plugin_.PrintPages(kPageNumbers);
fake_plugin_.PrintEnd();
params.rasterize_pdf = true;
ASSERT_EQ(static_cast<int>(TestPDFiumEngine::kPageNumber),
fake_plugin_.PrintBegin(params));
fake_plugin_.PrintPages(kPageNumbers);
fake_plugin_.PrintEnd();
}
// Regression test for crbug.com/1307219.
TEST_F(PdfViewPluginBaseWithEngineTest, LowQualityPrinting) {
WebPrintParams params;
const std::vector<int> kPageNumbers = {0};
auto* engine = static_cast<TestPDFiumEngine*>(fake_plugin_.engine());
engine->SetPermissions({DocumentPermission::kPrintLowQuality});
EXPECT_CALL(
*engine,
PrintPages(kPageNumbers, Field(&WebPrintParams::rasterize_pdf, IsTrue())))
.Times(2);
ASSERT_EQ(static_cast<int>(TestPDFiumEngine::kPageNumber),
fake_plugin_.PrintBegin(params));
fake_plugin_.PrintPages(kPageNumbers);
fake_plugin_.PrintEnd();
params.rasterize_pdf = true;
ASSERT_EQ(static_cast<int>(TestPDFiumEngine::kPageNumber),
fake_plugin_.PrintBegin(params));
fake_plugin_.PrintPages(kPageNumbers);
fake_plugin_.PrintEnd();
}
TEST_F(PdfViewPluginBaseWithEngineTest, NoPrinting) {
WebPrintParams params;
auto* engine = static_cast<TestPDFiumEngine*>(fake_plugin_.engine());
engine->SetPermissions({});
EXPECT_EQ(0, fake_plugin_.PrintBegin(params));
params.rasterize_pdf = true;
EXPECT_EQ(0, fake_plugin_.PrintBegin(params));
}
TEST_F(PdfViewPluginBaseWithEngineTest, GetContentRestrictions) {
auto* engine = static_cast<TestPDFiumEngine*>(fake_plugin_.engine());
static constexpr int kContentRestrictionCutPaste =
kContentRestrictionCut | kContentRestrictionPaste;
// Test engine without any permissions.
engine->SetPermissions({});
SetEnginePermissions({});
int content_restrictions = fake_plugin_.GetContentRestrictions();
EXPECT_EQ(kContentRestrictionCutPaste | kContentRestrictionCopy |
@ -652,48 +597,46 @@ TEST_F(PdfViewPluginBaseWithEngineTest, GetContentRestrictions) {
content_restrictions);
// Test engine with only copy permission.
engine->SetPermissions({DocumentPermission::kCopy});
SetEnginePermissions({DocumentPermission::kCopy});
content_restrictions = fake_plugin_.GetContentRestrictions();
EXPECT_EQ(kContentRestrictionCutPaste | kContentRestrictionPrint,
content_restrictions);
// Test engine with only print low quality permission.
engine->SetPermissions({DocumentPermission::kPrintLowQuality});
SetEnginePermissions({DocumentPermission::kPrintLowQuality});
content_restrictions = fake_plugin_.GetContentRestrictions();
EXPECT_EQ(kContentRestrictionCutPaste | kContentRestrictionCopy,
content_restrictions);
// Test engine with both copy and print low quality permissions.
engine->SetPermissions(
SetEnginePermissions(
{DocumentPermission::kCopy, DocumentPermission::kPrintLowQuality});
content_restrictions = fake_plugin_.GetContentRestrictions();
EXPECT_EQ(kContentRestrictionCutPaste, content_restrictions);
// Test engine with print high and low quality permissions.
engine->SetPermissions({DocumentPermission::kPrintHighQuality,
DocumentPermission::kPrintLowQuality});
SetEnginePermissions({DocumentPermission::kPrintHighQuality,
DocumentPermission::kPrintLowQuality});
content_restrictions = fake_plugin_.GetContentRestrictions();
EXPECT_EQ(kContentRestrictionCutPaste | kContentRestrictionCopy,
content_restrictions);
// Test engine with copy, print high and low quality permissions.
engine->SetPermissions({DocumentPermission::kCopy,
DocumentPermission::kPrintHighQuality,
DocumentPermission::kPrintLowQuality});
SetEnginePermissions({DocumentPermission::kCopy,
DocumentPermission::kPrintHighQuality,
DocumentPermission::kPrintLowQuality});
content_restrictions = fake_plugin_.GetContentRestrictions();
EXPECT_EQ(kContentRestrictionCutPaste, content_restrictions);
}
TEST_F(PdfViewPluginBaseWithEngineTest, GetAccessibilityDocInfo) {
auto* engine = static_cast<TestPDFiumEngine*>(fake_plugin_.engine());
// Test engine without any permissions.
engine->SetPermissions({});
SetEnginePermissions({});
AccessibilityDocInfo doc_info = fake_plugin_.GetAccessibilityDocInfo();
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info.page_count);
@ -701,7 +644,7 @@ TEST_F(PdfViewPluginBaseWithEngineTest, GetAccessibilityDocInfo) {
EXPECT_FALSE(doc_info.text_copyable);
// Test engine with only copy permission.
engine->SetPermissions({DocumentPermission::kCopy});
SetEnginePermissions({DocumentPermission::kCopy});
doc_info = fake_plugin_.GetAccessibilityDocInfo();
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info.page_count);
@ -709,7 +652,7 @@ TEST_F(PdfViewPluginBaseWithEngineTest, GetAccessibilityDocInfo) {
EXPECT_TRUE(doc_info.text_copyable);
// Test engine with only copy accessible permission.
engine->SetPermissions({DocumentPermission::kCopyAccessible});
SetEnginePermissions({DocumentPermission::kCopyAccessible});
doc_info = fake_plugin_.GetAccessibilityDocInfo();
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info.page_count);
@ -717,7 +660,7 @@ TEST_F(PdfViewPluginBaseWithEngineTest, GetAccessibilityDocInfo) {
EXPECT_FALSE(doc_info.text_copyable);
// Test engine with both copy and copy accessible permission.
engine->SetPermissions(
SetEnginePermissions(
{DocumentPermission::kCopy, DocumentPermission::kCopyAccessible});
doc_info = fake_plugin_.GetAccessibilityDocInfo();

@ -4,6 +4,8 @@
#include "pdf/pdf_view_web_plugin.h"
#include <stdint.h>
#include <functional>
#include <memory>
#include <string>
@ -34,6 +36,7 @@
#include "pdf/pdf_view_plugin_base.h"
#include "pdf/test/test_helpers.h"
#include "pdf/test/test_pdfium_engine.h"
#include "printing/metafile_skia.h"
#include "services/network/public/mojom/referrer_policy.mojom-shared.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@ -55,6 +58,7 @@
#include "third_party/blink/public/web/web_associated_url_loader_client.h"
#include "third_party/blink/public/web/web_plugin_container.h"
#include "third_party/blink/public/web/web_plugin_params.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/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
@ -80,11 +84,14 @@ namespace chrome_pdf {
namespace {
using ::testing::AnyNumber;
using ::testing::ElementsAre;
using ::testing::ElementsAreArray;
using ::testing::Eq;
using ::testing::InSequence;
using ::testing::Invoke;
using ::testing::IsEmpty;
using ::testing::IsFalse;
using ::testing::IsTrue;
using ::testing::MockFunction;
using ::testing::NiceMock;
using ::testing::Pointwise;
@ -1729,6 +1736,107 @@ TEST_F(PdfViewWebPluginSubmitFormTest, AbsoluteUrlInvalidDocumentUrl) {
SubmitFailingForm("https://wwww.example.com");
}
class PdfViewWebPluginPrintTest : public PdfViewWebPluginTest {
protected:
void SetUp() override {
PdfViewWebPluginTest::SetUp();
// Size must be at least 1 for conversion to `SkMemoryStream`.
ON_CALL(*engine_ptr_, PrintPages)
.WillByDefault(Return(std::vector<uint8_t>(1)));
canvas_.sk_canvas()->SetPrintingMetafile(&metafile_);
}
printing::MetafileSkia metafile_;
};
TEST_F(PdfViewWebPluginPrintTest, HighQuality) {
EXPECT_CALL(*engine_ptr_,
HasPermission(DocumentPermission::kPrintHighQuality))
.WillRepeatedly(Return(true));
EXPECT_CALL(*engine_ptr_, HasPermission(DocumentPermission::kPrintLowQuality))
.WillRepeatedly(Return(true));
ASSERT_EQ(static_cast<int>(TestPDFiumEngine::kPageNumber),
plugin_->PrintBegin(blink::WebPrintParams()));
EXPECT_CALL(
*engine_ptr_,
PrintPages(ElementsAre(0),
Field(&blink::WebPrintParams::rasterize_pdf, IsFalse())));
plugin_->PrintPage(0, canvas_.sk_canvas());
plugin_->PrintEnd();
}
TEST_F(PdfViewWebPluginPrintTest, HighQualityRasterized) {
EXPECT_CALL(*engine_ptr_,
HasPermission(DocumentPermission::kPrintHighQuality))
.WillRepeatedly(Return(true));
EXPECT_CALL(*engine_ptr_, HasPermission(DocumentPermission::kPrintLowQuality))
.WillRepeatedly(Return(true));
blink::WebPrintParams params;
params.rasterize_pdf = true;
ASSERT_EQ(static_cast<int>(TestPDFiumEngine::kPageNumber),
plugin_->PrintBegin(params));
EXPECT_CALL(
*engine_ptr_,
PrintPages(ElementsAre(0),
Field(&blink::WebPrintParams::rasterize_pdf, IsTrue())));
plugin_->PrintPage(0, canvas_.sk_canvas());
plugin_->PrintEnd();
}
// Regression test for crbug.com/1307219.
TEST_F(PdfViewWebPluginPrintTest, LowQuality) {
EXPECT_CALL(*engine_ptr_,
HasPermission(DocumentPermission::kPrintHighQuality))
.WillRepeatedly(Return(false));
EXPECT_CALL(*engine_ptr_, HasPermission(DocumentPermission::kPrintLowQuality))
.WillRepeatedly(Return(true));
ASSERT_EQ(static_cast<int>(TestPDFiumEngine::kPageNumber),
plugin_->PrintBegin(blink::WebPrintParams()));
EXPECT_CALL(
*engine_ptr_,
PrintPages(ElementsAre(0),
Field(&blink::WebPrintParams::rasterize_pdf, IsTrue())));
plugin_->PrintPage(0, canvas_.sk_canvas());
plugin_->PrintEnd();
}
// Regression test for crbug.com/1307219.
TEST_F(PdfViewWebPluginPrintTest, LowQualityRasterized) {
EXPECT_CALL(*engine_ptr_,
HasPermission(DocumentPermission::kPrintHighQuality))
.WillRepeatedly(Return(false));
EXPECT_CALL(*engine_ptr_, HasPermission(DocumentPermission::kPrintLowQuality))
.WillRepeatedly(Return(true));
blink::WebPrintParams params;
params.rasterize_pdf = true;
ASSERT_EQ(static_cast<int>(TestPDFiumEngine::kPageNumber),
plugin_->PrintBegin(params));
EXPECT_CALL(
*engine_ptr_,
PrintPages(ElementsAre(0),
Field(&blink::WebPrintParams::rasterize_pdf, IsTrue())));
plugin_->PrintPage(0, canvas_.sk_canvas());
plugin_->PrintEnd();
}
TEST_F(PdfViewWebPluginPrintTest, Disabled) {
EXPECT_EQ(0, plugin_->PrintBegin(blink::WebPrintParams()));
}
TEST_F(PdfViewWebPluginPrintTest, DisabledRasterized) {
blink::WebPrintParams params;
params.rasterize_pdf = true;
EXPECT_EQ(0, plugin_->PrintBegin(params));
}
class PdfViewWebPluginPrintPreviewTest : public PdfViewWebPluginTest {
protected:
void SetUpClient() override {

@ -11,8 +11,6 @@
#include <vector>
#include "base/check_op.h"
#include "base/containers/contains.h"
#include "base/containers/flat_set.h"
#include "base/values.h"
#include "pdf/document_attachment_info.h"
#include "pdf/document_metadata.h"
@ -36,10 +34,6 @@ TestPDFiumEngine::TestPDFiumEngine(PDFEngine::Client* client)
TestPDFiumEngine::~TestPDFiumEngine() = default;
bool TestPDFiumEngine::HasPermission(DocumentPermission permission) const {
return base::Contains(permissions_, permission);
}
const std::vector<DocumentAttachmentInfo>&
TestPDFiumEngine::GetDocumentAttachmentInfoList() const {
return doc_attachment_info_list_;
@ -71,12 +65,4 @@ std::vector<uint8_t> TestPDFiumEngine::GetSaveData() {
return std::vector<uint8_t>(std::begin(kSaveData), std::end(kSaveData));
}
void TestPDFiumEngine::SetPermissions(
const std::vector<DocumentPermission>& permissions) {
permissions_.clear();
for (auto& permission : permissions)
permissions_.insert(permission);
}
} // namespace chrome_pdf

@ -9,7 +9,6 @@
#include <vector>
#include "base/containers/flat_set.h"
#include "base/values.h"
#include "pdf/document_attachment_info.h"
#include "pdf/document_metadata.h"
@ -60,8 +59,7 @@ class TestPDFiumEngine : public PDFiumEngine {
MOCK_METHOD(std::vector<uint8_t>,
PrintPages,
(const std::vector<int>& page_numbers,
const blink::WebPrintParams& print_params),
(const std::vector<int>&, const blink::WebPrintParams&),
(override));
MOCK_METHOD(void, ZoomUpdated, (double), (override));
@ -71,7 +69,7 @@ class TestPDFiumEngine : public PDFiumEngine {
(const DocumentLayout::Options&),
(override));
bool HasPermission(DocumentPermission permission) const override;
MOCK_METHOD(bool, HasPermission, (DocumentPermission), (const override));
const std::vector<DocumentAttachmentInfo>& GetDocumentAttachmentInfoList()
const override;
@ -95,8 +93,6 @@ class TestPDFiumEngine : public PDFiumEngine {
MOCK_METHOD(void, SetCaretPosition, (const gfx::Point&), (override));
void SetPermissions(const std::vector<DocumentPermission>& permissions);
MOCK_METHOD(void, OnDocumentCanceled, (), (override));
protected:
@ -110,8 +106,6 @@ class TestPDFiumEngine : public PDFiumEngine {
std::vector<DocumentAttachmentInfo> doc_attachment_info_list_;
DocumentMetadata metadata_;
base::flat_set<DocumentPermission> permissions_;
};
} // namespace chrome_pdf