test_print_backend_unittest.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. // Copyright 2020 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/backend/test_print_backend.h"
  5. #include <stdint.h>
  6. #include <string>
  7. #include <utility>
  8. #include <vector>
  9. #include "base/memory/scoped_refptr.h"
  10. #include "base/test/gtest_util.h"
  11. #include "mojo/public/cpp/test_support/test_utils.h"
  12. #include "printing/backend/mojom/print_backend.mojom.h"
  13. #include "printing/backend/print_backend.h"
  14. #include "printing/mojom/print.mojom.h"
  15. #include "testing/gmock/include/gmock/gmock-matchers.h"
  16. #include "testing/gtest/include/gtest/gtest.h"
  17. #include "ui/gfx/geometry/size.h"
  18. namespace printing {
  19. namespace {
  20. constexpr char kDefaultPrinterName[] = "default-test-printer";
  21. constexpr char kAlternatePrinterName[] = "alternate-test-printer";
  22. constexpr char kNullDataPrinterName[] = "null-data-test-printer";
  23. constexpr char kAccessDeniedPrinterName[] = "access-denied-test-printer";
  24. constexpr char kInvalidPrinterName[] = "invalid-test-printer";
  25. constexpr char kInvalidDataPrinterName[] = "invalid-data-test-printer";
  26. constexpr int kDefaultPrinterStatus = 0;
  27. constexpr int kAlternatePrinterStatus = 1;
  28. const PrinterBasicInfo kDefaultPrinterInfo(
  29. /*printer_name=*/kDefaultPrinterName,
  30. /*display_name=*/"default test printer",
  31. /*printer_description=*/"Default printer for testing.",
  32. /*printer_status=*/kDefaultPrinterStatus,
  33. /*is_default=*/true,
  34. /*options=*/PrinterBasicInfoOptions{});
  35. const PrinterBasicInfo kAlternatePrinterInfo(
  36. /*printer_name=*/kAlternatePrinterName,
  37. /*display_name=*/"alternate test printer",
  38. /*printer_description=*/"Alternate printer for testing.",
  39. /*printer_status=*/kAlternatePrinterStatus,
  40. /*is_default=*/false,
  41. /*options=*/PrinterBasicInfoOptions{});
  42. constexpr int32_t kDefaultCopiesMax = 123;
  43. constexpr int32_t kAlternateCopiesMax = 456;
  44. } // namespace
  45. class TestPrintBackendTest : public testing::Test {
  46. public:
  47. void SetUp() override {
  48. test_print_backend_ = base::MakeRefCounted<TestPrintBackend>();
  49. }
  50. void AddPrinters() {
  51. // Add some printers; only bother to set one capabilities field that will
  52. // be paid attention to in the tests as way of knowing it has provided the
  53. // real capabilities.
  54. auto caps = std::make_unique<PrinterSemanticCapsAndDefaults>();
  55. caps->copies_max = kDefaultCopiesMax;
  56. test_print_backend_->AddValidPrinter(
  57. kDefaultPrinterName, std::move(caps),
  58. std::make_unique<PrinterBasicInfo>(kDefaultPrinterInfo));
  59. caps = std::make_unique<PrinterSemanticCapsAndDefaults>();
  60. caps->copies_max = kAlternateCopiesMax;
  61. test_print_backend_->AddValidPrinter(
  62. kAlternatePrinterName, std::move(caps),
  63. std::make_unique<PrinterBasicInfo>(kAlternatePrinterInfo));
  64. test_print_backend_->AddValidPrinter(kNullDataPrinterName, /*caps=*/nullptr,
  65. /*info=*/nullptr);
  66. }
  67. void AddInvalidDataPrinter() {
  68. test_print_backend_->AddInvalidDataPrinter(kInvalidDataPrinterName);
  69. }
  70. void AddAccessDeniedPrinter() {
  71. test_print_backend_->AddAccessDeniedPrinter(kAccessDeniedPrinterName);
  72. }
  73. // Get the test print backend.
  74. TestPrintBackend* GetPrintBackend() { return test_print_backend_.get(); }
  75. private:
  76. scoped_refptr<TestPrintBackend> test_print_backend_;
  77. };
  78. TEST_F(TestPrintBackendTest, EnumeratePrinters) {
  79. const PrinterList kPrinterList{kAlternatePrinterInfo, kDefaultPrinterInfo};
  80. PrinterList printer_list;
  81. AddPrinters();
  82. EXPECT_EQ(GetPrintBackend()->EnumeratePrinters(printer_list),
  83. mojom::ResultCode::kSuccess);
  84. EXPECT_THAT(printer_list, testing::ContainerEq(kPrinterList));
  85. }
  86. TEST_F(TestPrintBackendTest, EnumeratePrintersNoneFound) {
  87. const PrinterList kPrinterList{kAlternatePrinterInfo, kDefaultPrinterInfo};
  88. PrinterList printer_list;
  89. // Should return true even when there are no printers in the environment.
  90. EXPECT_EQ(GetPrintBackend()->EnumeratePrinters(printer_list),
  91. mojom::ResultCode::kSuccess);
  92. EXPECT_TRUE(printer_list.empty());
  93. }
  94. TEST_F(TestPrintBackendTest, DefaultPrinterName) {
  95. std::string default_printer;
  96. // If no printers added then no default.
  97. ASSERT_EQ(GetPrintBackend()->GetDefaultPrinterName(default_printer),
  98. mojom::ResultCode::kSuccess);
  99. EXPECT_TRUE(default_printer.empty());
  100. // Once printers are available, should be a default.
  101. AddPrinters();
  102. ASSERT_EQ(GetPrintBackend()->GetDefaultPrinterName(default_printer),
  103. mojom::ResultCode::kSuccess);
  104. EXPECT_EQ(default_printer, kDefaultPrinterName);
  105. // Changing default should be reflected on next query.
  106. GetPrintBackend()->SetDefaultPrinterName(kAlternatePrinterName);
  107. ASSERT_EQ(GetPrintBackend()->GetDefaultPrinterName(default_printer),
  108. mojom::ResultCode::kSuccess);
  109. EXPECT_EQ(default_printer, kAlternatePrinterName);
  110. // Adding a new printer to environment which is marked as default should
  111. // automatically make it the new default.
  112. static constexpr char kNewDefaultPrinterName[] = "new-default-test-printer";
  113. auto caps = std::make_unique<PrinterSemanticCapsAndDefaults>();
  114. auto printer_info = std::make_unique<PrinterBasicInfo>();
  115. printer_info->printer_name = kNewDefaultPrinterName;
  116. printer_info->is_default = true;
  117. GetPrintBackend()->AddValidPrinter(kNewDefaultPrinterName, std::move(caps),
  118. std::move(printer_info));
  119. ASSERT_EQ(GetPrintBackend()->GetDefaultPrinterName(default_printer),
  120. mojom::ResultCode::kSuccess);
  121. EXPECT_EQ(default_printer, kNewDefaultPrinterName);
  122. // Requesting an invalid printer name to be a default should have no effect.
  123. GetPrintBackend()->SetDefaultPrinterName(kInvalidPrinterName);
  124. ASSERT_EQ(GetPrintBackend()->GetDefaultPrinterName(default_printer),
  125. mojom::ResultCode::kSuccess);
  126. EXPECT_EQ(default_printer, kNewDefaultPrinterName);
  127. // Verify that re-adding a printer that was previously the default with null
  128. // basic info results in no default printer anymore.
  129. GetPrintBackend()->AddValidPrinter(kNewDefaultPrinterName, /*caps=*/nullptr,
  130. /*info=*/nullptr);
  131. ASSERT_EQ(GetPrintBackend()->GetDefaultPrinterName(default_printer),
  132. mojom::ResultCode::kSuccess);
  133. EXPECT_TRUE(default_printer.empty());
  134. }
  135. TEST_F(TestPrintBackendTest, PrinterBasicInfo) {
  136. PrinterBasicInfo printer_info;
  137. AddPrinters();
  138. EXPECT_EQ(GetPrintBackend()->GetPrinterBasicInfo(kDefaultPrinterName,
  139. &printer_info),
  140. mojom::ResultCode::kSuccess);
  141. EXPECT_EQ(printer_info.printer_name, kDefaultPrinterName);
  142. EXPECT_EQ(printer_info.printer_status, kDefaultPrinterStatus);
  143. EXPECT_TRUE(printer_info.is_default);
  144. EXPECT_EQ(GetPrintBackend()->GetPrinterBasicInfo(kAlternatePrinterName,
  145. &printer_info),
  146. mojom::ResultCode::kSuccess);
  147. EXPECT_EQ(printer_info.printer_name, kAlternatePrinterName);
  148. EXPECT_EQ(printer_info.printer_status, kAlternatePrinterStatus);
  149. EXPECT_FALSE(printer_info.is_default);
  150. EXPECT_EQ(GetPrintBackend()->GetPrinterBasicInfo(kInvalidPrinterName,
  151. &printer_info),
  152. mojom::ResultCode::kFailed);
  153. // Changing default should be reflected on next query.
  154. GetPrintBackend()->SetDefaultPrinterName(kAlternatePrinterName);
  155. EXPECT_EQ(GetPrintBackend()->GetPrinterBasicInfo(kAlternatePrinterName,
  156. &printer_info),
  157. mojom::ResultCode::kSuccess);
  158. EXPECT_TRUE(printer_info.is_default);
  159. EXPECT_EQ(GetPrintBackend()->GetPrinterBasicInfo(kDefaultPrinterName,
  160. &printer_info),
  161. mojom::ResultCode::kSuccess);
  162. EXPECT_FALSE(printer_info.is_default);
  163. // Printers added with null basic info fail to get data on a query.
  164. EXPECT_EQ(GetPrintBackend()->GetPrinterBasicInfo(kNullDataPrinterName,
  165. &printer_info),
  166. mojom::ResultCode::kFailed);
  167. // Verify that (re)adding a printer with null basic info results in a failure
  168. // the next time when trying to get the basic info.
  169. GetPrintBackend()->AddValidPrinter(kAlternatePrinterName, /*caps=*/nullptr,
  170. /*info=*/nullptr);
  171. EXPECT_EQ(GetPrintBackend()->GetPrinterBasicInfo(kAlternatePrinterName,
  172. &printer_info),
  173. mojom::ResultCode::kFailed);
  174. }
  175. TEST_F(TestPrintBackendTest, PrinterBasicInfoAccessDenied) {
  176. PrinterBasicInfo printer_info;
  177. AddAccessDeniedPrinter();
  178. EXPECT_EQ(GetPrintBackend()->GetPrinterBasicInfo(kAccessDeniedPrinterName,
  179. &printer_info),
  180. mojom::ResultCode::kAccessDenied);
  181. }
  182. // Demonstrate that a printer might be able to present data considered to be
  183. // invalid, which becomes detectable when it undergoes Mojom message
  184. // validation.
  185. TEST_F(TestPrintBackendTest, PrinterBasicInfoInvalidData) {
  186. PrinterBasicInfo printer_info;
  187. AddInvalidDataPrinter();
  188. EXPECT_EQ(GetPrintBackend()->GetPrinterBasicInfo(kInvalidDataPrinterName,
  189. &printer_info),
  190. mojom::ResultCode::kSuccess);
  191. PrinterBasicInfo output;
  192. EXPECT_FALSE(mojo::test::SerializeAndDeserialize<mojom::PrinterBasicInfo>(
  193. printer_info, output));
  194. }
  195. TEST_F(TestPrintBackendTest, GetPrinterSemanticCapsAndDefaults) {
  196. PrinterSemanticCapsAndDefaults caps;
  197. // Should fail when there are no printers in the environment.
  198. EXPECT_EQ(GetPrintBackend()->GetPrinterSemanticCapsAndDefaults(
  199. kDefaultPrinterName, &caps),
  200. mojom::ResultCode::kFailed);
  201. AddPrinters();
  202. EXPECT_EQ(GetPrintBackend()->GetPrinterSemanticCapsAndDefaults(
  203. kDefaultPrinterName, &caps),
  204. mojom::ResultCode::kSuccess);
  205. EXPECT_EQ(caps.copies_max, kDefaultCopiesMax);
  206. EXPECT_EQ(GetPrintBackend()->GetPrinterSemanticCapsAndDefaults(
  207. kAlternatePrinterName, &caps),
  208. mojom::ResultCode::kSuccess);
  209. EXPECT_EQ(caps.copies_max, kAlternateCopiesMax);
  210. EXPECT_EQ(GetPrintBackend()->GetPrinterSemanticCapsAndDefaults(
  211. kInvalidPrinterName, &caps),
  212. mojom::ResultCode::kFailed);
  213. // Printers added with null capabilities fail to get data on a query.
  214. EXPECT_EQ(GetPrintBackend()->GetPrinterSemanticCapsAndDefaults(
  215. kNullDataPrinterName, &caps),
  216. mojom::ResultCode::kFailed);
  217. // Verify that (re)adding a printer with null capabilities results in a
  218. // failure the next time when trying to get capabilities.
  219. GetPrintBackend()->AddValidPrinter(kAlternatePrinterName, /*caps=*/nullptr,
  220. /*info=*/nullptr);
  221. EXPECT_EQ(GetPrintBackend()->GetPrinterSemanticCapsAndDefaults(
  222. kAlternatePrinterName, &caps),
  223. mojom::ResultCode::kFailed);
  224. }
  225. TEST_F(TestPrintBackendTest, GetPrinterSemanticCapsAndDefaultsAccessDenied) {
  226. PrinterSemanticCapsAndDefaults caps;
  227. AddAccessDeniedPrinter();
  228. EXPECT_EQ(GetPrintBackend()->GetPrinterSemanticCapsAndDefaults(
  229. kAccessDeniedPrinterName, &caps),
  230. mojom::ResultCode::kAccessDenied);
  231. }
  232. TEST_F(TestPrintBackendTest, IsValidPrinter) {
  233. PrinterSemanticCapsAndDefaults caps;
  234. // Should fail when there are no printers in the environment.
  235. EXPECT_FALSE(GetPrintBackend()->IsValidPrinter(kDefaultPrinterName));
  236. AddPrinters();
  237. EXPECT_TRUE(GetPrintBackend()->IsValidPrinter(kDefaultPrinterName));
  238. EXPECT_TRUE(GetPrintBackend()->IsValidPrinter(kAlternatePrinterName));
  239. EXPECT_FALSE(GetPrintBackend()->IsValidPrinter(kInvalidPrinterName));
  240. // Verify that still shows as valid printer even if basic info and
  241. // capabilities were originally null.
  242. EXPECT_TRUE(GetPrintBackend()->IsValidPrinter(kNullDataPrinterName));
  243. // Verify that (re)adding a printer with null info and capabilities still
  244. // shows as valid.
  245. GetPrintBackend()->AddValidPrinter(kAlternatePrinterName, /*caps=*/nullptr,
  246. /*info=*/nullptr);
  247. EXPECT_TRUE(GetPrintBackend()->IsValidPrinter(kAlternatePrinterName));
  248. }
  249. } // namespace printing