blob: efbdbc0f28f14c265e064f850f238b970c33274a [file] [log] [blame]
Andreea Costinas44cefa22020-03-09 09:07:39 +01001// Copyright 2020 The Chromium OS 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 "system-proxy/server_proxy.h"
6
7#include <netinet/in.h>
8
9#include <gmock/gmock.h>
10#include <gtest/gtest.h>
11#include <utility>
12
13#include <base/bind.h>
14#include <base/bind_helpers.h>
15#include <base/callback_helpers.h>
16#include <base/files/file_util.h>
17#include <base/files/scoped_file.h>
18#include <base/message_loop/message_loop.h>
19#include <brillo/dbus/async_event_sequencer.h>
20#include <brillo/dbus/dbus_object.h>
21#include <brillo/message_loops/base_message_loop.h>
22
23#include "bindings/worker_common.pb.h"
24#include "system-proxy/protobuf_util.h"
25
26namespace system_proxy {
27namespace {
28constexpr char kUser[] = "proxy_user";
29constexpr char kPassword[] = "proxy_password";
30constexpr int kTestPort = 3128;
31} // namespace
32
33using ::testing::Return;
34
35class MockServerProxy : public ServerProxy {
36 public:
37 explicit MockServerProxy(base::OnceClosure quit_closure)
38 : ServerProxy(std::move(quit_closure)) {}
39 MockServerProxy(const MockServerProxy&) = delete;
40 MockServerProxy& operator=(const MockServerProxy&) = delete;
41 ~MockServerProxy() override = default;
42
43 MOCK_METHOD(int, GetStdinPipe, (), (override));
44};
45
46class ServerProxyTest : public ::testing::Test {
47 public:
48 ServerProxyTest() {
49 server_proxy_ =
50 std::make_unique<MockServerProxy>(brillo_loop_.QuitClosure());
51 }
52
53 ServerProxyTest(const ServerProxyTest&) = delete;
54 ServerProxyTest& operator=(const ServerProxyTest&) = delete;
55 ~ServerProxyTest() override {}
56
57 protected:
58 void RedirectStdPipes() {
59 int fds[2];
60 CHECK(base::CreateLocalNonBlockingPipe(fds));
61 read_scoped_fd_.reset(fds[0]);
62 write_scoped_fd_.reset(fds[1]);
63 EXPECT_CALL(*server_proxy_, GetStdinPipe())
64 .WillRepeatedly(Return(read_scoped_fd_.get()));
65
66 server_proxy_->Init();
67 }
68 // SystemProxyAdaptor instance that creates fake worker processes.
69 std::unique_ptr<MockServerProxy> server_proxy_;
70 base::MessageLoopForIO loop_;
71 brillo::BaseMessageLoop brillo_loop_{&loop_};
72 base::ScopedFD read_scoped_fd_, write_scoped_fd_;
73};
74
75TEST_F(ServerProxyTest, FetchCredentials) {
76 Credentials credentials;
77 credentials.set_username(kUser);
78 credentials.set_password(kPassword);
79 WorkerConfigs configs;
80 *configs.mutable_credentials() = credentials;
81 RedirectStdPipes();
82
83 EXPECT_TRUE(WriteProtobuf(write_scoped_fd_.get(), configs));
84
85 brillo_loop_.RunOnce(false);
86
87 EXPECT_EQ(server_proxy_->username_, kUser);
88 EXPECT_EQ(server_proxy_->password_, kPassword);
89}
90
91TEST_F(ServerProxyTest, FetchListeningAddress) {
92 SocketAddress address;
93 address.set_addr(INADDR_ANY);
94 address.set_port(kTestPort);
95 WorkerConfigs configs;
96 *configs.mutable_listening_address() = address;
97 RedirectStdPipes();
98 // Redirect the worker stdin and stdout pipes.
99
100 EXPECT_TRUE(WriteProtobuf(write_scoped_fd_.get(), configs));
101 brillo_loop_.RunOnce(false);
102
103 EXPECT_EQ(server_proxy_->listening_addr_, INADDR_ANY);
104 EXPECT_EQ(server_proxy_->listening_port_, kTestPort);
105}
106
107} // namespace system_proxy