1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/chromeos/printing/server_printers_provider.h"
6 
7 #include <map>
8 #include <memory>
9 #include <string>
10 
11 #include "chrome/browser/chromeos/printing/print_server.h"
12 #include "chrome/browser/chromeos/printing/print_servers_provider.h"
13 #include "chrome/browser/chromeos/printing/print_servers_provider_factory.h"
14 #include "chrome/test/base/scoped_testing_local_state.h"
15 #include "chrome/test/base/testing_browser_process.h"
16 #include "components/policy/proto/chrome_device_policy.pb.h"
17 #include "components/user_manager/scoped_user_manager.h"
18 #include "content/public/test/browser_task_environment.h"
19 #include "net/test/embedded_test_server/embedded_test_server.h"
20 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
21 #include "services/network/test/test_url_loader_factory.h"
22 #include "testing/gmock/include/gmock/gmock.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24 #include "third_party/libipp/libipp/ipp.h"
25 
26 using ::testing::AllOf;
27 using ::testing::Property;
28 using ::testing::ResultOf;
29 using ::testing::UnorderedElementsAre;
30 
31 namespace chromeos {
32 
33 namespace {
34 
PrintServer1()35 chromeos::PrintServer PrintServer1() {
36   GURL url("http://192.168.1.5/printer");
37   chromeos::PrintServer print_server("id1", url, "LexaPrint");
38   return print_server;
39 }
40 
PrintServer2()41 chromeos::PrintServer PrintServer2() {
42   GURL url("https://print-server.intranet.example.com:443/ipp/cl2k4");
43   chromeos::PrintServer print_server("id2", url, "Color Laser");
44   return print_server;
45 }
46 
Printer1()47 Printer Printer1() {
48   Printer printer("server-20e91b728d4d04bc68132ced81772ef5");
49   printer.set_display_name("LexaPrint - Name");
50   std::string server("ipp://192.168.1.5:80");
51   printer.set_print_server_uri(server);
52   Uri url("ipp://192.168.1.5:80/printers/LexaPrint - Name");
53   printer.SetUri(url);
54   return printer;
55 }
56 
Printer2()57 Printer Printer2() {
58   Printer printer("server-5da95e01216b1fe0ee1de25dc8d0a6e8");
59   printer.set_display_name("Color Laser - Name");
60   std::string server("ipps://print-server.intranet.example.com");
61   printer.set_print_server_uri(server);
62   Uri url(
63       "ipps://print-server.intranet.example.com/printers/Color Laser - Name");
64   printer.SetUri(url);
65   return printer;
66 }
67 
68 }  // namespace
69 
__anon6e2f40980202(const PrinterDetector::DetectedPrinter& input) 70 auto GetPrinter = [](const PrinterDetector::DetectedPrinter& input) -> Printer {
71   return input.printer;
72 };
73 
PrinterMatcher(Printer printer)74 auto PrinterMatcher(Printer printer) {
75   return ResultOf(
76       GetPrinter,
77       AllOf(Property(&Printer::uri, printer.uri()),
78             Property(&Printer::print_server_uri, printer.print_server_uri()),
79             Property(&Printer::display_name, printer.display_name())));
80 }
81 
82 class ServerPrintersProviderTest : public ::testing::Test {
83  public:
ServerPrintersProviderTest()84   ServerPrintersProviderTest()
85       : test_shared_loader_factory_(
86             base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
87                 &test_url_loader_factory_)) {}
88 
89  protected:
SetUp()90   void SetUp() override {
91     TestingBrowserProcess::GetGlobal()->SetSharedURLLoaderFactory(
92         test_shared_loader_factory_);
93 
94     ASSERT_TRUE(test_server_.Start());
95 
96     server_printers_provider_ = ServerPrintersProvider::Create();
97   }
98 
TearDown()99   void TearDown() override { PrintServersProviderFactory::Get()->Shutdown(); }
100 
CreateResponse(const std::string & name,const std::string & description)101   std::string CreateResponse(const std::string& name,
102                              const std::string& description) {
103     ipp::Response_CUPS_Get_Printers response;
104     response.printer_attributes[0].printer_name.Set(
105         ipp::StringWithLanguage(name, "us-EN"));
106     response.printer_attributes[0].printer_info.Set(
107         ipp::StringWithLanguage(description, "us-EN"));
108     ipp::Server server(ipp::Version::_1_1, 1);
109     server.BuildResponseFrom(&response);
110     std::vector<uint8_t> bin_data;
111     EXPECT_TRUE(server.WriteResponseFrameTo(&bin_data));
112     std::string response_body(bin_data.begin(), bin_data.end());
113     return response_body;
114   }
115 
OnServersChanged(bool is_complete,std::vector<chromeos::PrintServer> print_servers)116   void OnServersChanged(bool is_complete,
117                         std::vector<chromeos::PrintServer> print_servers) {
118     std::map<GURL, chromeos::PrintServer> new_print_servers;
119     for (auto& print_server : print_servers) {
120       new_print_servers.emplace(print_server.GetUrl(), print_server);
121     }
122     server_printers_provider_->OnServersChanged(is_complete, new_print_servers);
123   }
124 
125   // Everything must be called on Chrome_UIThread.
126   content::BrowserTaskEnvironment task_environment_;
127 
128   network::TestURLLoaderFactory test_url_loader_factory_;
129 
130   scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
131       test_shared_loader_factory_;
132 
133   net::test_server::EmbeddedTestServer test_server_;
134 
135   std::unique_ptr<ServerPrintersProvider> server_printers_provider_;
136 };
137 
TEST_F(ServerPrintersProviderTest,GetPrinters)138 TEST_F(ServerPrintersProviderTest, GetPrinters) {
139   test_url_loader_factory_.AddResponse(
140       "http://192.168.1.5/printer",
141       CreateResponse("LexaPrint - Name", "LexaPrint Description"));
142   test_url_loader_factory_.AddResponse(
143       "https://print-server.intranet.example.com:443/ipp/cl2k4",
144       CreateResponse("Color Laser - Name", "Color Laser Description"));
145 
146   EXPECT_TRUE(server_printers_provider_->GetPrinters().empty());
147 
148   std::vector<PrintServer> print_servers;
149   print_servers.push_back(PrintServer1());
150   print_servers.push_back(PrintServer2());
151   OnServersChanged(true, print_servers);
152   task_environment_.RunUntilIdle();
153 
154   auto first = server_printers_provider_->GetPrinters().front();
155 
156   LOG(INFO) << first.printer.uri().GetNormalized()
157             << " server:" << first.printer.print_server_uri()
158             << " name:" << first.printer.display_name();
159 
160   EXPECT_THAT(server_printers_provider_->GetPrinters(),
161               UnorderedElementsAre(PrinterMatcher(Printer1()),
162                                    PrinterMatcher(Printer2())));
163 }
164 
165 }  // namespace chromeos
166