File: print_servers_policy_provider_unittest.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (131 lines) | stat: -rw-r--r-- 4,761 bytes parent folder | download | duplicates (6)
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