| Index: printing/backend/cups_ipp_util_unittest.cc
|
| diff --git a/printing/backend/cups_ipp_util_unittest.cc b/printing/backend/cups_ipp_util_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8b44d4a1a15cbd08f4b00dab448487d23cb49964
|
| --- /dev/null
|
| +++ b/printing/backend/cups_ipp_util_unittest.cc
|
| @@ -0,0 +1,193 @@
|
| +// Copyright 2016 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.
|
| +
|
| +#include <cups/cups.h>
|
| +
|
| +#include <map>
|
| +#include <memory>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "printing/backend/cups_ipp_util.h"
|
| +#include "printing/backend/cups_printer.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace printing {
|
| +
|
| +class MockCupsOptionProvider : public CupsOptionProvider {
|
| + public:
|
| + ~MockCupsOptionProvider() override {}
|
| +
|
| + ipp_attribute_t* GetSupportedOptionValues(
|
| + base::StringPiece option_name) const override {
|
| + const auto attr = supported_attributes_.find(option_name);
|
| + return attr != supported_attributes_.end() ? attr->second : nullptr;
|
| + }
|
| +
|
| + std::vector<base::StringPiece> GetSupportedOptionValueStrings(
|
| + base::StringPiece option_name) const override {
|
| + ipp_attribute_t* attr = GetSupportedOptionValues(option_name);
|
| + if (!attr)
|
| + return std::vector<base::StringPiece>();
|
| +
|
| + std::vector<base::StringPiece> strings;
|
| + int size = ippGetCount(attr);
|
| + for (int i = 0; i < size; ++i) {
|
| + strings.emplace_back(ippGetString(attr, i, nullptr));
|
| + }
|
| +
|
| + return strings;
|
| + }
|
| +
|
| + ipp_attribute_t* GetDefaultOptionValue(
|
| + base::StringPiece option_name) const override {
|
| + const auto attr = default_attributes_.find(option_name);
|
| + return attr != default_attributes_.end() ? attr->second : nullptr;
|
| + }
|
| +
|
| + bool CheckOptionSupported(base::StringPiece name,
|
| + base::StringPiece value) const override {
|
| + NOTREACHED();
|
| + return false;
|
| + }
|
| +
|
| + void SetSupportedOptions(base::StringPiece name, ipp_attribute_t* attribute) {
|
| + supported_attributes_[name] = attribute;
|
| + }
|
| +
|
| + void SetOptionDefault(base::StringPiece name, ipp_attribute_t* attribute) {
|
| + default_attributes_[name] = attribute;
|
| + }
|
| +
|
| + private:
|
| + std::map<base::StringPiece, ipp_attribute_t*> supported_attributes_;
|
| + std::map<base::StringPiece, ipp_attribute_t*> default_attributes_;
|
| +};
|
| +
|
| +class PrintBackendCupsIppUtilTest : public ::testing::Test {
|
| + protected:
|
| + void SetUp() override {
|
| + ipp_ = ippNew();
|
| + printer_ = base::MakeUnique<MockCupsOptionProvider>();
|
| + }
|
| +
|
| + void TearDown() override {
|
| + ippDelete(ipp_);
|
| + printer_.reset();
|
| + }
|
| +
|
| + ipp_t* ipp_;
|
| + std::unique_ptr<MockCupsOptionProvider> printer_;
|
| +};
|
| +
|
| +ipp_attribute_t* MakeRange(ipp_t* ipp, int lower_bound, int upper_bound) {
|
| + return ippAddRange(ipp, IPP_TAG_PRINTER, "TEST_DATA", lower_bound,
|
| + upper_bound);
|
| +}
|
| +
|
| +ipp_attribute_t* MakeString(ipp_t* ipp, const char* value) {
|
| + return ippAddString(ipp, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "TEST_DATA",
|
| + nullptr, value);
|
| +}
|
| +
|
| +ipp_attribute_t* MakeStringCollection(ipp_t* ipp,
|
| + std::vector<const char*> strings) {
|
| + return ippAddStrings(ipp, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "TEST_DATA",
|
| + strings.size(), nullptr, strings.data());
|
| +}
|
| +
|
| +TEST_F(PrintBackendCupsIppUtilTest, CopiesCapable) {
|
| + printer_->SetSupportedOptions("copies", MakeRange(ipp_, 1, 2));
|
| +
|
| + PrinterSemanticCapsAndDefaults caps;
|
| + CapsAndDefaultsFromPrinter(*printer_, &caps);
|
| +
|
| + EXPECT_TRUE(caps.copies_capable);
|
| +}
|
| +
|
| +TEST_F(PrintBackendCupsIppUtilTest, CopiesNotCapable) {
|
| + // copies missing, no setup
|
| + PrinterSemanticCapsAndDefaults caps;
|
| + CapsAndDefaultsFromPrinter(*printer_, &caps);
|
| +
|
| + EXPECT_FALSE(caps.copies_capable);
|
| +}
|
| +
|
| +TEST_F(PrintBackendCupsIppUtilTest, ColorPrinter) {
|
| + printer_->SetSupportedOptions(
|
| + "print-color-mode", MakeStringCollection(ipp_, {"color", "monochrome"}));
|
| + printer_->SetOptionDefault("print-color-mode", MakeString(ipp_, "color"));
|
| +
|
| + PrinterSemanticCapsAndDefaults caps;
|
| + CapsAndDefaultsFromPrinter(*printer_, &caps);
|
| +
|
| + EXPECT_TRUE(caps.color_changeable);
|
| + EXPECT_TRUE(caps.color_default);
|
| +}
|
| +
|
| +TEST_F(PrintBackendCupsIppUtilTest, BWPrinter) {
|
| + printer_->SetSupportedOptions("print-color-mode",
|
| + MakeStringCollection(ipp_, {"monochrome"}));
|
| + printer_->SetOptionDefault("print-color-mode",
|
| + MakeString(ipp_, "monochrome"));
|
| +
|
| + PrinterSemanticCapsAndDefaults caps;
|
| + CapsAndDefaultsFromPrinter(*printer_, &caps);
|
| +
|
| + EXPECT_FALSE(caps.color_changeable);
|
| + EXPECT_FALSE(caps.color_default);
|
| +}
|
| +
|
| +TEST_F(PrintBackendCupsIppUtilTest, DuplexSupported) {
|
| + printer_->SetSupportedOptions(
|
| + "sides",
|
| + MakeStringCollection(ipp_, {"two-sided-long-edge", "one-sided"}));
|
| + printer_->SetOptionDefault("sides", MakeString(ipp_, "one-sided"));
|
| +
|
| + PrinterSemanticCapsAndDefaults caps;
|
| + CapsAndDefaultsFromPrinter(*printer_, &caps);
|
| +
|
| + EXPECT_TRUE(caps.duplex_capable);
|
| + EXPECT_FALSE(caps.duplex_default);
|
| +}
|
| +
|
| +TEST_F(PrintBackendCupsIppUtilTest, DuplexNotSupported) {
|
| + printer_->SetSupportedOptions("sides",
|
| + MakeStringCollection(ipp_, {"one-sided"}));
|
| + printer_->SetOptionDefault("sides", MakeString(ipp_, "one-sided"));
|
| +
|
| + PrinterSemanticCapsAndDefaults caps;
|
| + CapsAndDefaultsFromPrinter(*printer_, &caps);
|
| +
|
| + EXPECT_FALSE(caps.duplex_capable);
|
| + EXPECT_FALSE(caps.duplex_default);
|
| +}
|
| +
|
| +TEST_F(PrintBackendCupsIppUtilTest, A4PaperSupported) {
|
| + printer_->SetSupportedOptions(
|
| + "media", MakeStringCollection(ipp_, {"iso_a4_210x297mm"}));
|
| +
|
| + PrinterSemanticCapsAndDefaults caps;
|
| + CapsAndDefaultsFromPrinter(*printer_, &caps);
|
| +
|
| + PrinterSemanticCapsAndDefaults::Paper paper = caps.papers[0];
|
| + EXPECT_EQ("iso a4", paper.display_name);
|
| + EXPECT_EQ("iso_a4_210x297mm", paper.vendor_id);
|
| + EXPECT_EQ(210000, paper.size_um.width());
|
| + EXPECT_EQ(297000, paper.size_um.height());
|
| +}
|
| +
|
| +TEST_F(PrintBackendCupsIppUtilTest, LegalPaperDefault) {
|
| + printer_->SetOptionDefault("media", MakeString(ipp_, "na_legal_8.5x14in"));
|
| +
|
| + PrinterSemanticCapsAndDefaults caps;
|
| + CapsAndDefaultsFromPrinter(*printer_, &caps);
|
| +
|
| + EXPECT_EQ("na legal", caps.default_paper.display_name);
|
| + EXPECT_EQ("na_legal_8.5x14in", caps.default_paper.vendor_id);
|
| + EXPECT_EQ(215900, caps.default_paper.size_um.width());
|
| + EXPECT_EQ(355600, caps.default_paper.size_um.height());
|
| +}
|
| +
|
| +} // namespace printing
|
|
|