cloud_print_cdd_conversion_unittest.cc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. // Copyright 2022 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 "components/printing/common/cloud_print_cdd_conversion.h"
  5. #include "base/test/values_test_util.h"
  6. #include "base/values.h"
  7. #include "printing/backend/print_backend.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. namespace cloud_print {
  10. namespace {
  11. constexpr char kKeyPrinter[] = "printer";
  12. constexpr char kKeyVersion[] = "version";
  13. constexpr char kValueVersion[] = "1.0";
  14. constexpr char kExpectedCollateDefaultTrue[] = R"json({
  15. })json";
  16. constexpr char kExpectedCollateDefaultFalse[] = R"json({
  17. "default": false
  18. })json";
  19. constexpr char kExpectedColor[] = R"json({
  20. "option": [
  21. {
  22. "is_default": true,
  23. "type": "STANDARD_COLOR",
  24. "vendor_id": "9"
  25. }, {
  26. "type": "STANDARD_MONOCHROME",
  27. "vendor_id": "8"
  28. }
  29. ]})json";
  30. constexpr char kExpectedCopies[] = R"json({
  31. "default": 1,
  32. "max": 123
  33. })json";
  34. constexpr char kExpectedDpi[] = R"json({
  35. "option": [
  36. {
  37. "horizontal_dpi": 600,
  38. "is_default": true,
  39. "vertical_dpi": 600
  40. }, {
  41. "horizontal_dpi": 1200,
  42. "vertical_dpi": 1200
  43. }, {
  44. "horizontal_dpi": 1200,
  45. "vertical_dpi": 600
  46. }
  47. ]})json";
  48. constexpr char kExpectedDuplex[] = R"json({
  49. "option": [
  50. {
  51. "is_default": true,
  52. "type": "NO_DUPLEX"
  53. }, {
  54. "type": "LONG_EDGE"
  55. }, {
  56. "type": "SHORT_EDGE"
  57. }
  58. ]})json";
  59. constexpr char kExpectedMediaSize[] = R"json({
  60. "option": [
  61. {
  62. "custom_display_name": "A4",
  63. "height_microns": 7016,
  64. "vendor_id": "12",
  65. "width_microns": 4961
  66. }, {
  67. "custom_display_name": "Letter",
  68. "height_microns": 6600,
  69. "is_default": true,
  70. "vendor_id": "45",
  71. "width_microns": 5100
  72. }, {
  73. "custom_display_name": "A3",
  74. "height_microns": 9921,
  75. "vendor_id": "67",
  76. "width_microns": 7016
  77. }, {
  78. "custom_display_name": "Ledger",
  79. "height_microns": 10200,
  80. "vendor_id": "89",
  81. "width_microns": 6600
  82. }
  83. ]})json";
  84. constexpr char kExpectedPageOrientation[] = R"json({
  85. "option": [
  86. {
  87. "is_default": true,
  88. "type": "PORTRAIT"
  89. }, {
  90. "type": "LANDSCAPE"
  91. }, {
  92. "type": "AUTO"
  93. }
  94. ]})json";
  95. constexpr char kExpectedSupportedContentType[] = R"json([
  96. {
  97. "content_type": "application/pdf"
  98. }
  99. ])json";
  100. #if BUILDFLAG(IS_CHROMEOS)
  101. constexpr char kExpectedPinSupportedTrue[] = R"json({
  102. "supported": true
  103. })json";
  104. constexpr char kExpectedPinSupportedFalse[] = R"json({
  105. "supported": false
  106. })json";
  107. constexpr char kExpectedAdvancedCapabilities[] = R"json([
  108. {
  109. "display_name": "Advanced Capability #1 (bool)",
  110. "id": "advanced_cap_bool",
  111. "type": "TYPED_VALUE",
  112. "typed_value_cap": {
  113. "value_type": "BOOLEAN"
  114. }
  115. }, {
  116. "display_name": "Advanced Capability #2 (double)",
  117. "id": "advanced_cap_double",
  118. "select_cap": {
  119. "option": [ {
  120. "display_name": "Advanced Capability #1",
  121. "value": "adv_cap_val_1"
  122. }, {
  123. "display_name": "Advanced Capability #2",
  124. "value": "adv_cap_val_2"
  125. }, {
  126. "display_name": "Advanced Capability #3",
  127. "value": "adv_cap_val_3"
  128. } ]
  129. },
  130. "type": "SELECT"
  131. }
  132. ])json";
  133. #endif // BUILDFLAG(IS_CHROMEOS)
  134. #if BUILDFLAG(IS_WIN)
  135. constexpr char kExpectedPageOutputQuality[] = R"json([
  136. {
  137. "display_name": "Page output quality",
  138. "id": "page_output_quality",
  139. "select_cap": {
  140. "option": [ {
  141. "display_name": "Normal",
  142. "value": "ns0000:Normal"
  143. }, {
  144. "display_name": "Draft",
  145. "value": "ns0000:Draft",
  146. "is_default": true
  147. }, {
  148. "display_name": "Custom Settings",
  149. "value": "ns0000:AdvancedSetting"
  150. } ]
  151. },
  152. "type": "SELECT"
  153. }
  154. ])json";
  155. constexpr char kExpectedPageOutputQualityNullDefault[] = R"json([
  156. {
  157. "display_name": "Page output quality",
  158. "id": "page_output_quality",
  159. "select_cap": {
  160. "option": [ {
  161. "display_name": "Normal",
  162. "value": "ns0000:Normal"
  163. }, {
  164. "display_name": "Draft",
  165. "value": "ns0000:Draft"
  166. }, {
  167. "display_name": "Custom Settings",
  168. "value": "ns0000:AdvancedSetting"
  169. } ]
  170. },
  171. "type": "SELECT"
  172. }
  173. ])json";
  174. #endif // BUILDFLAG(IS_WIN)
  175. const printing::PrinterSemanticCapsAndDefaults::Paper kPaperA3{
  176. /*display_name=*/"A3", /*vendor_id=*/"67",
  177. /*size_um=*/gfx::Size(7016, 9921)};
  178. const printing::PrinterSemanticCapsAndDefaults::Paper kPaperA4{
  179. /*display_name=*/"A4", /*vendor_id=*/"12",
  180. /*size_um=*/gfx::Size(4961, 7016)};
  181. const printing::PrinterSemanticCapsAndDefaults::Paper kPaperLetter{
  182. /*display_name=*/"Letter", /*vendor_id=*/"45",
  183. /*size_um=*/gfx::Size(5100, 6600)};
  184. const printing::PrinterSemanticCapsAndDefaults::Paper kPaperLedger{
  185. /*display_name=*/"Ledger", /*vendor_id=*/"89",
  186. /*size_um=*/gfx::Size(6600, 10200)};
  187. #if BUILDFLAG(IS_CHROMEOS)
  188. const printing::AdvancedCapability kAdvancedCapability1(
  189. /*name=*/"advanced_cap_bool",
  190. /*display_name=*/"Advanced Capability #1 (bool)",
  191. /*type=*/printing::AdvancedCapability::Type::kBoolean,
  192. /*default_value=*/"true",
  193. /*values=*/{});
  194. const printing::AdvancedCapability kAdvancedCapability2(
  195. /*name=*/"advanced_cap_double",
  196. /*display_name=*/"Advanced Capability #2 (double)",
  197. /*type=*/printing::AdvancedCapability::Type::kFloat,
  198. /*default_value=*/"3.14159",
  199. /*values=*/
  200. {
  201. printing::AdvancedCapabilityValue(
  202. /*name=*/"adv_cap_val_1",
  203. /*display_name=*/"Advanced Capability #1"),
  204. printing::AdvancedCapabilityValue(
  205. /*name=*/"adv_cap_val_2",
  206. /*display_name=*/"Advanced Capability #2"),
  207. printing::AdvancedCapabilityValue(
  208. /*name=*/"adv_cap_val_3",
  209. /*display_name=*/"Advanced Capability #3"),
  210. });
  211. const printing::AdvancedCapabilities kAdvancedCapabilities{
  212. kAdvancedCapability1, kAdvancedCapability2};
  213. #endif // BUILDFLAG(IS_CHROMEOS)
  214. #if BUILDFLAG(IS_WIN)
  215. const printing::PageOutputQuality
  216. kPageOutputQuality(/*qualities=*/
  217. {
  218. printing::PageOutputQualityAttribute(
  219. /*display_name=*/"Normal",
  220. /*name=*/"ns0000:Normal"),
  221. printing::PageOutputQualityAttribute(
  222. /*display_name=*/"Draft",
  223. /*name=*/"ns0000:Draft"),
  224. printing::PageOutputQualityAttribute(
  225. /*display_name=*/"Custom Settings",
  226. /*name=*/"ns0000:AdvancedSetting"),
  227. },
  228. /*default_quality=*/"ns0000:Draft");
  229. #endif // BUILDFLAG(IS_WIN)
  230. constexpr bool kCollateCapable = true;
  231. constexpr bool kCollateDefault = true;
  232. constexpr int32_t kCopiesMax = 123;
  233. const std::vector<printing::mojom::DuplexMode> kDuplexModes{
  234. printing::mojom::DuplexMode::kSimplex,
  235. printing::mojom::DuplexMode::kLongEdge,
  236. printing::mojom::DuplexMode::kShortEdge};
  237. constexpr printing::mojom::DuplexMode kDuplexDefault =
  238. printing::mojom::DuplexMode::kSimplex;
  239. constexpr bool kColorChangeable = true;
  240. constexpr bool kColorDefault = true;
  241. constexpr printing::mojom::ColorModel kColorModel =
  242. printing::mojom::ColorModel::kRGB;
  243. constexpr printing::mojom::ColorModel kBwModel =
  244. printing::mojom::ColorModel::kGrayscale;
  245. const printing::PrinterSemanticCapsAndDefaults::Papers kPapers{kPaperA4,
  246. kPaperLetter};
  247. const printing::PrinterSemanticCapsAndDefaults::Papers kUserDefinedPapers{
  248. kPaperA3, kPaperLedger};
  249. const printing::PrinterSemanticCapsAndDefaults::Paper kDefaultPaper =
  250. kPaperLetter;
  251. constexpr gfx::Size kDpi600(600, 600);
  252. constexpr gfx::Size kDpi1200(1200, 1200);
  253. constexpr gfx::Size kDpi1200x600(1200, 600);
  254. const std::vector<gfx::Size> kDpis{kDpi600, kDpi1200, kDpi1200x600};
  255. constexpr gfx::Size kDefaultDpi = kDpi600;
  256. printing::PrinterSemanticCapsAndDefaults
  257. GenerateSamplePrinterSemanticCapsAndDefaults() {
  258. printing::PrinterSemanticCapsAndDefaults caps;
  259. caps.collate_capable = kCollateCapable;
  260. caps.collate_default = kCollateDefault;
  261. caps.copies_max = kCopiesMax;
  262. caps.duplex_modes = kDuplexModes;
  263. caps.duplex_default = kDuplexDefault;
  264. caps.color_changeable = kColorChangeable;
  265. caps.color_default = kColorDefault;
  266. caps.color_model = kColorModel;
  267. caps.bw_model = kBwModel;
  268. caps.papers = kPapers;
  269. caps.user_defined_papers = kUserDefinedPapers;
  270. caps.default_paper = kPaperLetter;
  271. caps.dpis = kDpis;
  272. caps.default_dpi = kDefaultDpi;
  273. return caps;
  274. }
  275. const base::Value::Dict* GetPrinterDict(const base::Value& caps_value) {
  276. const base::Value::Dict* caps_dict = caps_value.GetIfDict();
  277. if (!caps_dict || !caps_dict->contains(kKeyVersion) ||
  278. caps_dict->size() != 2u) {
  279. return nullptr;
  280. }
  281. base::ExpectDictStringValue(kValueVersion, *caps_dict, kKeyVersion);
  282. return caps_dict->FindDict(kKeyPrinter);
  283. }
  284. } // namespace
  285. TEST(CloudPrintCddConversionTest, ValidCloudPrintCddConversion) {
  286. const printing::PrinterSemanticCapsAndDefaults input =
  287. GenerateSamplePrinterSemanticCapsAndDefaults();
  288. const base::Value output = PrinterSemanticCapsAndDefaultsToCdd(input);
  289. const base::Value::Dict* printer_dict = GetPrinterDict(output);
  290. ASSERT_TRUE(printer_dict);
  291. #if BUILDFLAG(IS_CHROMEOS)
  292. ASSERT_EQ(9u, printer_dict->size());
  293. #else
  294. ASSERT_EQ(8u, printer_dict->size());
  295. #endif // BUILDFLAG(IS_CHROMEOS)
  296. base::ExpectDictValue(base::test::ParseJson(kExpectedCollateDefaultTrue),
  297. *printer_dict, "collate");
  298. base::ExpectDictValue(base::test::ParseJson(kExpectedColor), *printer_dict,
  299. "color");
  300. base::ExpectDictValue(base::test::ParseJson(kExpectedCopies), *printer_dict,
  301. "copies");
  302. base::ExpectDictValue(base::test::ParseJson(kExpectedDpi), *printer_dict,
  303. "dpi");
  304. base::ExpectDictValue(base::test::ParseJson(kExpectedDuplex), *printer_dict,
  305. "duplex");
  306. base::ExpectDictValue(base::test::ParseJson(kExpectedMediaSize),
  307. *printer_dict, "media_size");
  308. base::ExpectDictValue(base::test::ParseJson(kExpectedPageOrientation),
  309. *printer_dict, "page_orientation");
  310. base::ExpectDictValue(base::test::ParseJson(kExpectedSupportedContentType),
  311. *printer_dict, "supported_content_type");
  312. #if BUILDFLAG(IS_CHROMEOS)
  313. base::ExpectDictValue(base::test::ParseJson(kExpectedPinSupportedFalse),
  314. *printer_dict, "pin");
  315. #endif // BUILDFLAG(IS_CHROMEOS)
  316. }
  317. TEST(CloudPrintCddConversionTest, MissingEntry) {
  318. printing::PrinterSemanticCapsAndDefaults input =
  319. GenerateSamplePrinterSemanticCapsAndDefaults();
  320. input.collate_capable = false;
  321. input.collate_default = false;
  322. const base::Value output = PrinterSemanticCapsAndDefaultsToCdd(input);
  323. const base::Value::Dict* printer_dict = GetPrinterDict(output);
  324. ASSERT_TRUE(printer_dict);
  325. #if BUILDFLAG(IS_CHROMEOS)
  326. ASSERT_EQ(8u, printer_dict->size());
  327. #else
  328. ASSERT_EQ(7u, printer_dict->size());
  329. #endif // BUILDFLAG(IS_CHROMEOS)
  330. ASSERT_FALSE(printer_dict->contains("collate"));
  331. }
  332. TEST(CloudPrintCddConversionTest, CollateDefaultIsFalse) {
  333. printing::PrinterSemanticCapsAndDefaults input =
  334. GenerateSamplePrinterSemanticCapsAndDefaults();
  335. input.collate_capable = true;
  336. input.collate_default = false;
  337. const base::Value output = PrinterSemanticCapsAndDefaultsToCdd(input);
  338. const base::Value::Dict* printer_dict = GetPrinterDict(output);
  339. ASSERT_TRUE(printer_dict);
  340. #if BUILDFLAG(IS_CHROMEOS)
  341. ASSERT_EQ(9u, printer_dict->size());
  342. #else
  343. ASSERT_EQ(8u, printer_dict->size());
  344. #endif // BUILDFLAG(IS_CHROMEOS)
  345. base::ExpectDictValue(base::test::ParseJson(kExpectedCollateDefaultFalse),
  346. *printer_dict, "collate");
  347. }
  348. #if BUILDFLAG(IS_CHROMEOS)
  349. TEST(CloudPrintCddConversionTest, PinAndAdvancedCapabilities) {
  350. printing::PrinterSemanticCapsAndDefaults input =
  351. GenerateSamplePrinterSemanticCapsAndDefaults();
  352. input.pin_supported = true;
  353. input.advanced_capabilities = kAdvancedCapabilities;
  354. const base::Value output = PrinterSemanticCapsAndDefaultsToCdd(input);
  355. const base::Value::Dict* printer_dict = GetPrinterDict(output);
  356. ASSERT_TRUE(printer_dict);
  357. ASSERT_EQ(10u, printer_dict->size());
  358. base::ExpectDictValue(base::test::ParseJson(kExpectedPinSupportedTrue),
  359. *printer_dict, "pin");
  360. base::ExpectDictValue(base::test::ParseJson(kExpectedAdvancedCapabilities),
  361. *printer_dict, "vendor_capability");
  362. }
  363. #endif // BUILDFLAG(IS_CHROMEOS)
  364. #if BUILDFLAG(IS_WIN)
  365. TEST(CloudPrintCddConversionTest, PageOutputQualityWithDefaultQuality) {
  366. printing::PrinterSemanticCapsAndDefaults input =
  367. GenerateSamplePrinterSemanticCapsAndDefaults();
  368. input.page_output_quality = kPageOutputQuality;
  369. const base::Value output = PrinterSemanticCapsAndDefaultsToCdd(input);
  370. const base::Value::Dict* printer_dict = GetPrinterDict(output);
  371. ASSERT_TRUE(printer_dict);
  372. ASSERT_EQ(9u, printer_dict->size());
  373. base::ExpectDictValue(base::test::ParseJson(kExpectedPageOutputQuality),
  374. *printer_dict, "vendor_capability");
  375. }
  376. TEST(CloudPrintCddConversionTest, PageOutputQualityNullDefaultQuality) {
  377. printing::PrinterSemanticCapsAndDefaults input =
  378. GenerateSamplePrinterSemanticCapsAndDefaults();
  379. input.page_output_quality = kPageOutputQuality;
  380. input.page_output_quality->default_quality = absl::nullopt;
  381. const base::Value output = PrinterSemanticCapsAndDefaultsToCdd(input);
  382. const base::Value::Dict* printer_dict = GetPrinterDict(output);
  383. ASSERT_TRUE(printer_dict);
  384. ASSERT_EQ(9u, printer_dict->size());
  385. base::ExpectDictValue(
  386. base::test::ParseJson(kExpectedPageOutputQualityNullDefault),
  387. *printer_dict, "vendor_capability");
  388. }
  389. #endif // BUILDFLAG(IS_WIN)
  390. } // namespace cloud_print