1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "printing/print_settings_conversion.h"
7 #include "base/containers/contains.h"
8 #include "base/test/values_test_util.h"
9 #include "base/values.h"
10 #include "build/build_config.h"
11 #include "printing/print_settings.h"
12 #include "testing/gtest/include/gtest/gtest.h"
18 const char kPrinterSettings[] = R"({
19 "headerFooterEnabled": true,
21 "url": "http://localhost/",
22 "shouldPrintBackgrounds": false,
23 "shouldPrintSelectionOnly": false,
25 "height_microns": 297000,
26 "width_microns": 210000
38 "deviceName": "printer",
40 "rasterizePDF": false,
41 "rasterizePdfDpi": 150,
45 "previewModifiable": true,
47 "username": "username@domain.net",
51 const char kPrinterSettingsWithImageableArea[] = R"({
52 "headerFooterEnabled": false,
54 "url": "http://localhost/",
55 "shouldPrintBackgrounds": false,
56 "shouldPrintSelectionOnly": false,
58 "height_microns": 297000,
59 "imageable_area_bottom_microns": 1000,
60 "imageable_area_left_microns": 0,
61 "imageable_area_right_microns": 180000,
62 "imageable_area_top_microns": 297000,
63 "width_microns": 210000
70 "deviceName": "printer",
72 "rasterizePDF": false,
80 TEST(PrintSettingsConversionTest, InvalidSettings) {
81 base::Value value = base::test::ParseJson("{}");
82 ASSERT_TRUE(value.is_dict());
83 EXPECT_FALSE(PrintSettingsFromJobSettings(value.GetDict()));
86 TEST(PrintSettingsConversionTest, Conversion) {
87 base::Value value = base::test::ParseJson(kPrinterSettings);
88 ASSERT_TRUE(value.is_dict());
89 auto& dict = value.GetDict();
90 std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
91 ASSERT_TRUE(settings);
92 #if BUILDFLAG(IS_CHROMEOS)
93 EXPECT_TRUE(settings->send_user_info());
94 EXPECT_EQ("username@domain.net", settings->username());
95 EXPECT_EQ("0000", settings->pin_value());
97 EXPECT_EQ(settings->dpi_horizontal(), 300);
98 EXPECT_EQ(settings->dpi_vertical(), 300);
100 dict.Set("dpiVertical", 600);
101 settings = PrintSettingsFromJobSettings(dict);
102 ASSERT_TRUE(settings);
103 EXPECT_EQ(settings->rasterize_pdf_dpi(), 150);
104 EXPECT_EQ(settings->dpi_horizontal(), 300);
105 EXPECT_EQ(settings->dpi_vertical(), 600);
107 EXPECT_TRUE(dict.Remove("dpiVertical"));
108 settings = PrintSettingsFromJobSettings(dict);
109 EXPECT_FALSE(settings);
112 TEST(PrintSettingsConversionTest, ConversionTestWithValidImageableArea) {
113 base::Value value = base::test::ParseJson(kPrinterSettingsWithImageableArea);
114 ASSERT_TRUE(value.is_dict());
115 auto& dict = value.GetDict();
116 std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
117 ASSERT_TRUE(settings);
118 EXPECT_EQ(settings->dpi_horizontal(), 300);
119 EXPECT_EQ(settings->dpi_vertical(), 300);
120 EXPECT_EQ(settings->page_setup_device_units().physical_size(),
121 gfx::Size(2480, 3508));
122 EXPECT_EQ(settings->page_setup_device_units().printable_area(),
123 gfx::Rect(0, 0, 2126, 3496));
126 TEST(PrintSettingsConversionTest, ConversionTestWithValidFlippedImageableArea) {
127 base::Value value = base::test::ParseJson(kPrinterSettingsWithImageableArea);
128 ASSERT_TRUE(value.is_dict());
129 auto& dict = value.GetDict();
130 dict.Set("landscape", true);
131 std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
132 ASSERT_TRUE(settings);
133 EXPECT_EQ(settings->page_setup_device_units().physical_size(),
134 gfx::Size(3508, 2480));
135 EXPECT_EQ(settings->page_setup_device_units().printable_area(),
136 gfx::Rect(0, 354, 3496, 2126));
139 TEST(PrintSettingsConversionTest, ConversionTestWithOutOfBoundsImageableArea) {
140 base::Value value = base::test::ParseJson(kPrinterSettingsWithImageableArea);
141 ASSERT_TRUE(value.is_dict());
142 auto& dict = value.GetDict();
143 auto* media_size_dict = dict.FindDict("mediaSize");
144 ASSERT_TRUE(media_size_dict);
145 media_size_dict->Set("imageable_area_left_microns", -500);
146 std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
147 ASSERT_TRUE(settings);
148 EXPECT_TRUE(settings->page_setup_device_units().physical_size().IsEmpty());
149 EXPECT_TRUE(settings->page_setup_device_units().printable_area().IsEmpty());
152 TEST(PrintSettingsConversionTest, ConversionTestWithMissingImageableAreaValue) {
153 base::Value value = base::test::ParseJson(kPrinterSettingsWithImageableArea);
154 ASSERT_TRUE(value.is_dict());
155 auto& dict = value.GetDict();
156 auto* media_size_dict = dict.FindDict("mediaSize");
157 ASSERT_TRUE(media_size_dict);
158 media_size_dict->Remove("imageable_area_left_microns");
159 std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
160 ASSERT_TRUE(settings);
161 EXPECT_TRUE(settings->page_setup_device_units().physical_size().IsEmpty());
162 EXPECT_TRUE(settings->page_setup_device_units().printable_area().IsEmpty());
165 TEST(PrintSettingsConversionTest, MissingDeviceName) {
166 base::Value value = base::test::ParseJson(kPrinterSettings);
167 ASSERT_TRUE(value.is_dict());
168 auto& dict = value.GetDict();
169 dict.Remove("deviceName");
170 EXPECT_FALSE(PrintSettingsFromJobSettings(dict));
173 #if BUILDFLAG(IS_CHROMEOS)
174 TEST(PrintSettingsConversionTest, DontSendUsername) {
175 base::Value value = base::test::ParseJson(kPrinterSettings);
176 ASSERT_TRUE(value.is_dict());
177 auto& dict = value.GetDict();
178 dict.Set(kSettingSendUserInfo, false);
179 std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
180 ASSERT_TRUE(settings);
181 EXPECT_FALSE(settings->send_user_info());
182 EXPECT_EQ("", settings->username());
186 #if BUILDFLAG(IS_CHROMEOS) || (BUILDFLAG(IS_LINUX) && defined(USE_CUPS))
187 TEST(PrintSettingsConversionTest, FilterNonJobSettings) {
188 base::Value value = base::test::ParseJson(kPrinterSettings);
189 ASSERT_TRUE(value.is_dict());
190 auto& dict = value.GetDict();
193 base::Value::Dict advanced_attributes;
194 advanced_attributes.Set("printer-info", "yada");
195 advanced_attributes.Set("printer-make-and-model", "yada");
196 advanced_attributes.Set("system_driverinfo", "yada");
197 advanced_attributes.Set("Foo", "Bar");
198 dict.Set(kSettingAdvancedSettings, std::move(advanced_attributes));
201 std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
202 ASSERT_TRUE(settings);
203 EXPECT_EQ(settings->advanced_settings().size(), 1u);
204 ASSERT_TRUE(base::Contains(settings->advanced_settings(), "Foo"));
205 EXPECT_EQ(settings->advanced_settings().at("Foo"), base::Value("Bar"));
207 #endif // BUILDFLAG(IS_CHROMEOS) || (BUILDFLAG(IS_LINUX) && defined(USE_CUPS))
209 } // namespace printing