blob: c577fda6126d75528f80f2f9f6ceb8c5d899276b [file] [log] [blame]
Hugo Benichicc6850f2020-01-17 13:26:06 +09001// 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
Jason Jeremy Imanadffbcb2020-08-31 13:21:36 +09005#include "patchpanel/dbus/client.h"
Hugo Benichicc6850f2020-01-17 13:26:06 +09006
Jie Jiange2e4c0b2020-09-16 18:48:43 +09007#include <base/bind.h>
Hugo Benichicc6850f2020-01-17 13:26:06 +09008#include <chromeos/dbus/service_constants.h>
Hugo Benichicc6850f2020-01-17 13:26:06 +09009#include <dbus/message.h>
Hugo Benichicc6850f2020-01-17 13:26:06 +090010#include <dbus/mock_bus.h>
11#include <dbus/mock_object_proxy.h>
Jason Jeremy Imanadffbcb2020-08-31 13:21:36 +090012#include <dbus/object_path.h>
13#include <gmock/gmock.h>
14#include <gtest/gtest.h>
Hugo Benichicc6850f2020-01-17 13:26:06 +090015
Garrick Evans3388a032020-03-24 11:25:55 +090016#include "patchpanel/net_util.h"
Hugo Benichicc6850f2020-01-17 13:26:06 +090017
18namespace patchpanel {
Jie Jiange2e4c0b2020-09-16 18:48:43 +090019namespace {
Hugo Benichicc6850f2020-01-17 13:26:06 +090020
Hugo Benichicc6850f2020-01-17 13:26:06 +090021using ::testing::_;
22using ::testing::ByMove;
23using ::testing::Return;
Jie Jiange2e4c0b2020-09-16 18:48:43 +090024using ::testing::SaveArg;
Hugo Benichicc6850f2020-01-17 13:26:06 +090025
Jie Jiange2e4c0b2020-09-16 18:48:43 +090026class ClientTest : public testing::Test {
27 protected:
28 ClientTest()
29 : dbus_(new dbus::MockBus{dbus::Bus::Options{}}),
30 proxy_(new dbus::MockObjectProxy(
31 dbus_.get(),
32 kPatchPanelServiceName,
33 dbus::ObjectPath(kPatchPanelServicePath))),
Jie Jiang81c84db2020-09-29 17:40:16 +090034 client_(Client::New(dbus_, proxy_.get())) {}
Hugo Benichicc6850f2020-01-17 13:26:06 +090035
Jie Jiange2e4c0b2020-09-16 18:48:43 +090036 scoped_refptr<dbus::MockBus> dbus_;
37 scoped_refptr<dbus::MockObjectProxy> proxy_;
Jie Jiang81c84db2020-09-29 17:40:16 +090038 std::unique_ptr<Client> client_;
Jie Jiange2e4c0b2020-09-16 18:48:43 +090039};
Hugo Benichicc6850f2020-01-17 13:26:06 +090040
Jie Jiange2e4c0b2020-09-16 18:48:43 +090041TEST_F(ClientTest, ConnectNamespace) {
Hugo Benichicc6850f2020-01-17 13:26:06 +090042 pid_t pid = 3456;
43 std::string outboud_ifname = "";
44
Hugo Benichicc6850f2020-01-17 13:26:06 +090045 // Failure case
Jie Jiang81c84db2020-09-29 17:40:16 +090046 auto result = client_->ConnectNamespace(pid, outboud_ifname, false);
Hugo Benichicc6850f2020-01-17 13:26:06 +090047 EXPECT_FALSE(result.first.is_valid());
Hugo Benichi2fd0c6e2020-04-17 16:12:05 +090048 EXPECT_TRUE(result.second.peer_ifname().empty());
49 EXPECT_TRUE(result.second.host_ifname().empty());
50 EXPECT_EQ(0, result.second.peer_ipv4_address());
51 EXPECT_EQ(0, result.second.host_ipv4_address());
Hugo Benichicc6850f2020-01-17 13:26:06 +090052 EXPECT_EQ(0, result.second.ipv4_subnet().base_addr());
53 EXPECT_EQ(0, result.second.ipv4_subnet().prefix_len());
Hugo Benichicc6850f2020-01-17 13:26:06 +090054
55 // Success case
56 patchpanel::ConnectNamespaceResponse response_proto;
Hugo Benichi2fd0c6e2020-04-17 16:12:05 +090057 response_proto.set_peer_ifname("veth0");
58 response_proto.set_host_ifname("arc_ns0");
59 response_proto.set_peer_ipv4_address(Ipv4Addr(100, 115, 92, 130));
60 response_proto.set_host_ipv4_address(Ipv4Addr(100, 115, 92, 129));
Hugo Benichicc6850f2020-01-17 13:26:06 +090061 auto* response_subnet = response_proto.mutable_ipv4_subnet();
62 response_subnet->set_prefix_len(30);
63 response_subnet->set_base_addr(Ipv4Addr(100, 115, 92, 128));
Hugo Benichicc6850f2020-01-17 13:26:06 +090064 std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
65 dbus::MessageWriter response_writer(response.get());
66 response_writer.AppendProtoAsArrayOfBytes(response_proto);
Jie Jiange2e4c0b2020-09-16 18:48:43 +090067 EXPECT_CALL(*proxy_, CallMethodAndBlock(_, _))
Hugo Benichicc6850f2020-01-17 13:26:06 +090068 .WillOnce(Return(ByMove(std::move(response))));
69
Jie Jiang81c84db2020-09-29 17:40:16 +090070 result = client_->ConnectNamespace(pid, outboud_ifname, false);
Hugo Benichicc6850f2020-01-17 13:26:06 +090071 EXPECT_TRUE(result.first.is_valid());
Hugo Benichi2fd0c6e2020-04-17 16:12:05 +090072 EXPECT_EQ("arc_ns0", result.second.host_ifname());
73 EXPECT_EQ("veth0", result.second.peer_ifname());
Hugo Benichicc6850f2020-01-17 13:26:06 +090074 EXPECT_EQ(30, result.second.ipv4_subnet().prefix_len());
75 EXPECT_EQ(Ipv4Addr(100, 115, 92, 128),
76 result.second.ipv4_subnet().base_addr());
Hugo Benichi2fd0c6e2020-04-17 16:12:05 +090077 EXPECT_EQ(Ipv4Addr(100, 115, 92, 129), result.second.host_ipv4_address());
78 EXPECT_EQ(Ipv4Addr(100, 115, 92, 130), result.second.peer_ipv4_address());
Hugo Benichicc6850f2020-01-17 13:26:06 +090079}
80
Jie Jiange2e4c0b2020-09-16 18:48:43 +090081TEST_F(ClientTest, RegisterNeighborEventHandler) {
82 static NeighborConnectedStateChangedSignal actual_signal_proto;
83 static int call_num = 0;
84 auto callback =
85 base::BindRepeating([](const NeighborConnectedStateChangedSignal& sig) {
86 call_num++;
87 actual_signal_proto = sig;
88 });
89
90 base::Callback<void(dbus::Signal * signal)> registered_dbus_callback;
91
92 EXPECT_CALL(*proxy_,
93 DoConnectToSignal(kPatchPanelInterface,
94 kNeighborConnectedStateChangedSignal, _, _))
95 .WillOnce(SaveArg<2>(&registered_dbus_callback));
Jie Jiang81c84db2020-09-29 17:40:16 +090096 client_->RegisterNeighborConnectedStateChangedHandler(callback);
Jie Jiange2e4c0b2020-09-16 18:48:43 +090097
98 NeighborConnectedStateChangedSignal signal_proto;
99 signal_proto.set_ifindex(1);
100 signal_proto.set_ip_addr("1.2.3.4");
101 signal_proto.set_role(NeighborConnectedStateChangedSignal::GATEWAY);
102 signal_proto.set_connected(false);
103 dbus::Signal signal(kPatchPanelInterface,
104 kNeighborConnectedStateChangedSignal);
105 dbus::MessageWriter writer(&signal);
106 writer.AppendProtoAsArrayOfBytes(signal_proto);
107
108 registered_dbus_callback.Run(&signal);
109
110 EXPECT_EQ(call_num, 1);
111 EXPECT_EQ(actual_signal_proto.ifindex(), signal_proto.ifindex());
112 EXPECT_EQ(actual_signal_proto.ip_addr(), signal_proto.ip_addr());
113 EXPECT_EQ(actual_signal_proto.role(), signal_proto.role());
114 EXPECT_EQ(actual_signal_proto.connected(), signal_proto.connected());
115}
116
117} // namespace
Hugo Benichicc6850f2020-01-17 13:26:06 +0900118} // namespace patchpanel