Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 1 | // 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 Iman | adffbcb | 2020-08-31 13:21:36 +0900 | [diff] [blame] | 5 | #include "patchpanel/dbus/client.h" |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 6 | |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 7 | #include <base/bind.h> |
Woody Chow | dee3c8b | 2020-12-04 20:03:54 +0900 | [diff] [blame] | 8 | #include <base/test/task_environment.h> |
| 9 | #include <base/threading/sequenced_task_runner_handle.h> |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 10 | #include <chromeos/dbus/service_constants.h> |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 11 | #include <dbus/message.h> |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 12 | #include <dbus/mock_bus.h> |
| 13 | #include <dbus/mock_object_proxy.h> |
Jason Jeremy Iman | adffbcb | 2020-08-31 13:21:36 +0900 | [diff] [blame] | 14 | #include <dbus/object_path.h> |
| 15 | #include <gmock/gmock.h> |
| 16 | #include <gtest/gtest.h> |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 17 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 18 | #include "patchpanel/net_util.h" |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 19 | |
| 20 | namespace patchpanel { |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 21 | namespace { |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 22 | |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 23 | using ::testing::_; |
| 24 | using ::testing::ByMove; |
| 25 | using ::testing::Return; |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 26 | using ::testing::SaveArg; |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 27 | |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 28 | class 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 Jiang | 81c84db | 2020-09-29 17:40:16 +0900 | [diff] [blame] | 36 | client_(Client::New(dbus_, proxy_.get())) {} |
Woody Chow | dee3c8b | 2020-12-04 20:03:54 +0900 | [diff] [blame] | 37 | ~ClientTest() { dbus_->ShutdownAndBlock(); } |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 38 | |
Woody Chow | dee3c8b | 2020-12-04 20:03:54 +0900 | [diff] [blame] | 39 | void SetUp() override { |
| 40 | EXPECT_CALL(*dbus_, GetDBusTaskRunner()) |
| 41 | .WillRepeatedly(Return(base::SequencedTaskRunnerHandle::Get().get())); |
| 42 | } |
| 43 | |
| 44 | base::test::TaskEnvironment task_environment_; |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 45 | scoped_refptr<dbus::MockBus> dbus_; |
| 46 | scoped_refptr<dbus::MockObjectProxy> proxy_; |
Jie Jiang | 81c84db | 2020-09-29 17:40:16 +0900 | [diff] [blame] | 47 | std::unique_ptr<Client> client_; |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 48 | }; |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 49 | |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 50 | TEST_F(ClientTest, ConnectNamespace) { |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 51 | pid_t pid = 3456; |
Garrick Evans | 263bd95 | 2020-12-03 20:27:43 +0900 | [diff] [blame] | 52 | std::string outbound_ifname = ""; |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 53 | |
Garrick Evans | 263bd95 | 2020-12-03 20:27:43 +0900 | [diff] [blame] | 54 | // Failure case - invalid pid |
Garrick Evans | 5869702 | 2020-12-03 12:41:13 +0900 | [diff] [blame] | 55 | auto result = client_->ConnectNamespace(pid, outbound_ifname, false, true, |
| 56 | TrafficCounter::SYSTEM); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 57 | EXPECT_FALSE(result.first.is_valid()); |
Hugo Benichi | 2fd0c6e | 2020-04-17 16:12:05 +0900 | [diff] [blame] | 58 | 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 Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 62 | EXPECT_EQ(0, result.second.ipv4_subnet().base_addr()); |
| 63 | EXPECT_EQ(0, result.second.ipv4_subnet().prefix_len()); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 64 | |
Garrick Evans | 263bd95 | 2020-12-03 20:27:43 +0900 | [diff] [blame] | 65 | // Failure case - prohibited pid |
Garrick Evans | 5869702 | 2020-12-03 12:41:13 +0900 | [diff] [blame] | 66 | result = client_->ConnectNamespace(1, outbound_ifname, false, true, |
| 67 | TrafficCounter::SYSTEM); |
Garrick Evans | 263bd95 | 2020-12-03 20:27:43 +0900 | [diff] [blame] | 68 | EXPECT_FALSE(result.first.is_valid()); |
| 69 | |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 70 | // Success case |
| 71 | patchpanel::ConnectNamespaceResponse response_proto; |
Hugo Benichi | 2fd0c6e | 2020-04-17 16:12:05 +0900 | [diff] [blame] | 72 | 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 Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 76 | 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 Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 79 | std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty(); |
| 80 | dbus::MessageWriter response_writer(response.get()); |
| 81 | response_writer.AppendProtoAsArrayOfBytes(response_proto); |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 82 | EXPECT_CALL(*proxy_, CallMethodAndBlock(_, _)) |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 83 | .WillOnce(Return(ByMove(std::move(response)))); |
| 84 | |
Garrick Evans | 5869702 | 2020-12-03 12:41:13 +0900 | [diff] [blame] | 85 | result = client_->ConnectNamespace(pid, outbound_ifname, false, true, |
| 86 | TrafficCounter::SYSTEM); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 87 | EXPECT_TRUE(result.first.is_valid()); |
Hugo Benichi | 2fd0c6e | 2020-04-17 16:12:05 +0900 | [diff] [blame] | 88 | EXPECT_EQ("arc_ns0", result.second.host_ifname()); |
| 89 | EXPECT_EQ("veth0", result.second.peer_ifname()); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 90 | 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 Benichi | 2fd0c6e | 2020-04-17 16:12:05 +0900 | [diff] [blame] | 93 | 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 Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 95 | } |
| 96 | |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 97 | TEST_F(ClientTest, RegisterNeighborEventHandler) { |
Jie Jiang | 25c1b97 | 2020-11-12 15:42:53 +0900 | [diff] [blame] | 98 | static NeighborReachabilityEventSignal actual_signal_proto; |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 99 | static int call_num = 0; |
| 100 | auto callback = |
Jie Jiang | 25c1b97 | 2020-11-12 15:42:53 +0900 | [diff] [blame] | 101 | base::BindRepeating([](const NeighborReachabilityEventSignal& sig) { |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 102 | 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 Jiang | 25c1b97 | 2020-11-12 15:42:53 +0900 | [diff] [blame] | 110 | kNeighborReachabilityEventSignal, _, _)) |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 111 | .WillOnce(SaveArg<2>(®istered_dbus_callback)); |
Jie Jiang | 25c1b97 | 2020-11-12 15:42:53 +0900 | [diff] [blame] | 112 | client_->RegisterNeighborReachabilityEventHandler(callback); |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 113 | |
Jie Jiang | 25c1b97 | 2020-11-12 15:42:53 +0900 | [diff] [blame] | 114 | NeighborReachabilityEventSignal signal_proto; |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 115 | signal_proto.set_ifindex(1); |
| 116 | signal_proto.set_ip_addr("1.2.3.4"); |
Jie Jiang | 25c1b97 | 2020-11-12 15:42:53 +0900 | [diff] [blame] | 117 | signal_proto.set_role(NeighborReachabilityEventSignal::GATEWAY); |
| 118 | signal_proto.set_type(NeighborReachabilityEventSignal::FAILED); |
| 119 | dbus::Signal signal(kPatchPanelInterface, kNeighborReachabilityEventSignal); |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 120 | 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 Jiang | 25c1b97 | 2020-11-12 15:42:53 +0900 | [diff] [blame] | 129 | EXPECT_EQ(actual_signal_proto.type(), signal_proto.type()); |
Jie Jiang | e2e4c0b | 2020-09-16 18:48:43 +0900 | [diff] [blame] | 130 | } |
| 131 | |
| 132 | } // namespace |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 133 | } // namespace patchpanel |