Index: chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc |
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc |
index 1f701a6067c5e30f63824dfd9903e15a018636e1..d598cc975905ea5c2552c2d3cc12eeb95123e0a3 100644 |
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc |
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc |
@@ -14,22 +14,34 @@ |
#include "base/run_loop.h" |
#include "base/strings/string16.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "base/test/values_test_util.h" |
#include "base/values.h" |
+#include "chrome/browser/extensions/test_extension_environment.h" |
#include "chrome/browser/local_discovery/pwg_raster_converter.h" |
#include "chrome/browser/ui/webui/print_preview/extension_printer_handler.h" |
#include "chrome/test/base/testing_profile.h" |
-#include "content/public/test/test_browser_thread_bundle.h" |
+#include "device/core/device_client.h" |
+#include "device/usb/mock_usb_device.h" |
+#include "device/usb/mock_usb_service.h" |
+#include "extensions/browser/api/device_permissions_manager.h" |
#include "extensions/browser/api/printer_provider/printer_provider_api.h" |
#include "extensions/browser/api/printer_provider/printer_provider_api_factory.h" |
#include "extensions/browser/api/printer_provider/printer_provider_print_job.h" |
+#include "extensions/common/extension.h" |
+#include "extensions/common/value_builder.h" |
#include "printing/pdf_render_settings.h" |
#include "printing/pwg_raster_settings.h" |
#include "printing/units.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/gfx/geometry/size.h" |
+using device::MockUsbDevice; |
+using device::MockUsbService; |
+using extensions::DictionaryBuilder; |
+using extensions::Extension; |
using extensions::PrinterProviderAPI; |
using extensions::PrinterProviderPrintJob; |
+using extensions::TestExtensionEnvironment; |
using local_discovery::PWGRasterConverter; |
namespace { |
@@ -160,6 +172,14 @@ void RecordPrintResult(size_t* call_count, |
*status_out = status; |
} |
+// Used as a callback to StartGetUsbPrinters in tests. |
+void RecordListValue(scoped_ptr<base::ListValue>* list_value_out, |
+ const base::Closure& callback, |
+ const base::ListValue& list_value) { |
+ list_value_out->reset(list_value.DeepCopy()); |
+ callback.Run(); |
+} |
+ |
// Converts JSON string to base::ListValue object. |
// On failure, returns NULL and fills |*error| string. |
scoped_ptr<base::ListValue> GetJSONAsListValue(const std::string& json, |
@@ -356,6 +376,22 @@ KeyedService* BuildTestingPrinterProviderAPI(content::BrowserContext* context) { |
return new FakePrinterProviderAPI(); |
} |
+class FakeDeviceClient : public device::DeviceClient { |
+ public: |
+ FakeDeviceClient() {} |
+ |
+ // device::DeviceClient implementation: |
+ device::UsbService* GetUsbService() override { |
+ DCHECK(usb_service_); |
+ return usb_service_; |
+ } |
+ |
+ void set_usb_service(device::UsbService* service) { usb_service_ = service; } |
+ |
+ private: |
+ device::UsbService* usb_service_ = nullptr; |
+}; |
+ |
} // namespace |
class ExtensionPrinterHandlerTest : public testing::Test { |
@@ -364,35 +400,33 @@ class ExtensionPrinterHandlerTest : public testing::Test { |
~ExtensionPrinterHandlerTest() override = default; |
void SetUp() override { |
- TestingProfile::Builder profile_builder; |
- profile_builder.AddTestingFactory( |
- extensions::PrinterProviderAPIFactory::GetInstance(), |
- &BuildTestingPrinterProviderAPI); |
- profile_ = profile_builder.Build(); |
- |
+ env_.reset(new TestExtensionEnvironment()); |
+ extensions::PrinterProviderAPIFactory::GetInstance()->SetTestingFactory( |
+ env_->profile(), &BuildTestingPrinterProviderAPI); |
extension_printer_handler_.reset(new ExtensionPrinterHandler( |
- profile_.get(), base::MessageLoop::current()->task_runner())); |
+ env_->profile(), base::MessageLoop::current()->task_runner())); |
pwg_raster_converter_ = new FakePWGRasterConverter(); |
extension_printer_handler_->SetPwgRasterConverterForTesting( |
scoped_ptr<PWGRasterConverter>(pwg_raster_converter_)); |
+ device_client_.set_usb_service(&usb_service_); |
} |
protected: |
FakePrinterProviderAPI* GetPrinterProviderAPI() { |
return static_cast<FakePrinterProviderAPI*>( |
extensions::PrinterProviderAPIFactory::GetInstance() |
- ->GetForBrowserContext(profile_.get())); |
+ ->GetForBrowserContext(env_->profile())); |
} |
+ MockUsbService usb_service_; |
+ scoped_ptr<TestExtensionEnvironment> env_; |
scoped_ptr<ExtensionPrinterHandler> extension_printer_handler_; |
FakePWGRasterConverter* pwg_raster_converter_; |
private: |
- content::TestBrowserThreadBundle thread_bundle_; |
- |
- scoped_ptr<TestingProfile> profile_; |
+ FakeDeviceClient device_client_; |
DISALLOW_COPY_AND_ASSIGN(ExtensionPrinterHandlerTest); |
}; |
@@ -449,6 +483,100 @@ TEST_F(ExtensionPrinterHandlerTest, GetPrinters_Reset) { |
EXPECT_EQ(0u, call_count); |
} |
+TEST_F(ExtensionPrinterHandlerTest, GetUsbPrinters) { |
+ scoped_refptr<MockUsbDevice> device0 = |
+ new MockUsbDevice(0, 0, "Google", "USB Printer", ""); |
+ usb_service_.AddDevice(device0); |
+ scoped_refptr<MockUsbDevice> device1 = |
+ new MockUsbDevice(0, 1, "Google", "USB Printer", ""); |
+ usb_service_.AddDevice(device1); |
+ |
+ const Extension* extension_1 = env_->MakeExtension(*base::test::ParseJson( |
+ "{" |
+ " \"name\": \"Provider 1\"," |
+ " \"app\": {" |
+ " \"background\": {" |
+ " \"scripts\": [\"background.js\"]" |
+ " }" |
+ " }," |
+ " \"permissions\": [" |
+ " \"printerProvider\"," |
+ " \"usb\"," |
+ " {" |
+ " \"usbDevices\": [" |
+ " { \"vendorId\": 0, \"productId\": 1 }" |
+ " ]" |
+ " }," |
+ " ]," |
+ " \"usb_printers\": {" |
+ " \"filters\": [" |
+ " { \"vendorId\": 0, \"productId\": 0 }," |
+ " { \"vendorId\": 0, \"productId\": 1 }" |
+ " ]" |
+ " }" |
+ "}"), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
+ const Extension* extension_2 = env_->MakeExtension(*base::test::ParseJson( |
+ "{" |
+ " \"name\": \"Provider 2\"," |
+ " \"app\": {" |
+ " \"background\": {" |
+ " \"scripts\": [\"background.js\"]" |
+ " }" |
+ " }," |
+ " \"permissions\": [ \"printerProvider\", \"usb\" ]," |
+ " \"usb_printers\": {" |
+ " \"filters\": [" |
+ " { \"vendorId\": 0, \"productId\": 0 }," |
+ " { \"vendorId\": 0, \"productId\": 1 }" |
+ " ]" |
+ " }" |
+ "}"), "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); |
+ |
+ extensions::DevicePermissionsManager* permissions_manager = |
+ extensions::DevicePermissionsManager::Get(env_->profile()); |
+ permissions_manager->AllowUsbDevice(extension_2->id(), device0); |
+ |
+ scoped_ptr<base::ListValue> printers; |
+ base::RunLoop run_loop; |
+ extension_printer_handler_->StartGetUsbPrinters( |
+ base::Bind(&RecordListValue, &printers, run_loop.QuitClosure())); |
+ run_loop.Run(); |
+ |
+ EXPECT_TRUE(printers.get()); |
+ EXPECT_EQ(2u, printers->GetSize()); |
+ |
+ scoped_ptr<base::DictionaryValue> extension_1_entry( |
+ DictionaryBuilder().Set("extensionName", "Provider 1") |
+ .Set("extensionId", extension_1->id()).Build()); |
+ scoped_ptr<base::DictionaryValue> extension_2_entry( |
+ DictionaryBuilder().Set("extensionName", "Provider 2") |
+ .Set("extensionId", extension_2->id()).Build()); |
+ |
+ for (size_t i = 0; i < printers->GetSize(); ++i) { |
+ const base::DictionaryValue* printer_info; |
+ ASSERT_TRUE(printers->GetDictionary(i, &printer_info)); |
+ |
+ EXPECT_EQ(3u, printer_info->size()); |
+ std::string name; |
+ EXPECT_TRUE(printer_info->GetString("name", &name)); |
+ EXPECT_EQ("USB Printer", name); |
+ uint32 device_id; |
+ EXPECT_TRUE(printer_info->GetInteger( |
+ "usbDevice", reinterpret_cast<int*>(&device_id))); |
+ const base::ListValue* extensions; |
+ EXPECT_TRUE(printer_info->GetList("extensions", &extensions)); |
+ EXPECT_EQ(1u, extensions->GetSize()); |
+ |
+ if (device_id == device0->unique_id()) { |
+ EXPECT_TRUE(extensions->Find(*extension_1_entry) != extensions->end()); |
+ } else if (device_id == device1->unique_id()) { |
+ EXPECT_TRUE(extensions->Find(*extension_2_entry) != extensions->end()); |
+ } else { |
+ FAIL(); |
+ } |
+ } |
+} |
+ |
TEST_F(ExtensionPrinterHandlerTest, GetCapability) { |
size_t call_count = 0; |
std::string destination_id; |