| OLD | NEW |
| 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" |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 } | 173 } |
| 174 | 174 |
| 175 // Used as a callback to StartGetUsbPrinters in tests. | 175 // Used as a callback to StartGetUsbPrinters in tests. |
| 176 void RecordListValue(scoped_ptr<base::ListValue>* list_value_out, | 176 void RecordListValue(scoped_ptr<base::ListValue>* list_value_out, |
| 177 const base::Closure& callback, | 177 const base::Closure& callback, |
| 178 const base::ListValue& list_value) { | 178 const base::ListValue& list_value) { |
| 179 list_value_out->reset(list_value.DeepCopy()); | 179 list_value_out->reset(list_value.DeepCopy()); |
| 180 callback.Run(); | 180 callback.Run(); |
| 181 } | 181 } |
| 182 | 182 |
| 183 // Used as a callback to StartGrantUsbPrinterAccess in tests. |
| 184 // Increases |*call_count| and records the value returned. |
| 185 void RecordPrinterInfo(size_t* call_count, |
| 186 scoped_ptr<base::DictionaryValue>* printer_info_out, |
| 187 const base::DictionaryValue& printer_info) { |
| 188 ++(*call_count); |
| 189 printer_info_out->reset(printer_info.DeepCopy()); |
| 190 } |
| 191 |
| 183 // Converts JSON string to base::ListValue object. | 192 // Converts JSON string to base::ListValue object. |
| 184 // On failure, returns NULL and fills |*error| string. | 193 // On failure, returns NULL and fills |*error| string. |
| 185 scoped_ptr<base::ListValue> GetJSONAsListValue(const std::string& json, | 194 scoped_ptr<base::ListValue> GetJSONAsListValue(const std::string& json, |
| 186 std::string* error) { | 195 std::string* error) { |
| 187 scoped_ptr<base::Value> deserialized( | 196 scoped_ptr<base::Value> deserialized( |
| 188 JSONStringValueDeserializer(json).Deserialize(NULL, error)); | 197 JSONStringValueDeserializer(json).Deserialize(NULL, error)); |
| 189 if (!deserialized) | 198 if (!deserialized) |
| 190 return scoped_ptr<base::ListValue>(); | 199 return scoped_ptr<base::ListValue>(); |
| 191 base::ListValue* list = nullptr; | 200 base::ListValue* list = nullptr; |
| 192 if (!deserialized->GetAsList(&list)) { | 201 if (!deserialized->GetAsList(&list)) { |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 // Fake PrinterProviderAPI used in tests. | 300 // Fake PrinterProviderAPI used in tests. |
| 292 // It caches requests issued to API and exposes methods to trigger their | 301 // It caches requests issued to API and exposes methods to trigger their |
| 293 // callbacks. | 302 // callbacks. |
| 294 class FakePrinterProviderAPI : public PrinterProviderAPI { | 303 class FakePrinterProviderAPI : public PrinterProviderAPI { |
| 295 public: | 304 public: |
| 296 FakePrinterProviderAPI() = default; | 305 FakePrinterProviderAPI() = default; |
| 297 ~FakePrinterProviderAPI() override = default; | 306 ~FakePrinterProviderAPI() override = default; |
| 298 | 307 |
| 299 void DispatchGetPrintersRequested( | 308 void DispatchGetPrintersRequested( |
| 300 const PrinterProviderAPI::GetPrintersCallback& callback) override { | 309 const PrinterProviderAPI::GetPrintersCallback& callback) override { |
| 301 pending_printers_callbacks_.push_back(callback); | 310 pending_printers_callbacks_.push(callback); |
| 302 } | 311 } |
| 303 | 312 |
| 304 void DispatchGetCapabilityRequested( | 313 void DispatchGetCapabilityRequested( |
| 305 const std::string& destination_id, | 314 const std::string& destination_id, |
| 306 const PrinterProviderAPI::GetCapabilityCallback& callback) override { | 315 const PrinterProviderAPI::GetCapabilityCallback& callback) override { |
| 307 pending_capability_callbacks_.push_back(base::Bind(callback)); | 316 pending_capability_callbacks_.push(callback); |
| 308 } | 317 } |
| 309 | 318 |
| 310 void DispatchPrintRequested( | 319 void DispatchPrintRequested( |
| 311 const PrinterProviderPrintJob& job, | 320 const PrinterProviderPrintJob& job, |
| 312 const PrinterProviderAPI::PrintCallback& callback) override { | 321 const PrinterProviderAPI::PrintCallback& callback) override { |
| 313 PrintRequestInfo request_info; | 322 PrintRequestInfo request_info; |
| 314 request_info.callback = callback; | 323 request_info.callback = callback; |
| 315 request_info.job = job; | 324 request_info.job = job; |
| 316 | 325 |
| 317 pending_print_requests_.push_back(request_info); | 326 pending_print_requests_.push(request_info); |
| 327 } |
| 328 |
| 329 void DispatchGrantUsbPrinterAccess( |
| 330 const std::string& extension_id, |
| 331 int device_id, |
| 332 const PrinterProviderAPI::UsbAccessGrantedCallback& callback) override { |
| 333 EXPECT_EQ("fake extension id", extension_id); |
| 334 EXPECT_EQ(0, device_id); |
| 335 pending_usb_access_granted_callbacks_.push(callback); |
| 318 } | 336 } |
| 319 | 337 |
| 320 size_t pending_get_printers_count() const { | 338 size_t pending_get_printers_count() const { |
| 321 return pending_printers_callbacks_.size(); | 339 return pending_printers_callbacks_.size(); |
| 322 } | 340 } |
| 323 | 341 |
| 324 const PrinterProviderPrintJob* GetPrintJob( | 342 const PrinterProviderPrintJob* GetPrintJob( |
| 325 const extensions::Extension* extension, | 343 const extensions::Extension* extension, |
| 326 int request_id) const override { | 344 int request_id) const override { |
| 327 ADD_FAILURE() << "Not reached"; | 345 ADD_FAILURE() << "Not reached"; |
| 328 return nullptr; | 346 return nullptr; |
| 329 } | 347 } |
| 330 | 348 |
| 331 void TriggerNextGetPrintersCallback(const base::ListValue& printers, | 349 void TriggerNextGetPrintersCallback(const base::ListValue& printers, |
| 332 bool done) { | 350 bool done) { |
| 333 ASSERT_GT(pending_get_printers_count(), 0u); | 351 ASSERT_GT(pending_get_printers_count(), 0u); |
| 334 pending_printers_callbacks_[0].Run(printers, done); | 352 pending_printers_callbacks_.front().Run(printers, done); |
| 335 pending_printers_callbacks_.erase(pending_printers_callbacks_.begin()); | 353 pending_printers_callbacks_.pop(); |
| 336 } | 354 } |
| 337 | 355 |
| 338 size_t pending_get_capability_count() const { | 356 size_t pending_get_capability_count() const { |
| 339 return pending_capability_callbacks_.size(); | 357 return pending_capability_callbacks_.size(); |
| 340 } | 358 } |
| 341 | 359 |
| 342 void TriggerNextGetCapabilityCallback( | 360 void TriggerNextGetCapabilityCallback( |
| 343 const base::DictionaryValue& description) { | 361 const base::DictionaryValue& description) { |
| 344 ASSERT_GT(pending_get_capability_count(), 0u); | 362 ASSERT_GT(pending_get_capability_count(), 0u); |
| 345 pending_capability_callbacks_[0].Run(description); | 363 pending_capability_callbacks_.front().Run(description); |
| 346 pending_capability_callbacks_.erase(pending_capability_callbacks_.begin()); | 364 pending_capability_callbacks_.pop(); |
| 347 } | 365 } |
| 348 | 366 |
| 349 size_t pending_print_count() const { return pending_print_requests_.size(); } | 367 size_t pending_print_count() const { return pending_print_requests_.size(); } |
| 350 | 368 |
| 351 const PrinterProviderPrintJob* GetNextPendingPrintJob() const { | 369 const PrinterProviderPrintJob* GetNextPendingPrintJob() const { |
| 352 EXPECT_GT(pending_print_count(), 0u); | 370 EXPECT_GT(pending_print_count(), 0u); |
| 353 if (pending_print_count() == 0) | 371 if (pending_print_count() == 0) |
| 354 return NULL; | 372 return NULL; |
| 355 return &pending_print_requests_[0].job; | 373 return &pending_print_requests_.front().job; |
| 356 } | 374 } |
| 357 | 375 |
| 358 void TriggerNextPrintCallback(const std::string& result) { | 376 void TriggerNextPrintCallback(const std::string& result) { |
| 359 ASSERT_GT(pending_print_count(), 0u); | 377 ASSERT_GT(pending_print_count(), 0u); |
| 360 pending_print_requests_[0].callback.Run(result == kPrintRequestSuccess, | 378 pending_print_requests_.front().callback.Run(result == kPrintRequestSuccess, |
| 361 result); | 379 result); |
| 362 pending_print_requests_.erase(pending_print_requests_.begin()); | 380 pending_print_requests_.pop(); |
| 381 } |
| 382 |
| 383 size_t pending_usb_access_granted_count() const { |
| 384 return pending_usb_access_granted_callbacks_.size(); |
| 385 } |
| 386 |
| 387 void TriggerNextUsbAccessGrantedCallback( |
| 388 const base::DictionaryValue& printer_info) { |
| 389 ASSERT_GT(pending_usb_access_granted_count(), 0u); |
| 390 pending_usb_access_granted_callbacks_.front().Run(printer_info); |
| 391 pending_usb_access_granted_callbacks_.pop(); |
| 363 } | 392 } |
| 364 | 393 |
| 365 private: | 394 private: |
| 366 std::vector<PrinterProviderAPI::GetPrintersCallback> | 395 std::queue<PrinterProviderAPI::GetPrintersCallback> |
| 367 pending_printers_callbacks_; | 396 pending_printers_callbacks_; |
| 368 std::vector<PrinterProviderAPI::GetCapabilityCallback> | 397 std::queue<PrinterProviderAPI::GetCapabilityCallback> |
| 369 pending_capability_callbacks_; | 398 pending_capability_callbacks_; |
| 370 std::vector<PrintRequestInfo> pending_print_requests_; | 399 std::queue<PrintRequestInfo> pending_print_requests_; |
| 400 std::queue<PrinterProviderAPI::UsbAccessGrantedCallback> |
| 401 pending_usb_access_granted_callbacks_; |
| 371 | 402 |
| 372 DISALLOW_COPY_AND_ASSIGN(FakePrinterProviderAPI); | 403 DISALLOW_COPY_AND_ASSIGN(FakePrinterProviderAPI); |
| 373 }; | 404 }; |
| 374 | 405 |
| 375 KeyedService* BuildTestingPrinterProviderAPI(content::BrowserContext* context) { | 406 KeyedService* BuildTestingPrinterProviderAPI(content::BrowserContext* context) { |
| 376 return new FakePrinterProviderAPI(); | 407 return new FakePrinterProviderAPI(); |
| 377 } | 408 } |
| 378 | 409 |
| 379 class FakeDeviceClient : public device::DeviceClient { | 410 class FakeDeviceClient : public device::DeviceClient { |
| 380 public: | 411 public: |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 915 extension_printer_handler_->StartPrint( | 946 extension_printer_handler_->StartPrint( |
| 916 kPrinterId, kPWGRasterOnlyPrinterSimpleDescription, title, | 947 kPrinterId, kPWGRasterOnlyPrinterSimpleDescription, title, |
| 917 kEmptyPrintTicket, gfx::Size(100, 100), print_data, | 948 kEmptyPrintTicket, gfx::Size(100, 100), print_data, |
| 918 base::Bind(&RecordPrintResult, &call_count, &success, &status)); | 949 base::Bind(&RecordPrintResult, &call_count, &success, &status)); |
| 919 | 950 |
| 920 EXPECT_EQ(1u, call_count); | 951 EXPECT_EQ(1u, call_count); |
| 921 | 952 |
| 922 EXPECT_FALSE(success); | 953 EXPECT_FALSE(success); |
| 923 EXPECT_EQ("INVALID_DATA", status); | 954 EXPECT_EQ("INVALID_DATA", status); |
| 924 } | 955 } |
| 956 |
| 957 TEST_F(ExtensionPrinterHandlerTest, GrantUsbPrinterAccess) { |
| 958 size_t call_count = 0; |
| 959 scoped_ptr<base::DictionaryValue> printer_info; |
| 960 |
| 961 extension_printer_handler_->StartGrantUsbPrinterAccess( |
| 962 "fake extension id", 0, |
| 963 base::Bind(&RecordPrinterInfo, &call_count, &printer_info)); |
| 964 |
| 965 EXPECT_FALSE(printer_info.get()); |
| 966 FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI(); |
| 967 ASSERT_TRUE(fake_api); |
| 968 ASSERT_EQ(1u, fake_api->pending_usb_access_granted_count()); |
| 969 |
| 970 scoped_ptr<base::DictionaryValue> original_printer_info( |
| 971 DictionaryBuilder() |
| 972 .Set("id", "printer1") |
| 973 .Set("name", "Printer 1") |
| 974 .Build()); |
| 975 |
| 976 fake_api->TriggerNextUsbAccessGrantedCallback(*original_printer_info); |
| 977 |
| 978 EXPECT_EQ(1u, call_count); |
| 979 ASSERT_TRUE(printer_info.get()); |
| 980 EXPECT_TRUE(printer_info->Equals(original_printer_info.get())) |
| 981 << *printer_info << ", expected: " << *original_printer_info; |
| 982 } |
| 983 |
| 984 TEST_F(ExtensionPrinterHandlerTest, GrantUsbPrinterAccess_Reset) { |
| 985 size_t call_count = 0; |
| 986 scoped_ptr<base::DictionaryValue> printer_info; |
| 987 |
| 988 extension_printer_handler_->StartGrantUsbPrinterAccess( |
| 989 "fake extension id", 0, |
| 990 base::Bind(&RecordPrinterInfo, &call_count, &printer_info)); |
| 991 |
| 992 EXPECT_FALSE(printer_info.get()); |
| 993 FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI(); |
| 994 ASSERT_TRUE(fake_api); |
| 995 ASSERT_EQ(1u, fake_api->pending_usb_access_granted_count()); |
| 996 |
| 997 extension_printer_handler_->Reset(); |
| 998 |
| 999 scoped_ptr<base::DictionaryValue> original_printer_info( |
| 1000 DictionaryBuilder() |
| 1001 .Set("id", "printer1") |
| 1002 .Set("name", "Printer 1") |
| 1003 .Build()); |
| 1004 |
| 1005 fake_api->TriggerNextUsbAccessGrantedCallback(*original_printer_info); |
| 1006 |
| 1007 EXPECT_EQ(0u, call_count); |
| 1008 EXPECT_FALSE(printer_info.get()); |
| 1009 } |
| OLD | NEW |