OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <cups/cups.h> |
| 6 |
| 7 #include <map> |
| 8 #include <memory> |
| 9 |
| 10 #include "base/logging.h" |
| 11 #include "base/memory/ptr_util.h" |
| 12 #include "printing/backend/cups_ipp_util.h" |
| 13 #include "printing/backend/cups_printer.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 |
| 16 namespace printing { |
| 17 |
| 18 class MockCupsOptionProvider : public CupsOptionProvider { |
| 19 public: |
| 20 ~MockCupsOptionProvider() override {} |
| 21 |
| 22 ipp_attribute_t* GetSupportedOptionValues( |
| 23 base::StringPiece option_name) const override { |
| 24 const auto attr = supported_attributes_.find(option_name); |
| 25 return attr != supported_attributes_.end() ? attr->second : nullptr; |
| 26 } |
| 27 |
| 28 std::vector<base::StringPiece> GetSupportedOptionValueStrings( |
| 29 base::StringPiece option_name) const override { |
| 30 ipp_attribute_t* attr = GetSupportedOptionValues(option_name); |
| 31 if (!attr) |
| 32 return std::vector<base::StringPiece>(); |
| 33 |
| 34 std::vector<base::StringPiece> strings; |
| 35 int size = ippGetCount(attr); |
| 36 for (int i = 0; i < size; ++i) { |
| 37 strings.emplace_back(ippGetString(attr, i, nullptr)); |
| 38 } |
| 39 |
| 40 return strings; |
| 41 } |
| 42 |
| 43 ipp_attribute_t* GetDefaultOptionValue( |
| 44 base::StringPiece option_name) const override { |
| 45 const auto attr = default_attributes_.find(option_name); |
| 46 return attr != default_attributes_.end() ? attr->second : nullptr; |
| 47 } |
| 48 |
| 49 bool CheckOptionSupported(base::StringPiece name, |
| 50 base::StringPiece value) const override { |
| 51 NOTREACHED(); |
| 52 return false; |
| 53 } |
| 54 |
| 55 void SetSupportedOptions(base::StringPiece name, ipp_attribute_t* attribute) { |
| 56 supported_attributes_[name] = attribute; |
| 57 } |
| 58 |
| 59 void SetOptionDefault(base::StringPiece name, ipp_attribute_t* attribute) { |
| 60 default_attributes_[name] = attribute; |
| 61 } |
| 62 |
| 63 private: |
| 64 std::map<base::StringPiece, ipp_attribute_t*> supported_attributes_; |
| 65 std::map<base::StringPiece, ipp_attribute_t*> default_attributes_; |
| 66 }; |
| 67 |
| 68 class PrintBackendCupsIppUtilTest : public ::testing::Test { |
| 69 protected: |
| 70 void SetUp() override { |
| 71 ipp_ = ippNew(); |
| 72 printer_ = base::MakeUnique<MockCupsOptionProvider>(); |
| 73 } |
| 74 |
| 75 void TearDown() override { |
| 76 ippDelete(ipp_); |
| 77 printer_.reset(); |
| 78 } |
| 79 |
| 80 ipp_t* ipp_; |
| 81 std::unique_ptr<MockCupsOptionProvider> printer_; |
| 82 }; |
| 83 |
| 84 ipp_attribute_t* MakeRange(ipp_t* ipp, int lower_bound, int upper_bound) { |
| 85 return ippAddRange(ipp, IPP_TAG_PRINTER, "TEST_DATA", lower_bound, |
| 86 upper_bound); |
| 87 } |
| 88 |
| 89 ipp_attribute_t* MakeString(ipp_t* ipp, const char* value) { |
| 90 return ippAddString(ipp, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "TEST_DATA", |
| 91 nullptr, value); |
| 92 } |
| 93 |
| 94 ipp_attribute_t* MakeStringCollection(ipp_t* ipp, |
| 95 std::vector<const char*> strings) { |
| 96 return ippAddStrings(ipp, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "TEST_DATA", |
| 97 strings.size(), nullptr, strings.data()); |
| 98 } |
| 99 |
| 100 TEST_F(PrintBackendCupsIppUtilTest, CopiesCapable) { |
| 101 printer_->SetSupportedOptions("copies", MakeRange(ipp_, 1, 2)); |
| 102 |
| 103 PrinterSemanticCapsAndDefaults caps; |
| 104 CapsAndDefaultsFromPrinter(*printer_, &caps); |
| 105 |
| 106 EXPECT_TRUE(caps.copies_capable); |
| 107 } |
| 108 |
| 109 TEST_F(PrintBackendCupsIppUtilTest, CopiesNotCapable) { |
| 110 // copies missing, no setup |
| 111 PrinterSemanticCapsAndDefaults caps; |
| 112 CapsAndDefaultsFromPrinter(*printer_, &caps); |
| 113 |
| 114 EXPECT_FALSE(caps.copies_capable); |
| 115 } |
| 116 |
| 117 TEST_F(PrintBackendCupsIppUtilTest, ColorPrinter) { |
| 118 printer_->SetSupportedOptions( |
| 119 "print-color-mode", MakeStringCollection(ipp_, {"color", "monochrome"})); |
| 120 printer_->SetOptionDefault("print-color-mode", MakeString(ipp_, "color")); |
| 121 |
| 122 PrinterSemanticCapsAndDefaults caps; |
| 123 CapsAndDefaultsFromPrinter(*printer_, &caps); |
| 124 |
| 125 EXPECT_TRUE(caps.color_changeable); |
| 126 EXPECT_TRUE(caps.color_default); |
| 127 } |
| 128 |
| 129 TEST_F(PrintBackendCupsIppUtilTest, BWPrinter) { |
| 130 printer_->SetSupportedOptions("print-color-mode", |
| 131 MakeStringCollection(ipp_, {"monochrome"})); |
| 132 printer_->SetOptionDefault("print-color-mode", |
| 133 MakeString(ipp_, "monochrome")); |
| 134 |
| 135 PrinterSemanticCapsAndDefaults caps; |
| 136 CapsAndDefaultsFromPrinter(*printer_, &caps); |
| 137 |
| 138 EXPECT_FALSE(caps.color_changeable); |
| 139 EXPECT_FALSE(caps.color_default); |
| 140 } |
| 141 |
| 142 TEST_F(PrintBackendCupsIppUtilTest, DuplexSupported) { |
| 143 printer_->SetSupportedOptions( |
| 144 "sides", |
| 145 MakeStringCollection(ipp_, {"two-sided-long-edge", "one-sided"})); |
| 146 printer_->SetOptionDefault("sides", MakeString(ipp_, "one-sided")); |
| 147 |
| 148 PrinterSemanticCapsAndDefaults caps; |
| 149 CapsAndDefaultsFromPrinter(*printer_, &caps); |
| 150 |
| 151 EXPECT_TRUE(caps.duplex_capable); |
| 152 EXPECT_FALSE(caps.duplex_default); |
| 153 } |
| 154 |
| 155 TEST_F(PrintBackendCupsIppUtilTest, DuplexNotSupported) { |
| 156 printer_->SetSupportedOptions("sides", |
| 157 MakeStringCollection(ipp_, {"one-sided"})); |
| 158 printer_->SetOptionDefault("sides", MakeString(ipp_, "one-sided")); |
| 159 |
| 160 PrinterSemanticCapsAndDefaults caps; |
| 161 CapsAndDefaultsFromPrinter(*printer_, &caps); |
| 162 |
| 163 EXPECT_FALSE(caps.duplex_capable); |
| 164 EXPECT_FALSE(caps.duplex_default); |
| 165 } |
| 166 |
| 167 TEST_F(PrintBackendCupsIppUtilTest, A4PaperSupported) { |
| 168 printer_->SetSupportedOptions( |
| 169 "media", MakeStringCollection(ipp_, {"iso_a4_210x297mm"})); |
| 170 |
| 171 PrinterSemanticCapsAndDefaults caps; |
| 172 CapsAndDefaultsFromPrinter(*printer_, &caps); |
| 173 |
| 174 PrinterSemanticCapsAndDefaults::Paper paper = caps.papers[0]; |
| 175 EXPECT_EQ("iso a4", paper.display_name); |
| 176 EXPECT_EQ("iso_a4_210x297mm", paper.vendor_id); |
| 177 EXPECT_EQ(210000, paper.size_um.width()); |
| 178 EXPECT_EQ(297000, paper.size_um.height()); |
| 179 } |
| 180 |
| 181 TEST_F(PrintBackendCupsIppUtilTest, LegalPaperDefault) { |
| 182 printer_->SetOptionDefault("media", MakeString(ipp_, "na_legal_8.5x14in")); |
| 183 |
| 184 PrinterSemanticCapsAndDefaults caps; |
| 185 CapsAndDefaultsFromPrinter(*printer_, &caps); |
| 186 |
| 187 EXPECT_EQ("na legal", caps.default_paper.display_name); |
| 188 EXPECT_EQ("na_legal_8.5x14in", caps.default_paper.vendor_id); |
| 189 EXPECT_EQ(215900, caps.default_paper.size_um.width()); |
| 190 EXPECT_EQ(355600, caps.default_paper.size_um.height()); |
| 191 } |
| 192 |
| 193 } // namespace printing |
OLD | NEW |