blob: b00a0f83214de13f5018a4a6e070245d7bd160be [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>
Woody Chowdee3c8b2020-12-04 20:03:54 +09008#include <base/test/task_environment.h>
9#include <base/threading/sequenced_task_runner_handle.h>
Hugo Benichicc6850f2020-01-17 13:26:06 +090010#include <chromeos/dbus/service_constants.h>
Hugo Benichicc6850f2020-01-17 13:26:06 +090011#include <dbus/message.h>
Hugo Benichicc6850f2020-01-17 13:26:06 +090012#include <dbus/mock_bus.h>
13#include <dbus/mock_object_proxy.h>
Jason Jeremy Imanadffbcb2020-08-31 13:21:36 +090014#include <dbus/object_path.h>
15#include <gmock/gmock.h>
16#include <gtest/gtest.h>
Hugo Benichicc6850f2020-01-17 13:26:06 +090017
Garrick Evans3388a032020-03-24 11:25:55 +090018#include "patchpanel/net_util.h"
Hugo Benichicc6850f2020-01-17 13:26:06 +090019
20namespace patchpanel {
Jie Jiange2e4c0b2020-09-16 18:48:43 +090021namespace {
Hugo Benichicc6850f2020-01-17 13:26:06 +090022
Hugo Benichicc6850f2020-01-17 13:26:06 +090023using ::testing::_;
24using ::testing::ByMove;
25using ::testing::Return;
Jie Jiange2e4c0b2020-09-16 18:48:43 +090026using ::testing::SaveArg;
Hugo Benichicc6850f2020-01-17 13:26:06 +090027
Jie Jiange2e4c0b2020-09-16 18:48:43 +090028class ClientTest : public testing::Test {
29 protected:
30 ClientTest()
31 : dbus_(new dbus::MockBus{dbus::Bus::Options{}}),
32 proxy_(new dbus::MockObjectProxy(
33 dbus_.get(),
34 kPatchPanelServiceName,
35 dbus::ObjectPath(kPatchPanelServicePath))),
Jie Jiang81c84db2020-09-29 17:40:16 +090036 client_(Client::New(dbus_, proxy_.get())) {}
Woody Chowdee3c8b2020-12-04 20:03:54 +090037 ~ClientTest() { dbus_->ShutdownAndBlock(); }
Hugo Benichicc6850f2020-01-17 13:26:06 +090038
Woody Chowdee3c8b2020-12-04 20:03:54 +090039 void SetUp() override {
40 EXPECT_CALL(*dbus_, GetDBusTaskRunner())
41 .WillRepeatedly(Return(base::SequencedTaskRunnerHandle::Get().get()));
42 }
43
44 base::test::TaskEnvironment task_environment_;
Jie Jiange2e4c0b2020-09-16 18:48:43 +090045 scoped_refptr<dbus::MockBus> dbus_;
46 scoped_refptr<dbus::MockObjectProxy> proxy_;
Jie Jiang81c84db2020-09-29 17:40:16 +090047 std::unique_ptr<Client> client_;
Jie Jiange2e4c0b2020-09-16 18:48:43 +090048};
Hugo Benichicc6850f2020-01-17 13:26:06 +090049
Jie Jiange2e4c0b2020-09-16 18:48:43 +090050TEST_F(ClientTest, ConnectNamespace) {
Hugo Benichicc6850f2020-01-17 13:26:06 +090051 pid_t pid = 3456;
Garrick Evans263bd952020-12-03 20:27:43 +090052 std::string outbound_ifname = "";
Hugo Benichicc6850f2020-01-17 13:26:06 +090053
Garrick Evans263bd952020-12-03 20:27:43 +090054 // Failure case - invalid pid
Garrick Evans58697022020-12-03 12:41:13 +090055 auto result = client_->ConnectNamespace(pid, outbound_ifname, false, true,
56 TrafficCounter::SYSTEM);
Hugo Benichicc6850f2020-01-17 13:26:06 +090057 EXPECT_FALSE(result.first.is_valid());
Hugo Benichi2fd0c6e2020-04-17 16:12:05 +090058 EXPECT_TRUE(result.second.peer_ifname().empty());
59 EXPECT_TRUE(result.second.host_ifname().empty());
60 EXPECT_EQ(0, result.second.peer_ipv4_address());
61 EXPECT_EQ(0, result.second.host_ipv4_address());
Hugo Benichicc6850f2020-01-17 13:26:06 +090062 EXPECT_EQ(0, result.second.ipv4_subnet().base_addr());
63 EXPECT_EQ(0, result.second.ipv4_subnet().prefix_len());
Hugo Benichicc6850f2020-01-17 13:26:06 +090064
Garrick Evans263bd952020-12-03 20:27:43 +090065 // Failure case - prohibited pid
Garrick Evans58697022020-12-03 12:41:13 +090066 result = client_->ConnectNamespace(1, outbound_ifname, false, true,
67 TrafficCounter::SYSTEM);
Garrick Evans263bd952020-12-03 20:27:43 +090068 EXPECT_FALSE(result.first.is_valid());
69
Hugo Benichicc6850f2020-01-17 13:26:06 +090070 // Success case
71 patchpanel::ConnectNamespaceResponse response_proto;
Hugo Benichi2fd0c6e2020-04-17 16:12:05 +090072 response_proto.set_peer_ifname("veth0");
73 response_proto.set_host_ifname("arc_ns0");
74 response_proto.set_peer_ipv4_address(Ipv4Addr(100, 115, 92, 130));
75 response_proto.set_host_ipv4_address(Ipv4Addr(100, 115, 92, 129));
Hugo Benichicc6850f2020-01-17 13:26:06 +090076 auto* response_subnet = response_proto.mutable_ipv4_subnet();
77 response_subnet->set_prefix_len(30);
78 response_subnet->set_base_addr(Ipv4Addr(100, 115, 92, 128));
Hugo Benichicc6850f2020-01-17 13:26:06 +090079 std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
80 dbus::MessageWriter response_writer(response.get());
81 response_writer.AppendProtoAsArrayOfBytes(response_proto);
Jie Jiange2e4c0b2020-09-16 18:48:43 +090082 EXPECT_CALL(*proxy_, CallMethodAndBlock(_, _))
Hugo Benichicc6850f2020-01-17 13:26:06 +090083 .WillOnce(Return(ByMove(std::move(response))));
84
Garrick Evans58697022020-12-03 12:41:13 +090085 result = client_->ConnectNamespace(pid, outbound_ifname, false, true,
86 TrafficCounter::SYSTEM);
Hugo Benichicc6850f2020-01-17 13:26:06 +090087 EXPECT_TRUE(result.first.is_valid());
Hugo Benichi2fd0c6e2020-04-17 16:12:05 +090088 EXPECT_EQ("arc_ns0", result.second.host_ifname());
89 EXPECT_EQ("veth0", result.second.peer_ifname());
Hugo Benichicc6850f2020-01-17 13:26:06 +090090 EXPECT_EQ(30, result.second.ipv4_subnet().prefix_len());
91 EXPECT_EQ(Ipv4Addr(100, 115, 92, 128),
92 result.second.ipv4_subnet().base_addr());
Hugo Benichi2fd0c6e2020-04-17 16:12:05 +090093 EXPECT_EQ(Ipv4Addr(100, 115, 92, 129), result.second.host_ipv4_address());
94 EXPECT_EQ(Ipv4Addr(100, 115, 92, 130), result.second.peer_ipv4_address());
Hugo Benichicc6850f2020-01-17 13:26:06 +090095}
96
Jie Jiange2e4c0b2020-09-16 18:48:43 +090097TEST_F(ClientTest, RegisterNeighborEventHandler) {
Jie Jiang25c1b972020-11-12 15:42:53 +090098 static NeighborReachabilityEventSignal actual_signal_proto;
Jie Jiange2e4c0b2020-09-16 18:48:43 +090099 static int call_num = 0;
100 auto callback =
Jie Jiang25c1b972020-11-12 15:42:53 +0900101 base::BindRepeating([](const NeighborReachabilityEventSignal& sig) {
Jie Jiange2e4c0b2020-09-16 18:48:43 +0900102 call_num++;
103 actual_signal_proto = sig;
104 });
105
106 base::Callback<void(dbus::Signal * signal)> registered_dbus_callback;
107
108 EXPECT_CALL(*proxy_,
109 DoConnectToSignal(kPatchPanelInterface,
Jie Jiang25c1b972020-11-12 15:42:53 +0900110 kNeighborReachabilityEventSignal, _, _))
Jie Jiange2e4c0b2020-09-16 18:48:43 +0900111 .WillOnce(SaveArg<2>(&registered_dbus_callback));
Jie Jiang25c1b972020-11-12 15:42:53 +0900112 client_->RegisterNeighborReachabilityEventHandler(callback);
Jie Jiange2e4c0b2020-09-16 18:48:43 +0900113
Jie Jiang25c1b972020-11-12 15:42:53 +0900114 NeighborReachabilityEventSignal signal_proto;
Jie Jiange2e4c0b2020-09-16 18:48:43 +0900115 signal_proto.set_ifindex(1);
116 signal_proto.set_ip_addr("1.2.3.4");
Jie Jiang25c1b972020-11-12 15:42:53 +0900117 signal_proto.set_role(NeighborReachabilityEventSignal::GATEWAY);
118 signal_proto.set_type(NeighborReachabilityEventSignal::FAILED);
119 dbus::Signal signal(kPatchPanelInterface, kNeighborReachabilityEventSignal);
Jie Jiange2e4c0b2020-09-16 18:48:43 +0900120 dbus::MessageWriter writer(&signal);
121 writer.AppendProtoAsArrayOfBytes(signal_proto);
122
123 registered_dbus_callback.Run(&signal);
124
125 EXPECT_EQ(call_num, 1);
126 EXPECT_EQ(actual_signal_proto.ifindex(), signal_proto.ifindex());
127 EXPECT_EQ(actual_signal_proto.ip_addr(), signal_proto.ip_addr());
128 EXPECT_EQ(actual_signal_proto.role(), signal_proto.role());
Jie Jiang25c1b972020-11-12 15:42:53 +0900129 EXPECT_EQ(actual_signal_proto.type(), signal_proto.type());
Jie Jiange2e4c0b2020-09-16 18:48:43 +0900130}
131
132} // namespace
Hugo Benichicc6850f2020-01-17 13:26:06 +0900133} // namespace patchpanel