Commit 6ed9c742 authored by Nikita Podguzov's avatar Nikita Podguzov Committed by Commit Bot

Printing API: Add browser test for submitJob()

Bug: 996785
Change-Id: Icfce332a4cc763bdabed6a235224a6cea014c203
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2015040Reviewed-by: default avatarSean Kau <skau@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Commit-Queue: Nikita Podguzov <nikitapodguzov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#742545}
parent 1cbbc56b
......@@ -248,6 +248,11 @@ void PrintingAPIHandler::OnPrinterStatusRetrieved(
/*error=*/base::nullopt));
}
void PrintingAPIHandler::SetPrintJobControllerForTesting(
std::unique_ptr<PrintJobController> print_job_controller) {
print_job_controller_ = std::move(print_job_controller);
}
void PrintingAPIHandler::OnPrintJobCreated(
base::WeakPtr<chromeos::CupsPrintJob> job) {
DispatchJobStatusChangedEvent(api::printing::JOB_STATUS_PENDING, job);
......
......@@ -104,6 +104,9 @@ class PrintingAPIHandler : public BrowserContextKeyedAPI,
void GetPrinterInfo(const std::string& printer_id,
GetPrinterInfoCallback callback);
void SetPrintJobControllerForTesting(
std::unique_ptr<PrintJobController> print_job_controller);
private:
// Needed for BrowserContextKeyedAPI implementation.
friend class BrowserContextKeyedAPIFactory<PrintingAPIHandler>;
......
......@@ -3,9 +3,13 @@
// found in the LICENSE file.
#include "base/bind.h"
#include "chrome/browser/chromeos/extensions/printing/fake_print_job_controller.h"
#include "chrome/browser/chromeos/extensions/printing/printing_api.h"
#include "chrome/browser/chromeos/extensions/printing/printing_api_handler.h"
#include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h"
#include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h"
#include "chrome/browser/chromeos/printing/printer_configurer.h"
#include "chrome/browser/chromeos/printing/test_cups_print_job_manager.h"
#include "chrome/browser/chromeos/printing/test_cups_printers_manager.h"
#include "chrome/browser/chromeos/printing/test_printer_configurer.h"
#include "chrome/browser/extensions/extension_apitest.h"
......@@ -14,6 +18,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/ui_test_utils.h"
#include "chromeos/printing/printer_configuration.h"
#include "extensions/test/result_catcher.h"
#include "printing/backend/print_backend.h"
#include "printing/backend/test_print_backend.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -24,11 +29,39 @@ namespace {
constexpr char kId[] = "id";
constexpr int kHorizontalDpi = 300;
constexpr int kVerticalDpi = 400;
constexpr int kMediaSizeWidth = 210000;
constexpr int kMediaSizeHeight = 297000;
constexpr char kMediaSizeVendorId[] = "iso_a4_210x297mm";
std::unique_ptr<KeyedService> BuildTestCupsPrintJobManager(
content::BrowserContext* context) {
return std::make_unique<chromeos::TestCupsPrintJobManager>(
Profile::FromBrowserContext(context));
}
std::unique_ptr<KeyedService> BuildTestCupsPrintersManager(
content::BrowserContext* context) {
return std::make_unique<chromeos::TestCupsPrintersManager>();
}
std::unique_ptr<printing::PrinterSemanticCapsAndDefaults>
ConstructPrinterCapabilities() {
auto capabilities =
std::make_unique<printing::PrinterSemanticCapsAndDefaults>();
capabilities->color_model = printing::COLOR;
capabilities->duplex_modes.push_back(printing::SIMPLEX);
capabilities->copies_capable = true;
capabilities->dpis.push_back(gfx::Size(kHorizontalDpi, kVerticalDpi));
printing::PrinterSemanticCapsAndDefaults::Paper paper;
paper.vendor_id = kMediaSizeVendorId;
paper.size_um = gfx::Size(kMediaSizeWidth, kMediaSizeHeight);
capabilities->papers.push_back(paper);
capabilities->collate_capable = true;
return capabilities;
}
} // namespace
class PrintingApiTest : public ExtensionApiTest {
......@@ -49,11 +82,37 @@ class PrintingApiTest : public ExtensionApiTest {
base::Unretained(this)));
chromeos::PrinterConfigurer::SetPrinterConfigurerForTesting(
std::make_unique<chromeos::TestPrinterConfigurer>());
test_print_backend_ = base::MakeRefCounted<printing::TestPrintBackend>();
printing::PrintBackend::SetPrintBackendForTesting(
test_print_backend_.get());
ExtensionApiTest::SetUpInProcessBrowserTestFixture();
}
chromeos::TestCupsPrintJobManager* GetPrintJobManager() {
return static_cast<chromeos::TestCupsPrintJobManager*>(
chromeos::CupsPrintJobManagerFactory::GetForBrowserContext(
browser()->profile()));
}
chromeos::TestCupsPrintersManager* GetPrintersManager() {
return static_cast<chromeos::TestCupsPrintersManager*>(
chromeos::CupsPrintersManagerFactory::GetForBrowserContext(
browser()->profile()));
}
void AddAvailablePrinter(
const std::string& printer_id,
std::unique_ptr<printing::PrinterSemanticCapsAndDefaults> capabilities) {
chromeos::Printer printer = chromeos::Printer(printer_id);
GetPrintersManager()->AddPrinter(printer,
chromeos::PrinterClass::kEnterprise);
test_print_backend_->AddValidPrinter(printer_id, std::move(capabilities));
}
private:
void OnWillCreateBrowserContextServices(content::BrowserContext* context) {
chromeos::CupsPrintJobManagerFactory::GetInstance()->SetTestingFactory(
context, base::BindRepeating(&BuildTestCupsPrintJobManager));
chromeos::CupsPrintersManagerFactory::GetInstance()->SetTestingFactory(
context, base::BindRepeating(&BuildTestCupsPrintersManager));
}
......@@ -61,6 +120,8 @@ class PrintingApiTest : public ExtensionApiTest {
std::unique_ptr<
base::CallbackList<void(content::BrowserContext*)>::Subscription>
will_create_browser_context_services_subscription_;
scoped_refptr<printing::TestPrintBackend> test_print_backend_;
};
IN_PROC_BROWSER_TEST_F(PrintingApiTest, GetPrinters) {
......@@ -68,30 +129,49 @@ IN_PROC_BROWSER_TEST_F(PrintingApiTest, GetPrinters) {
chromeos::Printer printer = chromeos::Printer(kId);
printer.set_display_name(kName);
chromeos::TestCupsPrintersManager* printers_manager =
static_cast<chromeos::TestCupsPrintersManager*>(
chromeos::CupsPrintersManagerFactory::GetForBrowserContext(
browser()->profile()));
printers_manager->AddPrinter(printer, chromeos::PrinterClass::kSaved);
GetPrintersManager()->AddPrinter(printer, chromeos::PrinterClass::kSaved);
SetCustomArg(kName);
ASSERT_TRUE(RunExtensionSubtest("printing", "get_printers.html"));
}
IN_PROC_BROWSER_TEST_F(PrintingApiTest, GetPrinterInfo) {
chromeos::Printer printer = chromeos::Printer(kId);
chromeos::TestCupsPrintersManager* printers_manager =
static_cast<chromeos::TestCupsPrintersManager*>(
chromeos::CupsPrintersManagerFactory::GetForBrowserContext(
browser()->profile()));
printers_manager->AddPrinter(printer, chromeos::PrinterClass::kSaved);
auto test_backend = base::MakeRefCounted<printing::TestPrintBackend>();
printing::PrintBackend::SetPrintBackendForTesting(test_backend.get());
test_backend->AddValidPrinter(
AddAvailablePrinter(
kId, std::make_unique<printing::PrinterSemanticCapsAndDefaults>());
ASSERT_TRUE(RunExtensionSubtest("printing", "get_printer_info.html"));
}
// Verifies that:
// a) PrintingHooksDelegate substitutes corresponding Blob UUID and DCHECK
// doesn't fail.
// b) Whole API arguments handling pipeline works correctly.
// We use fake version of PrintJobController because we don't have a mock
// version of PrintingContext which is required to handle sending print job to
// the printer.
IN_PROC_BROWSER_TEST_F(PrintingApiTest, SubmitJob) {
ASSERT_TRUE(StartEmbeddedTestServer());
AddAvailablePrinter(kId, ConstructPrinterCapabilities());
PrintingAPIHandler::Get(browser()->profile())
->SetPrintJobControllerForTesting(
std::make_unique<FakePrintJobController>(GetPrintJobManager(),
GetPrintersManager()));
ASSERT_TRUE(RunExtensionSubtest("printing", "submit_job.html"));
}
// Verifies that:
// a) Cancel job request works smoothly.
// b) OnJobStatusChanged() events are dispatched correctly.
IN_PROC_BROWSER_TEST_F(PrintingApiTest, CancelJob) {
ASSERT_TRUE(StartEmbeddedTestServer());
AddAvailablePrinter(kId, ConstructPrinterCapabilities());
PrintingAPIHandler::Get(browser()->profile())
->SetPrintJobControllerForTesting(
std::make_unique<FakePrintJobController>(GetPrintJobManager(),
GetPrintersManager()));
ASSERT_TRUE(RunExtensionSubtest("printing", "cancel_job.html"));
}
} // namespace extensions
......@@ -2499,8 +2499,11 @@ if (!is_android) {
sources += [ "../browser/chromeos/web_applications/sample_system_web_app_integration_browsertest.cc" ]
}
if (use_cups) {
sources +=
[ "../browser/chromeos/extensions/printing/printing_apitest.cc" ]
sources += [
"../browser/chromeos/extensions/printing/fake_print_job_controller.cc",
"../browser/chromeos/extensions/printing/fake_print_job_controller.h",
"../browser/chromeos/extensions/printing/printing_apitest.cc",
]
deps += [ "//printing:test_support" ]
}
if (enable_assistant_integration_tests) {
......
<!--
* Copyright 2020 The Chromium Authors. All rights reserved. Use of this source
* code is governed by a BSD-style license that can be found in the LICENSE
* file.
-->
<script src="printing_util.js"></script>
<script src="cancel_job.js"></script>
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
chrome.test.getConfig(function(config) {
// We expect three events: PENDING, IN_PROGRESS and CANCELED as the final
// one.
const statuses = [
chrome.printing.JobStatus.PENDING, chrome.printing.JobStatus.IN_PROGRESS,
chrome.printing.JobStatus.CANCELED
];
var eventCounter = 0;
chrome.printing.onJobStatusChanged.addListener((jobId, status) => {
chrome.test.assertEq(statuses[eventCounter], status);
eventCounter++;
// We don't expect any other events to happen so finish the test as
// passed.
if (eventCounter == statuses.length)
chrome.test.notifyPass();
});
const url = 'http://localhost:' + config.testServer.port + '/pdf/test.pdf';
submitJob('id', 'test job', url, response => {
chrome.test.assertTrue(response != undefined);
chrome.test.assertTrue(response.status != undefined);
chrome.test.assertEq(chrome.printing.SubmitJobStatus.OK, response.status);
chrome.test.assertTrue(response.jobId != undefined);
chrome.printing.cancelJob(response.jobId, () => {});
});
});
......@@ -4,6 +4,7 @@
"manifest_version": 2,
"description": "Browser tests for chrome.printing API",
"permissions": [
"printing"
"printing",
"http://localhost/*"
]
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
function submitJob(printerId, title, url, callback) {
// Minimal required ticket.
const ticket = {
version: '1.0',
print: {
color: {type: 'STANDARD_COLOR'},
duplex: {type: 'NO_DUPLEX'},
page_orientation: {type: 'LANDSCAPE'},
copies: {copies: 1},
dpi: {horizontal_dpi: 300, vertical_dpi: 400},
media_size: {
width_microns: 210000,
height_microns: 297000,
vendor_id: 'iso_a4_210x297mm'
},
collate: {collate: false}
}
};
fetch(url).then(response => response.arrayBuffer()).then(arrayBuffer => {
const submitJobRequest = {
job: {
printerId: printerId,
title: title,
ticket: ticket,
contentType: 'application/pdf',
document:
new Blob([new Uint8Array(arrayBuffer)], {type: 'application/pdf'})
}
};
chrome.printing.submitJob(submitJobRequest, callback);
});
}
<!--
* Copyright 2020 The Chromium Authors. All rights reserved. Use of this source
* code is governed by a BSD-style license that can be found in the LICENSE
* file.
-->
<script src="printing_util.js"></script>
<script src="submit_job.js"></script>
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
chrome.test.getConfig(function(config) {
const url = 'http://localhost:' + config.testServer.port + '/pdf/test.pdf';
submitJob('id', 'test job', url, response => {
chrome.test.assertTrue(response != undefined);
chrome.test.assertTrue(response.status != undefined);
chrome.test.assertEq(chrome.printing.SubmitJobStatus.OK, response.status);
chrome.test.assertTrue(response.jobId != undefined);
chrome.test.notifyPass();
});
});
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment