Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1418)

Side by Side Diff: chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc

Issue 1148383002: Add onGetUsbPrinterInfoRequested event to printerProvider API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <queue>
5 #include <string> 6 #include <string>
6 #include <vector>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/files/scoped_temp_dir.h" 10 #include "base/files/scoped_temp_dir.h"
11 #include "base/json/json_string_value_serializer.h" 11 #include "base/json/json_string_value_serializer.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "base/strings/string16.h" 15 #include "base/strings/string16.h"
16 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
17 #include "base/values.h" 17 #include "base/values.h"
18 #include "chrome/browser/local_discovery/pwg_raster_converter.h" 18 #include "chrome/browser/local_discovery/pwg_raster_converter.h"
19 #include "chrome/browser/ui/webui/print_preview/extension_printer_handler.h" 19 #include "chrome/browser/ui/webui/print_preview/extension_printer_handler.h"
20 #include "chrome/test/base/testing_profile.h" 20 #include "chrome/test/base/testing_profile.h"
21 #include "content/public/test/test_browser_thread_bundle.h" 21 #include "content/public/test/test_browser_thread_bundle.h"
22 #include "extensions/browser/api/printer_provider/printer_provider_api.h" 22 #include "extensions/browser/api/printer_provider/printer_provider_api.h"
23 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h " 23 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h "
24 #include "extensions/browser/api/printer_provider/printer_provider_print_job.h" 24 #include "extensions/browser/api/printer_provider/printer_provider_print_job.h"
25 #include "extensions/common/value_builder.h"
25 #include "printing/pdf_render_settings.h" 26 #include "printing/pdf_render_settings.h"
26 #include "printing/pwg_raster_settings.h" 27 #include "printing/pwg_raster_settings.h"
27 #include "printing/units.h" 28 #include "printing/units.h"
28 #include "testing/gtest/include/gtest/gtest.h" 29 #include "testing/gtest/include/gtest/gtest.h"
29 #include "ui/gfx/geometry/size.h" 30 #include "ui/gfx/geometry/size.h"
30 31
32 using extensions::DictionaryBuilder;
31 using extensions::PrinterProviderAPI; 33 using extensions::PrinterProviderAPI;
32 using extensions::PrinterProviderPrintJob; 34 using extensions::PrinterProviderPrintJob;
33 using local_discovery::PWGRasterConverter; 35 using local_discovery::PWGRasterConverter;
34 36
35 namespace { 37 namespace {
36 38
37 // Printer id used for requests in tests. 39 // Printer id used for requests in tests.
38 const char kPrinterId[] = "printer_id"; 40 const char kPrinterId[] = "printer_id";
39 41
40 // Printer list used a result for getPrinters. 42 // Printer list used a result for getPrinters.
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 void RecordPrintResult(size_t* call_count, 155 void RecordPrintResult(size_t* call_count,
154 bool* success_out, 156 bool* success_out,
155 std::string* status_out, 157 std::string* status_out,
156 bool success, 158 bool success,
157 const std::string& status) { 159 const std::string& status) {
158 ++(*call_count); 160 ++(*call_count);
159 *success_out = success; 161 *success_out = success;
160 *status_out = status; 162 *status_out = status;
161 } 163 }
162 164
165 // Used as a callback to StartGrantUsbPrinterAccess in tests.
166 // Increases |*call_count| and records the value returned.
167 void RecordPrinterInfo(size_t* call_count,
168 scoped_ptr<base::DictionaryValue>* printer_info_out,
169 const base::DictionaryValue& printer_info) {
170 ++(*call_count);
171 printer_info_out->reset(printer_info.DeepCopy());
172 }
173
163 // Converts JSON string to base::ListValue object. 174 // Converts JSON string to base::ListValue object.
164 // On failure, returns NULL and fills |*error| string. 175 // On failure, returns NULL and fills |*error| string.
165 scoped_ptr<base::ListValue> GetJSONAsListValue(const std::string& json, 176 scoped_ptr<base::ListValue> GetJSONAsListValue(const std::string& json,
166 std::string* error) { 177 std::string* error) {
167 scoped_ptr<base::Value> deserialized( 178 scoped_ptr<base::Value> deserialized(
168 JSONStringValueDeserializer(json).Deserialize(NULL, error)); 179 JSONStringValueDeserializer(json).Deserialize(NULL, error));
169 if (!deserialized) 180 if (!deserialized)
170 return scoped_ptr<base::ListValue>(); 181 return scoped_ptr<base::ListValue>();
171 base::ListValue* list = nullptr; 182 base::ListValue* list = nullptr;
172 if (!deserialized->GetAsList(&list)) { 183 if (!deserialized->GetAsList(&list)) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 // Fake PrinterProviderAPI used in tests. 282 // Fake PrinterProviderAPI used in tests.
272 // It caches requests issued to API and exposes methods to trigger their 283 // It caches requests issued to API and exposes methods to trigger their
273 // callbacks. 284 // callbacks.
274 class FakePrinterProviderAPI : public PrinterProviderAPI { 285 class FakePrinterProviderAPI : public PrinterProviderAPI {
275 public: 286 public:
276 FakePrinterProviderAPI() = default; 287 FakePrinterProviderAPI() = default;
277 ~FakePrinterProviderAPI() override = default; 288 ~FakePrinterProviderAPI() override = default;
278 289
279 void DispatchGetPrintersRequested( 290 void DispatchGetPrintersRequested(
280 const PrinterProviderAPI::GetPrintersCallback& callback) override { 291 const PrinterProviderAPI::GetPrintersCallback& callback) override {
281 pending_printers_callbacks_.push_back(callback); 292 pending_printers_callbacks_.push(callback);
282 } 293 }
283 294
284 void DispatchGetCapabilityRequested( 295 void DispatchGetCapabilityRequested(
285 const std::string& destination_id, 296 const std::string& destination_id,
286 const PrinterProviderAPI::GetCapabilityCallback& callback) override { 297 const PrinterProviderAPI::GetCapabilityCallback& callback) override {
287 pending_capability_callbacks_.push_back(base::Bind(callback)); 298 pending_capability_callbacks_.push(callback);
288 } 299 }
289 300
290 void DispatchPrintRequested( 301 void DispatchPrintRequested(
291 const PrinterProviderPrintJob& job, 302 const PrinterProviderPrintJob& job,
292 const PrinterProviderAPI::PrintCallback& callback) override { 303 const PrinterProviderAPI::PrintCallback& callback) override {
293 PrintRequestInfo request_info; 304 PrintRequestInfo request_info;
294 request_info.callback = callback; 305 request_info.callback = callback;
295 request_info.job = job; 306 request_info.job = job;
296 307
297 pending_print_requests_.push_back(request_info); 308 pending_print_requests_.push(request_info);
309 }
310
311 void DispatchGrantUsbPrinterAccess(
312 const std::string& extension_id,
313 int device_id,
314 const PrinterProviderAPI::UsbAccessGrantedCallback& callback) override {
315 EXPECT_EQ("fake extension id", extension_id);
316 EXPECT_EQ(0, device_id);
317 pending_usb_access_granted_callbacks_.push(callback);
298 } 318 }
299 319
300 size_t pending_get_printers_count() const { 320 size_t pending_get_printers_count() const {
301 return pending_printers_callbacks_.size(); 321 return pending_printers_callbacks_.size();
302 } 322 }
303 323
304 const PrinterProviderPrintJob* GetPrintJob( 324 const PrinterProviderPrintJob* GetPrintJob(
305 const extensions::Extension* extension, 325 const extensions::Extension* extension,
306 int request_id) const override { 326 int request_id) const override {
307 ADD_FAILURE() << "Not reached"; 327 ADD_FAILURE() << "Not reached";
308 return nullptr; 328 return nullptr;
309 } 329 }
310 330
311 void TriggerNextGetPrintersCallback(const base::ListValue& printers, 331 void TriggerNextGetPrintersCallback(const base::ListValue& printers,
312 bool done) { 332 bool done) {
313 ASSERT_GT(pending_get_printers_count(), 0u); 333 ASSERT_GT(pending_get_printers_count(), 0u);
314 pending_printers_callbacks_[0].Run(printers, done); 334 pending_printers_callbacks_.front().Run(printers, done);
315 pending_printers_callbacks_.erase(pending_printers_callbacks_.begin()); 335 pending_printers_callbacks_.pop();
316 } 336 }
317 337
318 size_t pending_get_capability_count() const { 338 size_t pending_get_capability_count() const {
319 return pending_capability_callbacks_.size(); 339 return pending_capability_callbacks_.size();
320 } 340 }
321 341
322 void TriggerNextGetCapabilityCallback( 342 void TriggerNextGetCapabilityCallback(
323 const base::DictionaryValue& description) { 343 const base::DictionaryValue& description) {
324 ASSERT_GT(pending_get_capability_count(), 0u); 344 ASSERT_GT(pending_get_capability_count(), 0u);
325 pending_capability_callbacks_[0].Run(description); 345 pending_capability_callbacks_.front().Run(description);
326 pending_capability_callbacks_.erase(pending_capability_callbacks_.begin()); 346 pending_capability_callbacks_.pop();
327 } 347 }
328 348
329 size_t pending_print_count() const { return pending_print_requests_.size(); } 349 size_t pending_print_count() const { return pending_print_requests_.size(); }
330 350
331 const PrinterProviderPrintJob* GetNextPendingPrintJob() const { 351 const PrinterProviderPrintJob* GetNextPendingPrintJob() const {
332 EXPECT_GT(pending_print_count(), 0u); 352 EXPECT_GT(pending_print_count(), 0u);
333 if (pending_print_count() == 0) 353 if (pending_print_count() == 0)
334 return NULL; 354 return NULL;
335 return &pending_print_requests_[0].job; 355 return &pending_print_requests_.front().job;
336 } 356 }
337 357
338 void TriggerNextPrintCallback(const std::string& result) { 358 void TriggerNextPrintCallback(const std::string& result) {
339 ASSERT_GT(pending_print_count(), 0u); 359 ASSERT_GT(pending_print_count(), 0u);
340 pending_print_requests_[0].callback.Run(result == kPrintRequestSuccess, 360 pending_print_requests_.front().callback.Run(result == kPrintRequestSuccess,
341 result); 361 result);
342 pending_print_requests_.erase(pending_print_requests_.begin()); 362 pending_print_requests_.pop();
363 }
364
365 size_t pending_usb_access_granted_count() const {
366 return pending_usb_access_granted_callbacks_.size();
367 }
368
369 void TriggerNextUsbAccessGrantedCallback(
370 const base::DictionaryValue& printer_info) {
371 ASSERT_GT(pending_usb_access_granted_count(), 0u);
372 pending_usb_access_granted_callbacks_.front().Run(printer_info);
373 pending_usb_access_granted_callbacks_.pop();
343 } 374 }
344 375
345 private: 376 private:
346 std::vector<PrinterProviderAPI::GetPrintersCallback> 377 std::queue<PrinterProviderAPI::GetPrintersCallback>
347 pending_printers_callbacks_; 378 pending_printers_callbacks_;
348 std::vector<PrinterProviderAPI::GetCapabilityCallback> 379 std::queue<PrinterProviderAPI::GetCapabilityCallback>
349 pending_capability_callbacks_; 380 pending_capability_callbacks_;
350 std::vector<PrintRequestInfo> pending_print_requests_; 381 std::queue<PrintRequestInfo> pending_print_requests_;
382 std::queue<PrinterProviderAPI::UsbAccessGrantedCallback>
383 pending_usb_access_granted_callbacks_;
351 384
352 DISALLOW_COPY_AND_ASSIGN(FakePrinterProviderAPI); 385 DISALLOW_COPY_AND_ASSIGN(FakePrinterProviderAPI);
353 }; 386 };
354 387
355 KeyedService* BuildTestingPrinterProviderAPI(content::BrowserContext* context) { 388 KeyedService* BuildTestingPrinterProviderAPI(content::BrowserContext* context) {
356 return new FakePrinterProviderAPI(); 389 return new FakePrinterProviderAPI();
357 } 390 }
358 391
359 } // namespace 392 } // namespace
360 393
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 extension_printer_handler_->StartPrint( 820 extension_printer_handler_->StartPrint(
788 kPrinterId, kPWGRasterOnlyPrinterSimpleDescription, title, 821 kPrinterId, kPWGRasterOnlyPrinterSimpleDescription, title,
789 kEmptyPrintTicket, gfx::Size(100, 100), print_data, 822 kEmptyPrintTicket, gfx::Size(100, 100), print_data,
790 base::Bind(&RecordPrintResult, &call_count, &success, &status)); 823 base::Bind(&RecordPrintResult, &call_count, &success, &status));
791 824
792 EXPECT_EQ(1u, call_count); 825 EXPECT_EQ(1u, call_count);
793 826
794 EXPECT_FALSE(success); 827 EXPECT_FALSE(success);
795 EXPECT_EQ("INVALID_DATA", status); 828 EXPECT_EQ("INVALID_DATA", status);
796 } 829 }
830
831 TEST_F(ExtensionPrinterHandlerTest, GrantUsbPrinterAccess) {
832 size_t call_count = 0;
833 scoped_ptr<base::DictionaryValue> printer_info;
834
835 extension_printer_handler_->StartGrantUsbPrinterAccess(
836 "fake extension id", 0,
837 base::Bind(&RecordPrinterInfo, &call_count, &printer_info));
838
839 EXPECT_FALSE(printer_info.get());
840 FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI();
841 ASSERT_TRUE(fake_api);
842 ASSERT_EQ(1u, fake_api->pending_usb_access_granted_count());
843
844 scoped_ptr<base::DictionaryValue> original_printer_info(
845 DictionaryBuilder()
846 .Set("id", "printer1")
847 .Set("name", "Printer 1")
848 .Build());
849
850 fake_api->TriggerNextUsbAccessGrantedCallback(*original_printer_info);
851
852 EXPECT_EQ(1u, call_count);
853 ASSERT_TRUE(printer_info.get());
854 EXPECT_TRUE(printer_info->Equals(original_printer_info.get()))
855 << *printer_info << ", expected: " << *original_printer_info;
856 }
857
858 TEST_F(ExtensionPrinterHandlerTest, GrantUsbPrinterAccess_Reset) {
859 size_t call_count = 0;
860 scoped_ptr<base::DictionaryValue> printer_info;
861
862 extension_printer_handler_->StartGrantUsbPrinterAccess(
863 "fake extension id", 0,
864 base::Bind(&RecordPrinterInfo, &call_count, &printer_info));
865
866 EXPECT_FALSE(printer_info.get());
867 FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI();
868 ASSERT_TRUE(fake_api);
869 ASSERT_EQ(1u, fake_api->pending_usb_access_granted_count());
870
871 extension_printer_handler_->Reset();
872
873 scoped_ptr<base::DictionaryValue> original_printer_info(
874 DictionaryBuilder()
875 .Set("id", "printer1")
876 .Set("name", "Printer 1")
877 .Build());
878
879 fake_api->TriggerNextUsbAccessGrantedCallback(*original_printer_info);
880
881 EXPECT_EQ(0u, call_count);
882 EXPECT_FALSE(printer_info.get());
883 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698