Index: chrome/browser/extensions/api/document_scan/document_scan_interface_chromeos_unittest.cc |
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_interface_chromeos_unittest.cc b/chrome/browser/extensions/api/document_scan/document_scan_interface_chromeos_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a84fe0b789edde4f0d5beedd40675f354f25060a |
--- /dev/null |
+++ b/chrome/browser/extensions/api/document_scan/document_scan_interface_chromeos_unittest.cc |
@@ -0,0 +1,168 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+#include "chrome/browser/extensions/api/document_scan/document_scan_interface_chromeos.h" |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "base/bind.h" |
+#include "base/test/test_simple_task_runner.h" |
+#include "base/thread_task_runner_handle.h" |
+#include "chromeos/dbus/mock_lorgnette_manager_client.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/cros_system_api/dbus/service_constants.h" |
+ |
+using testing::_; |
+ |
+namespace extensions { |
+ |
+namespace api { |
+ |
+// Tests of networking_private_crypto support for Networking Private API. |
+class DocumentScanInterfaceChromeosTest : public testing::Test { |
+ public: |
+ DocumentScanInterfaceChromeosTest() |
+ : client_(new chromeos::MockLorgnetteManagerClient()) {} |
+ virtual ~DocumentScanInterfaceChromeosTest() {} |
+ |
+ void SetUp() { |
+ // This is needed to create a valid PipeReader object. |
+ task_runner_ = new base::TestSimpleTaskRunner(); |
+ thread_task_runner_handle_.reset( |
+ new base::ThreadTaskRunnerHandle(task_runner_)); |
+ scan_interface_.lorgnette_manager_client_ = client_.get(); |
+ } |
+ |
+ virtual void TearDown() override { |
+ thread_task_runner_handle_.reset(); |
+ task_runner_ = NULL; |
+ } |
+ |
+ MOCK_METHOD2( |
+ OnListScannersResultReceived, |
+ void(const std::vector<DocumentScanInterface::ScannerDescription>& |
+ scanners, |
+ const std::string& error)); |
+ |
+ MOCK_METHOD3(OnScanCompleted, void(const std::string& scanned_image, |
+ const std::string& mime_type, |
+ const std::string& error)); |
+ |
+ chromeos::PipeReader *GetPipeReader() { |
+ return scan_interface_.pipe_reader_.get(); |
+ } |
+ |
+ protected: |
+ DocumentScanInterfaceChromeos scan_interface_; |
+ scoped_ptr<chromeos::MockLorgnetteManagerClient> client_; |
+ scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
+ scoped_ptr<base::ThreadTaskRunnerHandle> thread_task_runner_handle_; |
+}; |
+ |
+ACTION_P2(InvokeListScannersCallback, scanner_list, error) { |
+ ::std::tr1::get<0>(args).Run(scanner_list, error); |
+} |
+ |
+ACTION_P2(InvokePipeReader, test, data) { |
+ test->GetPipeReader()->AcceptData(data.c_str(), data.size()); |
+} |
+ |
+ACTION_P(InvokeScanCallback, succeeded) { |
+ ::std::tr1::get<3>(args).Run(succeeded); |
+} |
+ |
+MATCHER_P5(IsScannerDescription, name, manufacturer, model, type, mime, "") { |
+ return |
+ arg.name == name && |
+ arg.manufacturer == manufacturer && |
+ arg.model == model && |
+ arg.scanner_type == type && |
+ arg.image_mime_type == mime; |
+} |
+ |
+MATCHER_P2(IsScannerProperties, mode, resolution, "") { |
+ return arg.mode == mode && arg.resolution_dpi == resolution; |
+} |
+ |
+TEST_F(DocumentScanInterfaceChromeosTest, ListScanners) { |
+ chromeos::LorgnetteManagerClient::ScannerTable scanners; |
+ const char kScannerName[] = "Monet"; |
+ chromeos::LorgnetteManagerClient::ScannerTableEntry entry; |
+ const char kScannerManufacturer[] = "Jacques-Louis David"; |
+ entry[lorgnette::kScannerPropertyManufacturer] = kScannerManufacturer; |
+ const char kScannerModel[] = "Le Havre"; |
+ entry[lorgnette::kScannerPropertyModel] = kScannerModel; |
+ const char kScannerType[] = "Impressionism"; |
+ entry[lorgnette::kScannerPropertyType] = kScannerType; |
+ scanners[kScannerName] = entry; |
+ EXPECT_CALL(*client_, ListScanners(_)) |
+ .WillOnce(InvokeListScannersCallback(true, scanners)); |
+ EXPECT_CALL(*this, OnListScannersResultReceived( |
+ testing::ElementsAre( |
+ IsScannerDescription(kScannerName, |
+ kScannerManufacturer, |
+ kScannerModel, |
+ kScannerType, |
+ "image/png")), "")); |
+ scan_interface_.ListScanners(base::Bind( |
+ &DocumentScanInterfaceChromeosTest::OnListScannersResultReceived, |
+ base::Unretained(this))); |
+} |
+ |
+TEST_F(DocumentScanInterfaceChromeosTest, ScanFailure) { |
+ const char kScannerName[] = "Monet"; |
+ const int kResolution = 4096; |
+ EXPECT_TRUE(base::ThreadTaskRunnerHandle::IsSet()); |
+ EXPECT_CALL(*client_, ScanImage( |
+ kScannerName, |
+ _, |
+ IsScannerProperties( |
+ lorgnette::kScanPropertyModeColor, |
+ kResolution), |
+ _)).WillOnce(InvokeScanCallback(false)); |
+ EXPECT_CALL(*this, OnScanCompleted("data:image/png;base64,", |
+ "image/png", |
+ "Image scan failed")); |
+ scan_interface_.Scan( |
+ kScannerName, |
+ DocumentScanInterface::kScanModeColor, |
+ kResolution, |
+ base::Bind( |
+ &DocumentScanInterfaceChromeosTest::OnScanCompleted, |
+ base::Unretained(this))); |
+} |
+ |
+TEST_F(DocumentScanInterfaceChromeosTest, ScanSuccess) { |
+ const char kScannerName[] = "Monet"; |
+ const int kResolution = 4096; |
+ EXPECT_TRUE(base::ThreadTaskRunnerHandle::IsSet()); |
+ EXPECT_CALL(*client_, |
+ ScanImage( |
+ kScannerName, |
+ _, |
+ IsScannerProperties( |
+ lorgnette::kScanPropertyModeColor, |
+ kResolution), |
+ _)) |
+ .WillOnce(testing::DoAll( |
+ InvokePipeReader(this, std::string("PrettyPicture")), |
+ InvokeScanCallback(true))); |
+ |
+ // Data URL plus base64 representation of "PrettyPicture". |
+ const char kExpectedImageData[] = |
+ "data:image/png;base64,UHJldHR5UGljdHVyZQ=="; |
+ |
+ EXPECT_CALL(*this, OnScanCompleted(kExpectedImageData, "image/png", "")); |
+ scan_interface_.Scan( |
+ kScannerName, |
+ DocumentScanInterface::kScanModeColor, |
+ kResolution, |
+ base::Bind( |
+ &DocumentScanInterfaceChromeosTest::OnScanCompleted, |
+ base::Unretained(this))); |
+} |
+ |
+} // namespace api |
+ |
+} // namespace extensions |