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

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

Issue 1153173002: Include USB printers in printer list as "provisional" devices. (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 <string> 5 #include <string>
6 #include <vector> 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/test/values_test_util.h"
17 #include "base/values.h" 18 #include "base/values.h"
19 #include "chrome/browser/extensions/test_extension_environment.h"
18 #include "chrome/browser/local_discovery/pwg_raster_converter.h" 20 #include "chrome/browser/local_discovery/pwg_raster_converter.h"
19 #include "chrome/browser/ui/webui/print_preview/extension_printer_handler.h" 21 #include "chrome/browser/ui/webui/print_preview/extension_printer_handler.h"
20 #include "chrome/test/base/testing_profile.h" 22 #include "chrome/test/base/testing_profile.h"
21 #include "content/public/test/test_browser_thread_bundle.h" 23 #include "device/core/device_client.h"
24 #include "device/usb/mock_usb_device.h"
25 #include "device/usb/mock_usb_service.h"
26 #include "extensions/browser/api/device_permissions_manager.h"
22 #include "extensions/browser/api/printer_provider/printer_provider_api.h" 27 #include "extensions/browser/api/printer_provider/printer_provider_api.h"
23 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h " 28 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h "
24 #include "extensions/browser/api/printer_provider/printer_provider_print_job.h" 29 #include "extensions/browser/api/printer_provider/printer_provider_print_job.h"
30 #include "extensions/common/extension.h"
31 #include "extensions/common/value_builder.h"
25 #include "printing/pdf_render_settings.h" 32 #include "printing/pdf_render_settings.h"
26 #include "printing/pwg_raster_settings.h" 33 #include "printing/pwg_raster_settings.h"
27 #include "printing/units.h" 34 #include "printing/units.h"
28 #include "testing/gtest/include/gtest/gtest.h" 35 #include "testing/gtest/include/gtest/gtest.h"
29 #include "ui/gfx/geometry/size.h" 36 #include "ui/gfx/geometry/size.h"
30 37
38 using device::MockUsbDevice;
39 using device::MockUsbService;
40 using extensions::DictionaryBuilder;
41 using extensions::Extension;
31 using extensions::PrinterProviderAPI; 42 using extensions::PrinterProviderAPI;
32 using extensions::PrinterProviderPrintJob; 43 using extensions::PrinterProviderPrintJob;
44 using extensions::TestExtensionEnvironment;
33 using local_discovery::PWGRasterConverter; 45 using local_discovery::PWGRasterConverter;
34 46
35 namespace { 47 namespace {
36 48
37 // Printer id used for requests in tests. 49 // Printer id used for requests in tests.
38 const char kPrinterId[] = "printer_id"; 50 const char kPrinterId[] = "printer_id";
39 51
40 // Printer list used a result for getPrinters. 52 // Printer list used a result for getPrinters.
41 const char kPrinterDescriptionList[] = 53 const char kPrinterDescriptionList[] =
42 "[{" 54 "[{"
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 void RecordPrintResult(size_t* call_count, 165 void RecordPrintResult(size_t* call_count,
154 bool* success_out, 166 bool* success_out,
155 std::string* status_out, 167 std::string* status_out,
156 bool success, 168 bool success,
157 const std::string& status) { 169 const std::string& status) {
158 ++(*call_count); 170 ++(*call_count);
159 *success_out = success; 171 *success_out = success;
160 *status_out = status; 172 *status_out = status;
161 } 173 }
162 174
175 // Used as a callback to StartGetUsbPrinters in tests.
176 void RecordListValue(scoped_ptr<base::ListValue>* list_value_out,
177 const base::Closure& callback,
178 const base::ListValue& list_value) {
179 list_value_out->reset(list_value.DeepCopy());
180 callback.Run();
181 }
182
163 // Converts JSON string to base::ListValue object. 183 // Converts JSON string to base::ListValue object.
164 // On failure, returns NULL and fills |*error| string. 184 // On failure, returns NULL and fills |*error| string.
165 scoped_ptr<base::ListValue> GetJSONAsListValue(const std::string& json, 185 scoped_ptr<base::ListValue> GetJSONAsListValue(const std::string& json,
166 std::string* error) { 186 std::string* error) {
167 scoped_ptr<base::Value> deserialized( 187 scoped_ptr<base::Value> deserialized(
168 JSONStringValueDeserializer(json).Deserialize(NULL, error)); 188 JSONStringValueDeserializer(json).Deserialize(NULL, error));
169 if (!deserialized) 189 if (!deserialized)
170 return scoped_ptr<base::ListValue>(); 190 return scoped_ptr<base::ListValue>();
171 base::ListValue* list = nullptr; 191 base::ListValue* list = nullptr;
172 if (!deserialized->GetAsList(&list)) { 192 if (!deserialized->GetAsList(&list)) {
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 pending_capability_callbacks_; 369 pending_capability_callbacks_;
350 std::vector<PrintRequestInfo> pending_print_requests_; 370 std::vector<PrintRequestInfo> pending_print_requests_;
351 371
352 DISALLOW_COPY_AND_ASSIGN(FakePrinterProviderAPI); 372 DISALLOW_COPY_AND_ASSIGN(FakePrinterProviderAPI);
353 }; 373 };
354 374
355 KeyedService* BuildTestingPrinterProviderAPI(content::BrowserContext* context) { 375 KeyedService* BuildTestingPrinterProviderAPI(content::BrowserContext* context) {
356 return new FakePrinterProviderAPI(); 376 return new FakePrinterProviderAPI();
357 } 377 }
358 378
379 class FakeDeviceClient : public device::DeviceClient {
380 public:
381 FakeDeviceClient() {}
382
383 // device::DeviceClient implementation:
384 device::UsbService* GetUsbService() override {
385 DCHECK(usb_service_);
386 return usb_service_;
387 }
388
389 void set_usb_service(device::UsbService* service) { usb_service_ = service; }
390
391 private:
392 device::UsbService* usb_service_ = nullptr;
393 };
394
359 } // namespace 395 } // namespace
360 396
361 class ExtensionPrinterHandlerTest : public testing::Test { 397 class ExtensionPrinterHandlerTest : public testing::Test {
362 public: 398 public:
363 ExtensionPrinterHandlerTest() : pwg_raster_converter_(NULL) {} 399 ExtensionPrinterHandlerTest() : pwg_raster_converter_(NULL) {}
364 ~ExtensionPrinterHandlerTest() override = default; 400 ~ExtensionPrinterHandlerTest() override = default;
365 401
366 void SetUp() override { 402 void SetUp() override {
367 TestingProfile::Builder profile_builder; 403 env_.reset(new TestExtensionEnvironment());
368 profile_builder.AddTestingFactory( 404 extensions::PrinterProviderAPIFactory::GetInstance()->SetTestingFactory(
369 extensions::PrinterProviderAPIFactory::GetInstance(), 405 env_->profile(), &BuildTestingPrinterProviderAPI);
370 &BuildTestingPrinterProviderAPI);
371 profile_ = profile_builder.Build();
372
373 extension_printer_handler_.reset(new ExtensionPrinterHandler( 406 extension_printer_handler_.reset(new ExtensionPrinterHandler(
374 profile_.get(), base::MessageLoop::current()->task_runner())); 407 env_->profile(), base::MessageLoop::current()->task_runner()));
375 408
376 pwg_raster_converter_ = new FakePWGRasterConverter(); 409 pwg_raster_converter_ = new FakePWGRasterConverter();
377 extension_printer_handler_->SetPwgRasterConverterForTesting( 410 extension_printer_handler_->SetPwgRasterConverterForTesting(
378 scoped_ptr<PWGRasterConverter>(pwg_raster_converter_)); 411 scoped_ptr<PWGRasterConverter>(pwg_raster_converter_));
412 device_client_.set_usb_service(&usb_service_);
379 } 413 }
380 414
381 protected: 415 protected:
382 FakePrinterProviderAPI* GetPrinterProviderAPI() { 416 FakePrinterProviderAPI* GetPrinterProviderAPI() {
383 return static_cast<FakePrinterProviderAPI*>( 417 return static_cast<FakePrinterProviderAPI*>(
384 extensions::PrinterProviderAPIFactory::GetInstance() 418 extensions::PrinterProviderAPIFactory::GetInstance()
385 ->GetForBrowserContext(profile_.get())); 419 ->GetForBrowserContext(env_->profile()));
386 } 420 }
387 421
422 MockUsbService usb_service_;
423 scoped_ptr<TestExtensionEnvironment> env_;
388 scoped_ptr<ExtensionPrinterHandler> extension_printer_handler_; 424 scoped_ptr<ExtensionPrinterHandler> extension_printer_handler_;
389 425
390 FakePWGRasterConverter* pwg_raster_converter_; 426 FakePWGRasterConverter* pwg_raster_converter_;
391 427
392 private: 428 private:
393 content::TestBrowserThreadBundle thread_bundle_; 429 FakeDeviceClient device_client_;
394
395 scoped_ptr<TestingProfile> profile_;
396 430
397 DISALLOW_COPY_AND_ASSIGN(ExtensionPrinterHandlerTest); 431 DISALLOW_COPY_AND_ASSIGN(ExtensionPrinterHandlerTest);
398 }; 432 };
399 433
400 TEST_F(ExtensionPrinterHandlerTest, GetPrinters) { 434 TEST_F(ExtensionPrinterHandlerTest, GetPrinters) {
401 size_t call_count = 0; 435 size_t call_count = 0;
402 scoped_ptr<base::ListValue> printers; 436 scoped_ptr<base::ListValue> printers;
403 bool is_done = false; 437 bool is_done = false;
404 438
405 extension_printer_handler_->StartGetPrinters( 439 extension_printer_handler_->StartGetPrinters(
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 std::string error; 476 std::string error;
443 scoped_ptr<base::ListValue> original_printers( 477 scoped_ptr<base::ListValue> original_printers(
444 GetJSONAsListValue(kPrinterDescriptionList, &error)); 478 GetJSONAsListValue(kPrinterDescriptionList, &error));
445 ASSERT_TRUE(original_printers) << "Error deserializing printers: " << error; 479 ASSERT_TRUE(original_printers) << "Error deserializing printers: " << error;
446 480
447 fake_api->TriggerNextGetPrintersCallback(*original_printers, true); 481 fake_api->TriggerNextGetPrintersCallback(*original_printers, true);
448 482
449 EXPECT_EQ(0u, call_count); 483 EXPECT_EQ(0u, call_count);
450 } 484 }
451 485
486 TEST_F(ExtensionPrinterHandlerTest, GetUsbPrinters) {
487 scoped_refptr<MockUsbDevice> device0 =
488 new MockUsbDevice(0, 0, "Google", "USB Printer", "");
489 usb_service_.AddDevice(device0);
490 scoped_refptr<MockUsbDevice> device1 =
491 new MockUsbDevice(0, 1, "Google", "USB Printer", "");
492 usb_service_.AddDevice(device1);
493
494 const Extension* extension_1 = env_->MakeExtension(*base::test::ParseJson(
495 "{"
496 " \"name\": \"Provider 1\","
497 " \"app\": {"
498 " \"background\": {"
499 " \"scripts\": [\"background.js\"]"
500 " }"
501 " },"
502 " \"permissions\": ["
503 " \"printerProvider\","
504 " \"usb\","
505 " {"
506 " \"usbDevices\": ["
507 " { \"vendorId\": 0, \"productId\": 1 }"
508 " ]"
509 " },"
510 " ],"
511 " \"usb_printers\": {"
512 " \"filters\": ["
513 " { \"vendorId\": 0, \"productId\": 0 },"
514 " { \"vendorId\": 0, \"productId\": 1 }"
515 " ]"
516 " }"
517 "}"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
518 const Extension* extension_2 = env_->MakeExtension(*base::test::ParseJson(
519 "{"
520 " \"name\": \"Provider 2\","
521 " \"app\": {"
522 " \"background\": {"
523 " \"scripts\": [\"background.js\"]"
524 " }"
525 " },"
526 " \"permissions\": [ \"printerProvider\", \"usb\" ],"
527 " \"usb_printers\": {"
528 " \"filters\": ["
529 " { \"vendorId\": 0, \"productId\": 0 },"
530 " { \"vendorId\": 0, \"productId\": 1 }"
531 " ]"
532 " }"
533 "}"), "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
534
535 extensions::DevicePermissionsManager* permissions_manager =
536 extensions::DevicePermissionsManager::Get(env_->profile());
537 permissions_manager->AllowUsbDevice(extension_2->id(), device0);
538
539 scoped_ptr<base::ListValue> printers;
540 base::RunLoop run_loop;
541 extension_printer_handler_->StartGetUsbPrinters(
542 base::Bind(&RecordListValue, &printers, run_loop.QuitClosure()));
543 run_loop.Run();
544
545 EXPECT_TRUE(printers.get());
546 EXPECT_EQ(2u, printers->GetSize());
547
548 scoped_ptr<base::DictionaryValue> extension_1_entry(
549 DictionaryBuilder().Set("extensionName", "Provider 1")
550 .Set("extensionId", extension_1->id()).Build());
551 scoped_ptr<base::DictionaryValue> extension_2_entry(
552 DictionaryBuilder().Set("extensionName", "Provider 2")
553 .Set("extensionId", extension_2->id()).Build());
554
555 for (size_t i = 0; i < printers->GetSize(); ++i) {
556 const base::DictionaryValue* printer_info;
557 ASSERT_TRUE(printers->GetDictionary(i, &printer_info));
558
559 EXPECT_EQ(3u, printer_info->size());
560 std::string name;
561 EXPECT_TRUE(printer_info->GetString("name", &name));
562 EXPECT_EQ("USB Printer", name);
563 uint32 device_id;
564 EXPECT_TRUE(printer_info->GetInteger(
565 "usbDevice", reinterpret_cast<int*>(&device_id)));
566 const base::ListValue* extensions;
567 EXPECT_TRUE(printer_info->GetList("extensions", &extensions));
568 EXPECT_EQ(1u, extensions->GetSize());
569
570 if (device_id == device0->unique_id()) {
571 EXPECT_TRUE(extensions->Find(*extension_1_entry) != extensions->end());
572 } else if (device_id == device1->unique_id()) {
573 EXPECT_TRUE(extensions->Find(*extension_2_entry) != extensions->end());
574 } else {
575 FAIL();
576 }
577 }
578 }
579
452 TEST_F(ExtensionPrinterHandlerTest, GetCapability) { 580 TEST_F(ExtensionPrinterHandlerTest, GetCapability) {
453 size_t call_count = 0; 581 size_t call_count = 0;
454 std::string destination_id; 582 std::string destination_id;
455 scoped_ptr<base::DictionaryValue> capability; 583 scoped_ptr<base::DictionaryValue> capability;
456 584
457 extension_printer_handler_->StartGetCapability( 585 extension_printer_handler_->StartGetCapability(
458 kPrinterId, 586 kPrinterId,
459 base::Bind(&RecordCapability, &call_count, &destination_id, &capability)); 587 base::Bind(&RecordCapability, &call_count, &destination_id, &capability));
460 588
461 EXPECT_EQ(0u, call_count); 589 EXPECT_EQ(0u, call_count);
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 extension_printer_handler_->StartPrint( 915 extension_printer_handler_->StartPrint(
788 kPrinterId, kPWGRasterOnlyPrinterSimpleDescription, title, 916 kPrinterId, kPWGRasterOnlyPrinterSimpleDescription, title,
789 kEmptyPrintTicket, gfx::Size(100, 100), print_data, 917 kEmptyPrintTicket, gfx::Size(100, 100), print_data,
790 base::Bind(&RecordPrintResult, &call_count, &success, &status)); 918 base::Bind(&RecordPrintResult, &call_count, &success, &status));
791 919
792 EXPECT_EQ(1u, call_count); 920 EXPECT_EQ(1u, call_count);
793 921
794 EXPECT_FALSE(success); 922 EXPECT_FALSE(success);
795 EXPECT_EQ("INVALID_DATA", status); 923 EXPECT_EQ("INVALID_DATA", status);
796 } 924 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698