print_settings_conversion_unittest.cc 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. // Copyright 2019 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. #include "printing/print_settings_conversion.h"
  5. #include "base/containers/contains.h"
  6. #include "base/test/values_test_util.h"
  7. #include "base/values.h"
  8. #include "build/build_config.h"
  9. #include "printing/print_settings.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace printing {
  12. namespace {
  13. const char kPrinterSettings[] = R"({
  14. "headerFooterEnabled": true,
  15. "title": "Test Doc",
  16. "url": "http://localhost/",
  17. "shouldPrintBackgrounds": false,
  18. "shouldPrintSelectionOnly": false,
  19. "mediaSize": {
  20. "height_microns": 297000,
  21. "width_microns": 210000
  22. },
  23. "marginsType": 0,
  24. "pageRange": [{
  25. "from": 1,
  26. "to": 1
  27. }],
  28. "collate": false,
  29. "copies": 1,
  30. "color": 2,
  31. "duplex": 0,
  32. "landscape": false,
  33. "deviceName": "printer",
  34. "scaleFactor": 100,
  35. "rasterizePDF": false,
  36. "rasterizePdfDpi": 150,
  37. "pagesPerSheet": 1,
  38. "dpiHorizontal": 300,
  39. "dpiVertical": 300,
  40. "previewModifiable": true,
  41. "sendUserInfo": true,
  42. "username": "username@domain.net",
  43. "pinValue": "0000"
  44. })";
  45. const char kPrinterSettingsWithImageableArea[] = R"({
  46. "headerFooterEnabled": false,
  47. "title": "Test Doc",
  48. "url": "http://localhost/",
  49. "shouldPrintBackgrounds": false,
  50. "shouldPrintSelectionOnly": false,
  51. "mediaSize": {
  52. "height_microns": 297000,
  53. "imageable_area_bottom_microns": 1000,
  54. "imageable_area_left_microns": 0,
  55. "imageable_area_right_microns": 180000,
  56. "imageable_area_top_microns": 297000,
  57. "width_microns": 210000
  58. },
  59. "collate": false,
  60. "copies": 1,
  61. "color": 2,
  62. "duplex": 0,
  63. "landscape": false,
  64. "deviceName": "printer",
  65. "scaleFactor": 100,
  66. "rasterizePDF": false,
  67. "pagesPerSheet": 1,
  68. "dpiHorizontal": 300,
  69. "dpiVertical": 300,
  70. })";
  71. } // namespace
  72. TEST(PrintSettingsConversionTest, InvalidSettings) {
  73. base::Value value = base::test::ParseJson("{}");
  74. ASSERT_TRUE(value.is_dict());
  75. EXPECT_FALSE(PrintSettingsFromJobSettings(value.GetDict()));
  76. }
  77. TEST(PrintSettingsConversionTest, Conversion) {
  78. base::Value value = base::test::ParseJson(kPrinterSettings);
  79. ASSERT_TRUE(value.is_dict());
  80. auto& dict = value.GetDict();
  81. std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
  82. ASSERT_TRUE(settings);
  83. #if BUILDFLAG(IS_CHROMEOS)
  84. EXPECT_TRUE(settings->send_user_info());
  85. EXPECT_EQ("username@domain.net", settings->username());
  86. EXPECT_EQ("0000", settings->pin_value());
  87. #endif
  88. EXPECT_EQ(settings->dpi_horizontal(), 300);
  89. EXPECT_EQ(settings->dpi_vertical(), 300);
  90. dict.Set("dpiVertical", 600);
  91. settings = PrintSettingsFromJobSettings(dict);
  92. ASSERT_TRUE(settings);
  93. EXPECT_EQ(settings->rasterize_pdf_dpi(), 150);
  94. EXPECT_EQ(settings->dpi_horizontal(), 300);
  95. EXPECT_EQ(settings->dpi_vertical(), 600);
  96. EXPECT_TRUE(dict.Remove("dpiVertical"));
  97. settings = PrintSettingsFromJobSettings(dict);
  98. EXPECT_FALSE(settings);
  99. }
  100. TEST(PrintSettingsConversionTest, ConversionTestWithValidImageableArea) {
  101. base::Value value = base::test::ParseJson(kPrinterSettingsWithImageableArea);
  102. ASSERT_TRUE(value.is_dict());
  103. auto& dict = value.GetDict();
  104. std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
  105. ASSERT_TRUE(settings);
  106. EXPECT_EQ(settings->dpi_horizontal(), 300);
  107. EXPECT_EQ(settings->dpi_vertical(), 300);
  108. EXPECT_EQ(settings->page_setup_device_units().physical_size(),
  109. gfx::Size(2480, 3508));
  110. EXPECT_EQ(settings->page_setup_device_units().printable_area(),
  111. gfx::Rect(0, 0, 2126, 3496));
  112. }
  113. TEST(PrintSettingsConversionTest, ConversionTestWithValidFlippedImageableArea) {
  114. base::Value value = base::test::ParseJson(kPrinterSettingsWithImageableArea);
  115. ASSERT_TRUE(value.is_dict());
  116. auto& dict = value.GetDict();
  117. dict.Set("landscape", true);
  118. std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
  119. ASSERT_TRUE(settings);
  120. EXPECT_EQ(settings->page_setup_device_units().physical_size(),
  121. gfx::Size(3508, 2480));
  122. EXPECT_EQ(settings->page_setup_device_units().printable_area(),
  123. gfx::Rect(0, 354, 3496, 2126));
  124. }
  125. TEST(PrintSettingsConversionTest, ConversionTestWithOutOfBoundsImageableArea) {
  126. base::Value value = base::test::ParseJson(kPrinterSettingsWithImageableArea);
  127. ASSERT_TRUE(value.is_dict());
  128. auto& dict = value.GetDict();
  129. auto* media_size_dict = dict.FindDict("mediaSize");
  130. ASSERT_TRUE(media_size_dict);
  131. media_size_dict->Set("imageable_area_left_microns", -500);
  132. std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
  133. ASSERT_TRUE(settings);
  134. EXPECT_TRUE(settings->page_setup_device_units().physical_size().IsEmpty());
  135. EXPECT_TRUE(settings->page_setup_device_units().printable_area().IsEmpty());
  136. }
  137. TEST(PrintSettingsConversionTest, ConversionTestWithMissingImageableAreaValue) {
  138. base::Value value = base::test::ParseJson(kPrinterSettingsWithImageableArea);
  139. ASSERT_TRUE(value.is_dict());
  140. auto& dict = value.GetDict();
  141. auto* media_size_dict = dict.FindDict("mediaSize");
  142. ASSERT_TRUE(media_size_dict);
  143. media_size_dict->Remove("imageable_area_left_microns");
  144. std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
  145. ASSERT_TRUE(settings);
  146. EXPECT_TRUE(settings->page_setup_device_units().physical_size().IsEmpty());
  147. EXPECT_TRUE(settings->page_setup_device_units().printable_area().IsEmpty());
  148. }
  149. TEST(PrintSettingsConversionTest, MissingDeviceName) {
  150. base::Value value = base::test::ParseJson(kPrinterSettings);
  151. ASSERT_TRUE(value.is_dict());
  152. auto& dict = value.GetDict();
  153. dict.Remove("deviceName");
  154. EXPECT_FALSE(PrintSettingsFromJobSettings(dict));
  155. }
  156. #if BUILDFLAG(IS_CHROMEOS)
  157. TEST(PrintSettingsConversionTest, DontSendUsername) {
  158. base::Value value = base::test::ParseJson(kPrinterSettings);
  159. ASSERT_TRUE(value.is_dict());
  160. auto& dict = value.GetDict();
  161. dict.Set(kSettingSendUserInfo, false);
  162. std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
  163. ASSERT_TRUE(settings);
  164. EXPECT_FALSE(settings->send_user_info());
  165. EXPECT_EQ("", settings->username());
  166. }
  167. #endif
  168. #if BUILDFLAG(IS_CHROMEOS) || (BUILDFLAG(IS_LINUX) && defined(USE_CUPS))
  169. TEST(PrintSettingsConversionTest, FilterNonJobSettings) {
  170. base::Value value = base::test::ParseJson(kPrinterSettings);
  171. ASSERT_TRUE(value.is_dict());
  172. auto& dict = value.GetDict();
  173. {
  174. base::Value::Dict advanced_attributes;
  175. advanced_attributes.Set("printer-info", "yada");
  176. advanced_attributes.Set("printer-make-and-model", "yada");
  177. advanced_attributes.Set("system_driverinfo", "yada");
  178. advanced_attributes.Set("Foo", "Bar");
  179. dict.Set(kSettingAdvancedSettings, std::move(advanced_attributes));
  180. }
  181. std::unique_ptr<PrintSettings> settings = PrintSettingsFromJobSettings(dict);
  182. ASSERT_TRUE(settings);
  183. EXPECT_EQ(settings->advanced_settings().size(), 1u);
  184. ASSERT_TRUE(base::Contains(settings->advanced_settings(), "Foo"));
  185. EXPECT_EQ(settings->advanced_settings().at("Foo"), base::Value("Bar"));
  186. }
  187. #endif // BUILDFLAG(IS_CHROMEOS) || (BUILDFLAG(IS_LINUX) && defined(USE_CUPS))
  188. } // namespace printing