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 | |
| 7 | #include <chromeos/dbus/service_constants.h> |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 8 | #include <dbus/message.h> |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 9 | #include <dbus/mock_bus.h> |
| 10 | #include <dbus/mock_object_proxy.h> |
Jason Jeremy Iman | adffbcb | 2020-08-31 13:21:36 +0900 | [diff] [blame] | 11 | #include <dbus/object_path.h> |
| 12 | #include <gmock/gmock.h> |
| 13 | #include <gtest/gtest.h> |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 14 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 15 | #include "patchpanel/net_util.h" |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 16 | |
| 17 | namespace patchpanel { |
| 18 | |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 19 | using ::testing::_; |
| 20 | using ::testing::ByMove; |
| 21 | using ::testing::Return; |
| 22 | |
| 23 | namespace { |
| 24 | |
| 25 | scoped_refptr<dbus::MockBus> MockDBus() { |
| 26 | return new dbus::MockBus{dbus::Bus::Options{}}; |
| 27 | } |
| 28 | |
| 29 | scoped_refptr<dbus::MockObjectProxy> PatchPanelMockProxy(dbus::MockBus* dbus) { |
| 30 | return new dbus::MockObjectProxy(dbus, kPatchPanelServiceName, |
| 31 | dbus::ObjectPath(kPatchPanelServicePath)); |
| 32 | } |
| 33 | |
| 34 | } // namespace |
| 35 | |
| 36 | TEST(ClientTest, ConnectNamespace) { |
| 37 | auto dbus = MockDBus(); |
| 38 | auto proxy = PatchPanelMockProxy(dbus.get()); |
| 39 | pid_t pid = 3456; |
| 40 | std::string outboud_ifname = ""; |
| 41 | |
| 42 | Client client(dbus, proxy.get()); |
| 43 | |
| 44 | // Failure case |
| 45 | auto result = client.ConnectNamespace(pid, outboud_ifname, false); |
| 46 | EXPECT_FALSE(result.first.is_valid()); |
Hugo Benichi | 2fd0c6e | 2020-04-17 16:12:05 +0900 | [diff] [blame] | 47 | EXPECT_TRUE(result.second.peer_ifname().empty()); |
| 48 | EXPECT_TRUE(result.second.host_ifname().empty()); |
| 49 | EXPECT_EQ(0, result.second.peer_ipv4_address()); |
| 50 | EXPECT_EQ(0, result.second.host_ipv4_address()); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 51 | EXPECT_EQ(0, result.second.ipv4_subnet().base_addr()); |
| 52 | EXPECT_EQ(0, result.second.ipv4_subnet().prefix_len()); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 53 | |
| 54 | // Success case |
| 55 | patchpanel::ConnectNamespaceResponse response_proto; |
Hugo Benichi | 2fd0c6e | 2020-04-17 16:12:05 +0900 | [diff] [blame] | 56 | response_proto.set_peer_ifname("veth0"); |
| 57 | response_proto.set_host_ifname("arc_ns0"); |
| 58 | response_proto.set_peer_ipv4_address(Ipv4Addr(100, 115, 92, 130)); |
| 59 | response_proto.set_host_ipv4_address(Ipv4Addr(100, 115, 92, 129)); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 60 | auto* response_subnet = response_proto.mutable_ipv4_subnet(); |
| 61 | response_subnet->set_prefix_len(30); |
| 62 | response_subnet->set_base_addr(Ipv4Addr(100, 115, 92, 128)); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 63 | std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty(); |
| 64 | dbus::MessageWriter response_writer(response.get()); |
| 65 | response_writer.AppendProtoAsArrayOfBytes(response_proto); |
| 66 | EXPECT_CALL(*proxy, CallMethodAndBlock(_, _)) |
| 67 | .WillOnce(Return(ByMove(std::move(response)))); |
| 68 | |
| 69 | result = client.ConnectNamespace(pid, outboud_ifname, false); |
| 70 | EXPECT_TRUE(result.first.is_valid()); |
Hugo Benichi | 2fd0c6e | 2020-04-17 16:12:05 +0900 | [diff] [blame] | 71 | EXPECT_EQ("arc_ns0", result.second.host_ifname()); |
| 72 | EXPECT_EQ("veth0", result.second.peer_ifname()); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 73 | EXPECT_EQ(30, result.second.ipv4_subnet().prefix_len()); |
| 74 | EXPECT_EQ(Ipv4Addr(100, 115, 92, 128), |
| 75 | result.second.ipv4_subnet().base_addr()); |
Hugo Benichi | 2fd0c6e | 2020-04-17 16:12:05 +0900 | [diff] [blame] | 76 | EXPECT_EQ(Ipv4Addr(100, 115, 92, 129), result.second.host_ipv4_address()); |
| 77 | EXPECT_EQ(Ipv4Addr(100, 115, 92, 130), result.second.peer_ipv4_address()); |
Hugo Benichi | cc6850f | 2020-01-17 13:26:06 +0900 | [diff] [blame] | 78 | } |
| 79 | |
| 80 | } // namespace patchpanel |