1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
// Copyright 2023 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/printing/enterprise/print_servers_policy_provider.h"
#include <map>
#include <memory>
#include <optional>
#include <vector>
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ash/printing/print_server.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace ash {
namespace {
PrintServer CreatePrintServer(std::string id,
std::string server_url,
std::string name) {
GURL url(server_url);
PrintServer print_server(id, url, name);
return print_server;
}
void RecordPrintServers(std::vector<PrintServer>& result,
bool is_complete,
std::map<GURL, PrintServer> print_servers,
ServerPrintersFetchingMode fetching_mode) {
result.clear();
for (const auto& [url, print_server] : print_servers) {
result.push_back(print_server);
}
}
class FakePrintServersProvider : public PrintServersProvider {
public:
FakePrintServersProvider() = default;
~FakePrintServersProvider() override = default;
void AddObserver(Observer* observer) override { observer_ = observer; }
void RemoveObserver(Observer* observer) override { observer_ = nullptr; }
void SetData(std::unique_ptr<std::string> data) override {}
void SetAllowlistPref(PrefService* prefs,
const std::string& allowlist_pref) override {}
void ClearData() override {}
std::optional<std::vector<PrintServer>> GetPrintServers() override {
return print_servers_;
}
base::WeakPtr<PrintServersProvider> AsWeakPtr() override {
return weak_ptr_factory_.GetWeakPtr();
}
void SetPrintServers(std::optional<std::vector<PrintServer>> print_servers) {
print_servers_ = print_servers;
if (observer_) {
observer_->OnServersChanged(print_servers.has_value(),
print_servers.value());
}
}
private:
std::optional<std::vector<PrintServer>> print_servers_;
raw_ptr<PrintServersProvider::Observer> observer_ = nullptr;
base::WeakPtrFactory<FakePrintServersProvider> weak_ptr_factory_{this};
};
TEST(PrintServersPolicyProvider, UserAndDevicePrintServersAreProvided) {
std::vector<PrintServer> user_print_servers;
user_print_servers.push_back(
CreatePrintServer("1", "ipp://localhost:631", "CUPS"));
user_print_servers.push_back(
CreatePrintServer("2", "ipp://localhost:632", "CUPS"));
std::vector<PrintServer> device_print_servers;
device_print_servers.push_back(
CreatePrintServer("2", "ipp://localhost:632", "CUPS"));
device_print_servers.push_back(
CreatePrintServer("3", "ipp://localhost:633", "CUPS"));
FakePrintServersProvider user_policy_provider;
FakePrintServersProvider device_policy_provider;
auto print_servers_policy_provider =
PrintServersPolicyProvider::CreateForTesting(
user_policy_provider.AsWeakPtr(), device_policy_provider.AsWeakPtr());
std::vector<PrintServer> result;
print_servers_policy_provider->SetListener(
base::BindRepeating(&RecordPrintServers, std::ref(result)));
user_policy_provider.SetPrintServers(user_print_servers);
device_policy_provider.SetPrintServers(device_print_servers);
EXPECT_THAT(result,
testing::UnorderedElementsAre(
CreatePrintServer("1", "ipp://localhost:631", "CUPS"),
CreatePrintServer("2", "ipp://localhost:632", "CUPS"),
CreatePrintServer("3", "ipp://localhost:633", "CUPS")));
}
// This is a regression test for b/287922784.
TEST(PrintServersPolicyProvider, ListenerIsSetAfterPrintServersAreReady) {
FakePrintServersProvider user_policy_provider;
FakePrintServersProvider device_policy_provider;
std::vector<PrintServer> user_print_servers;
auto user_print_server =
CreatePrintServer("1", "ipp://localhost:631", "CUPS");
user_print_servers.push_back(user_print_server);
user_policy_provider.SetPrintServers(user_print_servers);
auto print_servers_policy_provider =
PrintServersPolicyProvider::CreateForTesting(
user_policy_provider.AsWeakPtr(), device_policy_provider.AsWeakPtr());
std::vector<PrintServer> result;
print_servers_policy_provider->SetListener(
base::BindRepeating(&RecordPrintServers, std::ref(result)));
EXPECT_THAT(result, testing::UnorderedElementsAre(CreatePrintServer(
"1", "ipp://localhost:631", "CUPS")));
}
} // namespace
} // namespace ash
|