|  | // Copyright 2022 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chrome/browser/ash/crosapi/document_scan_ash.h" | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/test/bind.h" | 
|  | #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" | 
|  | #include "chrome/browser/ash/scanning/fake_lorgnette_scanner_manager.h" | 
|  | #include "chrome/browser/ash/scanning/lorgnette_scanner_manager_factory.h" | 
|  | #include "chrome/test/base/testing_profile.h" | 
|  | #include "components/user_manager/scoped_user_manager.h" | 
|  | #include "content/public/test/browser_task_environment.h" | 
|  | #include "testing/gmock/include/gmock/gmock.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  | #include "third_party/abseil-cpp/absl/types/optional.h" | 
|  |  | 
|  | namespace crosapi { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | // Scanner name used for tests. | 
|  | constexpr char kTestScannerName[] = "Test Scanner"; | 
|  | constexpr char kVirtualUSBPrinterName[] = "DavieV Virtual USB Printer (USB)"; | 
|  |  | 
|  | // Creates a new FakeLorgnetteScannerManager for the given `context`. | 
|  | std::unique_ptr<KeyedService> BuildLorgnetteScannerManager( | 
|  | content::BrowserContext* context) { | 
|  | return std::make_unique<ash::FakeLorgnetteScannerManager>(); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | class DocumentScanAshTest : public testing::Test { | 
|  | public: | 
|  | void SetUp() override { | 
|  | ash::LorgnetteScannerManagerFactory::GetInstance()->SetTestingFactory( | 
|  | &profile_, base::BindRepeating(&BuildLorgnetteScannerManager)); | 
|  | } | 
|  |  | 
|  | std::unique_ptr<ash::FakeChromeUserManager> CreateLoggedInUser() { | 
|  | auto fake_user_manager = std::make_unique<ash::FakeChromeUserManager>(); | 
|  | const AccountId account_id = | 
|  | AccountId::FromUserEmail(profile_.GetProfileUserName()); | 
|  | const user_manager::User* user = | 
|  | fake_user_manager->AddUserWithAffiliationAndTypeAndProfile( | 
|  | account_id, | 
|  | /*is_affiliated=*/false, user_manager::USER_TYPE_REGULAR, | 
|  | &profile_); | 
|  | fake_user_manager->UserLoggedIn(account_id, user->username_hash(), | 
|  | /*browser_restart=*/false, | 
|  | /*is_child=*/false); | 
|  | fake_user_manager->SimulateUserProfileLoad(account_id); | 
|  | return fake_user_manager; | 
|  | } | 
|  |  | 
|  | ash::FakeLorgnetteScannerManager* GetLorgnetteScannerManager() { | 
|  | return static_cast<ash::FakeLorgnetteScannerManager*>( | 
|  | ash::LorgnetteScannerManagerFactory::GetForBrowserContext(&profile_)); | 
|  | } | 
|  |  | 
|  | DocumentScanAsh& document_scan_ash() { return document_scan_ash_; } | 
|  |  | 
|  | private: | 
|  | // Must outlive `profile_`. | 
|  | content::BrowserTaskEnvironment task_environment_; | 
|  |  | 
|  | // Must outlive `document_scan_ash_`. | 
|  | TestingProfile profile_; | 
|  |  | 
|  | DocumentScanAsh document_scan_ash_; | 
|  | }; | 
|  |  | 
|  | TEST_F(DocumentScanAshTest, NoScanners) { | 
|  | user_manager::ScopedUserManager scoped_user_manager(CreateLoggedInUser()); | 
|  |  | 
|  | base::RunLoop run_loop; | 
|  | GetLorgnetteScannerManager()->SetGetScannerNamesResponse({}); | 
|  | document_scan_ash().GetScannerNames(base::BindLambdaForTesting( | 
|  | [&](const std::vector<std::string>& scanner_names) { | 
|  | EXPECT_TRUE(scanner_names.empty()); | 
|  | run_loop.Quit(); | 
|  | })); | 
|  | run_loop.Run(); | 
|  | } | 
|  |  | 
|  | TEST_F(DocumentScanAshTest, SingleScanner) { | 
|  | user_manager::ScopedUserManager scoped_user_manager(CreateLoggedInUser()); | 
|  |  | 
|  | GetLorgnetteScannerManager()->SetGetScannerNamesResponse({kTestScannerName}); | 
|  | base::RunLoop run_loop; | 
|  | document_scan_ash().GetScannerNames(base::BindLambdaForTesting( | 
|  | [&](const std::vector<std::string>& scanner_names) { | 
|  | EXPECT_THAT(scanner_names, testing::ElementsAre(kTestScannerName)); | 
|  | run_loop.Quit(); | 
|  | })); | 
|  | run_loop.Run(); | 
|  | } | 
|  |  | 
|  | TEST_F(DocumentScanAshTest, MultipleScanner) { | 
|  | user_manager::ScopedUserManager scoped_user_manager(CreateLoggedInUser()); | 
|  |  | 
|  | GetLorgnetteScannerManager()->SetGetScannerNamesResponse( | 
|  | {kTestScannerName, kVirtualUSBPrinterName}); | 
|  | base::RunLoop run_loop; | 
|  | document_scan_ash().GetScannerNames(base::BindLambdaForTesting( | 
|  | [&](const std::vector<std::string>& scanner_names) { | 
|  | EXPECT_THAT( | 
|  | scanner_names, | 
|  | testing::ElementsAre(kTestScannerName, kVirtualUSBPrinterName)); | 
|  | run_loop.Quit(); | 
|  | })); | 
|  | run_loop.Run(); | 
|  | } | 
|  |  | 
|  | TEST_F(DocumentScanAshTest, InvalidScannerName) { | 
|  | user_manager::ScopedUserManager scoped_user_manager(CreateLoggedInUser()); | 
|  |  | 
|  | base::RunLoop run_loop; | 
|  | document_scan_ash().ScanFirstPage( | 
|  | "bad_scanner", base::BindLambdaForTesting( | 
|  | [&](mojom::ScanFailureMode failure_mode, | 
|  | const absl::optional<std::string>& scan_data) { | 
|  | EXPECT_EQ(failure_mode, | 
|  | mojom::ScanFailureMode::kDeviceBusy); | 
|  | EXPECT_FALSE(scan_data.has_value()); | 
|  | run_loop.Quit(); | 
|  | })); | 
|  | run_loop.Run(); | 
|  | } | 
|  |  | 
|  | TEST_F(DocumentScanAshTest, ScannerNoData) { | 
|  | user_manager::ScopedUserManager scoped_user_manager(CreateLoggedInUser()); | 
|  |  | 
|  | GetLorgnetteScannerManager()->SetGetScannerNamesResponse({kTestScannerName}); | 
|  | base::RunLoop run_loop; | 
|  | document_scan_ash().ScanFirstPage( | 
|  | kTestScannerName, base::BindLambdaForTesting( | 
|  | [&](mojom::ScanFailureMode failure_mode, | 
|  | const absl::optional<std::string>& scan_data) { | 
|  | EXPECT_EQ(failure_mode, | 
|  | mojom::ScanFailureMode::kDeviceBusy); | 
|  | EXPECT_FALSE(scan_data.has_value()); | 
|  | run_loop.Quit(); | 
|  | })); | 
|  | run_loop.Run(); | 
|  | } | 
|  |  | 
|  | TEST_F(DocumentScanAshTest, ScannerData) { | 
|  | user_manager::ScopedUserManager scoped_user_manager(CreateLoggedInUser()); | 
|  |  | 
|  | GetLorgnetteScannerManager()->SetGetScannerNamesResponse({kTestScannerName}); | 
|  | const std::vector<std::string> scan_data = {"PrettyPicture"}; | 
|  | GetLorgnetteScannerManager()->SetScanResponse(scan_data); | 
|  | base::RunLoop run_loop; | 
|  | document_scan_ash().ScanFirstPage( | 
|  | kTestScannerName, base::BindLambdaForTesting( | 
|  | [&](mojom::ScanFailureMode failure_mode, | 
|  | const absl::optional<std::string>& scan_data) { | 
|  | EXPECT_EQ(failure_mode, | 
|  | mojom::ScanFailureMode::kNoFailure); | 
|  | ASSERT_TRUE(scan_data.has_value()); | 
|  | EXPECT_EQ(scan_data.value(), "PrettyPicture"); | 
|  | run_loop.Quit(); | 
|  | })); | 
|  | run_loop.Run(); | 
|  | } | 
|  |  | 
|  | }  // namespace crosapi |