blob: 8d76946a281a681b46d93c2e532c6774a53d25be [file] [log] [blame]
// Copyright 2019 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/ui/webui/settings/chromeos/cups_printers_handler.h"
#include <memory>
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/json/json_string_value_serializer.h"
#include "chrome/test/base/testing_profile.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/debug_daemon_client.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "content/public/test/test_web_ui.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace settings {
class CupsPrintersHandlerTest;
namespace {
// Converts JSON string to base::ListValue object.
// On failure, returns NULL and fills |*error| string.
std::unique_ptr<base::ListValue> GetJSONAsListValue(const std::string& json,
std::string* error) {
auto ret = base::ListValue::From(
JSONStringValueDeserializer(json).Deserialize(nullptr, error));
if (!ret)
*error = "Value is not a list.";
return ret;
}
} // namespace
// Callback used for testing CupsAddAutoConfiguredPrinter().
void AddedPrinter(int32_t status) {
ASSERT_EQ(status, 0);
}
// Callback used for testing CupsRemovePrinter().
void RemovedPrinter(bool* expected, bool result) {
EXPECT_EQ(*expected, result);
}
class FakePrinterConfigurer : public PrinterConfigurer {
public:
void SetUpPrinter(const Printer& printer,
PrinterSetupCallback callback) override {}
};
class FakeCupsPrintersManager : public CupsPrintersManager {
public:
FakeCupsPrintersManager() = default;
std::vector<Printer> GetPrinters(PrinterClass printer_class) const override {
return {};
}
void RemoveUnavailablePrinters(std::vector<Printer>*) const override {}
void UpdateSavedPrinter(const Printer& printer) override {}
void RemoveSavedPrinter(const std::string& printer_id) override {}
void AddObserver(CupsPrintersManager::Observer* observer) override {}
void RemoveObserver(CupsPrintersManager::Observer* observer) override {}
void PrinterInstalled(const Printer& printer, bool is_automatic) override {}
void RecordSetupAbandoned(const Printer& printer) override {}
bool IsPrinterInstalled(const Printer& printer) const override {
return false;
}
std::unique_ptr<Printer> GetPrinter(const std::string& id) const override {
return std::make_unique<Printer>();
}
};
class FakePpdProvider : public PpdProvider {
public:
FakePpdProvider() = default;
void ResolveManufacturers(ResolveManufacturersCallback cb) override {}
void ResolvePrinters(const std::string& manufacturer,
ResolvePrintersCallback cb) override {}
void ResolvePpdReference(const PrinterSearchData& search_data,
ResolvePpdReferenceCallback cb) override {}
void ResolvePpd(const Printer::PpdReference& reference,
ResolvePpdCallback cb) override {}
void ReverseLookup(const std::string& effective_make_and_model,
ReverseLookupCallback cb) override {}
private:
~FakePpdProvider() override {}
};
class CupsPrintersHandlerTest : public testing::Test {
public:
CupsPrintersHandlerTest() = default;
~CupsPrintersHandlerTest() override = default;
void SetUp() override {
printers_handler_ = CupsPrintersHandler::CreateForTesting(
&profile_, base::MakeRefCounted<FakePpdProvider>(),
std::make_unique<FakePrinterConfigurer>(), &printers_manager_);
printers_handler_->SetWebUIForTest(&web_ui_);
printers_handler_->RegisterMessages();
}
protected:
// Must outlive |profile_|.
content::TestBrowserThreadBundle thread_bundle_;
TestingProfile profile_;
content::TestWebUI web_ui_;
std::unique_ptr<CupsPrintersHandler> printers_handler_;
FakeCupsPrintersManager printers_manager_;
};
TEST_F(CupsPrintersHandlerTest, RemoveCorrectPrinter) {
DBusThreadManager::Initialize();
DebugDaemonClient* client = DBusThreadManager::Get()->GetDebugDaemonClient();
client->CupsAddAutoConfiguredPrinter("testprinter1", "fakeuri",
base::BindOnce(&AddedPrinter));
const std::string remove_list = R"(
["testprinter1", "Test Printer 1"]
)";
std::string error;
std::unique_ptr<base::ListValue> remove_printers(
GetJSONAsListValue(remove_list, &error));
ASSERT_TRUE(remove_printers) << "Error deserializing list: " << error;
web_ui_.HandleReceivedMessage("removeCupsPrinter", remove_printers.get());
// We expect this printer removal to fail since the printer should have
// already been removed by the previous call to 'removeCupsPrinter'.
bool expected = false;
client->CupsRemovePrinter("testprinter1",
base::BindRepeating(&RemovedPrinter, &expected),
base::DoNothing());
thread_bundle_.RunUntilIdle();
}
} // namespace settings.
} // namespace chromeos.