| Ratan Gupta | c9645fe | 2017-08-23 16:53:52 +0530 | [diff] [blame] | 1 | #include "config_parser.hpp" | 
| Ratan Gupta | 5978dd1 | 2017-07-25 13:47:13 +0530 | [diff] [blame] | 2 | #include "ipaddress.hpp" | 
| Ratan Gupta | 3529717 | 2018-11-28 18:40:16 +0530 | [diff] [blame] | 3 | #include "mock_network_manager.hpp" | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 4 | #include "mock_syscall.hpp" | 
| William A. Kennington III | cb64b99 | 2019-04-21 18:45:07 -0700 | [diff] [blame] | 5 | #include "util.hpp" | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 6 |  | 
| Ratan Gupta | 255d514 | 2017-08-10 09:02:08 +0530 | [diff] [blame] | 7 | #include <arpa/inet.h> | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 8 | #include <net/if.h> | 
 | 9 | #include <netinet/in.h> | 
| Ratan Gupta | 255d514 | 2017-08-10 09:02:08 +0530 | [diff] [blame] | 10 | #include <stdlib.h> | 
 | 11 |  | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 12 | #include <exception> | 
| Ratan Gupta | c9645fe | 2017-08-23 16:53:52 +0530 | [diff] [blame] | 13 | #include <fstream> | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 14 | #include <sdbusplus/bus.hpp> | 
| William A. Kennington III | 84bfe67 | 2022-07-13 14:15:30 -0700 | [diff] [blame] | 15 | #include <stdplus/gtest/tmp.hpp> | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 16 |  | 
 | 17 | #include <gtest/gtest.h> | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 18 |  | 
 | 19 | namespace phosphor | 
 | 20 | { | 
 | 21 | namespace network | 
 | 22 | { | 
 | 23 |  | 
| William A. Kennington III | 84bfe67 | 2022-07-13 14:15:30 -0700 | [diff] [blame] | 24 | class TestEthernetInterface : public stdplus::gtest::TestWithTmp | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 25 | { | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 26 |   public: | 
| Patrick Williams | c38b071 | 2022-07-22 19:26:54 -0500 | [diff] [blame] | 27 |     sdbusplus::bus_t bus; | 
| William A. Kennington III | 84bfe67 | 2022-07-13 14:15:30 -0700 | [diff] [blame] | 28 |     std::string confDir; | 
| Ratan Gupta | 3529717 | 2018-11-28 18:40:16 +0530 | [diff] [blame] | 29 |     MockManager manager; | 
| Manojkiran Eda | acd6dd5 | 2019-10-15 15:00:51 +0530 | [diff] [blame] | 30 |     MockEthernetInterface interface; | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 31 |     TestEthernetInterface() : | 
| William A. Kennington III | 84bfe67 | 2022-07-13 14:15:30 -0700 | [diff] [blame] | 32 |         bus(sdbusplus::bus::new_default()), confDir(CaseTmpDir()), | 
 | 33 |         manager(bus, "/xyz/openbmc_test/network", confDir), | 
| William A. Kennington III | ebb1ad0 | 2019-04-21 18:02:49 -0700 | [diff] [blame] | 34 |         interface(makeInterface(bus, manager)) | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 35 |  | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 36 |     { | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 37 |     } | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 38 |  | 
| William A. Kennington III | cb64b99 | 2019-04-21 18:45:07 -0700 | [diff] [blame] | 39 |     static constexpr ether_addr mac{0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; | 
 | 40 |  | 
| Patrick Williams | c38b071 | 2022-07-22 19:26:54 -0500 | [diff] [blame] | 41 |     static MockEthernetInterface makeInterface(sdbusplus::bus_t& bus, | 
| Manojkiran Eda | acd6dd5 | 2019-10-15 15:00:51 +0530 | [diff] [blame] | 42 |                                                MockManager& manager) | 
| William A. Kennington III | ebb1ad0 | 2019-04-21 18:02:49 -0700 | [diff] [blame] | 43 |     { | 
| William A. Kennington III | 862275a | 2019-04-22 20:37:08 -0700 | [diff] [blame] | 44 |         mock_clear(); | 
| William A. Kennington III | cb64b99 | 2019-04-21 18:45:07 -0700 | [diff] [blame] | 45 |         mock_addIF("test0", 1, mac); | 
| Johnathan Mantey | 817012a | 2020-01-30 15:07:39 -0800 | [diff] [blame] | 46 |         return {bus, "/xyz/openbmc_test/network/test0", | 
 | 47 |                 EthernetInterface::DHCPConf::none, manager, true}; | 
| William A. Kennington III | ebb1ad0 | 2019-04-21 18:02:49 -0700 | [diff] [blame] | 48 |     } | 
 | 49 |  | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 50 |     int countIPObjects() | 
 | 51 |     { | 
 | 52 |         return interface.getAddresses().size(); | 
 | 53 |     } | 
 | 54 |  | 
 | 55 |     bool isIPObjectExist(const std::string& ipaddress) | 
 | 56 |     { | 
 | 57 |         auto address = interface.getAddresses().find(ipaddress); | 
 | 58 |         if (address == interface.getAddresses().end()) | 
| Ratan Gupta | 255d514 | 2017-08-10 09:02:08 +0530 | [diff] [blame] | 59 |         { | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 60 |             return false; | 
| Ratan Gupta | 255d514 | 2017-08-10 09:02:08 +0530 | [diff] [blame] | 61 |         } | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 62 |         return true; | 
 | 63 |     } | 
| Ratan Gupta | 255d514 | 2017-08-10 09:02:08 +0530 | [diff] [blame] | 64 |  | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 65 |     bool deleteIPObject(const std::string& ipaddress) | 
 | 66 |     { | 
 | 67 |         auto address = interface.getAddresses().find(ipaddress); | 
 | 68 |         if (address == interface.getAddresses().end()) | 
| Ratan Gupta | 255d514 | 2017-08-10 09:02:08 +0530 | [diff] [blame] | 69 |         { | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 70 |             return false; | 
| Ratan Gupta | 255d514 | 2017-08-10 09:02:08 +0530 | [diff] [blame] | 71 |         } | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 72 |         address->second->delete_(); | 
 | 73 |         return true; | 
 | 74 |     } | 
| Ratan Gupta | 255d514 | 2017-08-10 09:02:08 +0530 | [diff] [blame] | 75 |  | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 76 |     std::string getObjectPath(const std::string& ipaddress, uint8_t subnetMask, | 
| Lei YU | 3402757 | 2021-08-11 15:23:52 +0800 | [diff] [blame] | 77 |                               const std::string& gateway, | 
 | 78 |                               IP::AddressOrigin origin) | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 79 |     { | 
 | 80 |         IP::Protocol addressType = IP::Protocol::IPv4; | 
| Ratan Gupta | 255d514 | 2017-08-10 09:02:08 +0530 | [diff] [blame] | 81 |  | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 82 |         return interface.generateObjectPath(addressType, ipaddress, subnetMask, | 
| Lei YU | 3402757 | 2021-08-11 15:23:52 +0800 | [diff] [blame] | 83 |                                             gateway, origin); | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 84 |     } | 
 | 85 |  | 
 | 86 |     void createIPObject(IP::Protocol addressType, const std::string& ipaddress, | 
 | 87 |                         uint8_t subnetMask, const std::string& gateway) | 
 | 88 |     { | 
| Patrick Williams | 6aef769 | 2021-05-01 06:39:41 -0500 | [diff] [blame] | 89 |         interface.ip(addressType, ipaddress, subnetMask, gateway); | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 90 |     } | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 91 | }; | 
 | 92 |  | 
 | 93 | TEST_F(TestEthernetInterface, NoIPaddress) | 
 | 94 | { | 
 | 95 |     EXPECT_EQ(countIPObjects(), 0); | 
| Patrick Williams | 6aef769 | 2021-05-01 06:39:41 -0500 | [diff] [blame] | 96 |     EXPECT_EQ(mac_address::toString(mac), interface.macAddress()); | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 97 | } | 
 | 98 |  | 
 | 99 | TEST_F(TestEthernetInterface, AddIPAddress) | 
 | 100 | { | 
 | 101 |     IP::Protocol addressType = IP::Protocol::IPv4; | 
 | 102 |     createIPObject(addressType, "10.10.10.10", 16, "10.10.10.1"); | 
 | 103 |     EXPECT_EQ(true, isIPObjectExist("10.10.10.10")); | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 104 | } | 
 | 105 |  | 
 | 106 | TEST_F(TestEthernetInterface, AddMultipleAddress) | 
 | 107 | { | 
 | 108 |     IP::Protocol addressType = IP::Protocol::IPv4; | 
 | 109 |     createIPObject(addressType, "10.10.10.10", 16, "10.10.10.1"); | 
 | 110 |     createIPObject(addressType, "20.20.20.20", 16, "20.20.20.1"); | 
 | 111 |     EXPECT_EQ(true, isIPObjectExist("10.10.10.10")); | 
 | 112 |     EXPECT_EQ(true, isIPObjectExist("20.20.20.20")); | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 113 | } | 
 | 114 |  | 
 | 115 | TEST_F(TestEthernetInterface, DeleteIPAddress) | 
 | 116 | { | 
 | 117 |     IP::Protocol addressType = IP::Protocol::IPv4; | 
 | 118 |     createIPObject(addressType, "10.10.10.10", 16, "10.10.10.1"); | 
 | 119 |     createIPObject(addressType, "20.20.20.20", 16, "20.20.20.1"); | 
 | 120 |     deleteIPObject("10.10.10.10"); | 
 | 121 |     EXPECT_EQ(false, isIPObjectExist("10.10.10.10")); | 
 | 122 |     EXPECT_EQ(true, isIPObjectExist("20.20.20.20")); | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 123 | } | 
 | 124 |  | 
 | 125 | TEST_F(TestEthernetInterface, DeleteInvalidIPAddress) | 
 | 126 | { | 
 | 127 |     EXPECT_EQ(false, deleteIPObject("10.10.10.10")); | 
 | 128 | } | 
 | 129 |  | 
 | 130 | TEST_F(TestEthernetInterface, CheckObjectPath) | 
 | 131 | { | 
 | 132 |     std::string ipaddress = "10.10.10.10"; | 
 | 133 |     uint8_t prefix = 16; | 
 | 134 |     std::string gateway = "10.10.10.1"; | 
| Lei YU | 3402757 | 2021-08-11 15:23:52 +0800 | [diff] [blame] | 135 |     IP::AddressOrigin origin = IP::AddressOrigin::Static; | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 136 |  | 
 | 137 |     std::string expectedObjectPath = "/xyz/openbmc_test/network/test0/ipv4/"; | 
 | 138 |     std::stringstream hexId; | 
 | 139 |  | 
 | 140 |     std::string hashString = ipaddress; | 
 | 141 |     hashString += std::to_string(prefix); | 
 | 142 |     hashString += gateway; | 
| Lei YU | 3402757 | 2021-08-11 15:23:52 +0800 | [diff] [blame] | 143 |     hashString += convertForMessage(origin); | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 144 |  | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 145 |     hexId << std::hex << ((std::hash<std::string>{}(hashString)) & 0xFFFFFFFF); | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 146 |     expectedObjectPath += hexId.str(); | 
 | 147 |  | 
| Lei YU | 3402757 | 2021-08-11 15:23:52 +0800 | [diff] [blame] | 148 |     EXPECT_EQ(expectedObjectPath, | 
 | 149 |               getObjectPath(ipaddress, prefix, gateway, origin)); | 
 | 150 |  | 
 | 151 |     origin = IP::AddressOrigin::DHCP; | 
 | 152 |     EXPECT_NE(expectedObjectPath, | 
 | 153 |               getObjectPath(ipaddress, prefix, gateway, origin)); | 
| Ratan Gupta | 47722dc | 2017-05-26 18:32:23 +0530 | [diff] [blame] | 154 | } | 
 | 155 |  | 
| Manojkiran Eda | acd6dd5 | 2019-10-15 15:00:51 +0530 | [diff] [blame] | 156 | TEST_F(TestEthernetInterface, addStaticNameServers) | 
| Ratan Gupta | 09f6157 | 2017-08-23 16:53:52 +0530 | [diff] [blame] | 157 | { | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 158 |     ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"}; | 
| William A. Kennington III | bd649af | 2021-10-08 17:55:13 -0700 | [diff] [blame] | 159 |     EXPECT_CALL(manager, reloadConfigs()); | 
| Manojkiran Eda | acd6dd5 | 2019-10-15 15:00:51 +0530 | [diff] [blame] | 160 |     interface.staticNameServers(servers); | 
| Ratan Gupta | 09f6157 | 2017-08-23 16:53:52 +0530 | [diff] [blame] | 161 |     fs::path filePath = confDir; | 
 | 162 |     filePath /= "00-bmc-test0.network"; | 
 | 163 |     config::Parser parser(filePath.string()); | 
| William A. Kennington III | 25511a1 | 2022-08-04 16:32:28 -0700 | [diff] [blame] | 164 |     EXPECT_EQ(servers, parser.getValues("Network", "DNS")); | 
| Ratan Gupta | 09f6157 | 2017-08-23 16:53:52 +0530 | [diff] [blame] | 165 | } | 
 | 166 |  | 
| Manojkiran Eda | acd6dd5 | 2019-10-15 15:00:51 +0530 | [diff] [blame] | 167 | TEST_F(TestEthernetInterface, getDynamicNameServers) | 
 | 168 | { | 
 | 169 |     ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"}; | 
 | 170 |     EXPECT_CALL(interface, getNameServerFromResolvd()) | 
 | 171 |         .WillRepeatedly(testing::Return(servers)); | 
 | 172 |     EXPECT_EQ(interface.getNameServerFromResolvd(), servers); | 
 | 173 | } | 
 | 174 |  | 
| Ratan Gupta | c9645fe | 2017-08-23 16:53:52 +0530 | [diff] [blame] | 175 | TEST_F(TestEthernetInterface, addNTPServers) | 
 | 176 | { | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 177 |     ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"}; | 
| William A. Kennington III | bd649af | 2021-10-08 17:55:13 -0700 | [diff] [blame] | 178 |     EXPECT_CALL(manager, reloadConfigs()); | 
| Patrick Williams | 6aef769 | 2021-05-01 06:39:41 -0500 | [diff] [blame] | 179 |     interface.ntpServers(servers); | 
| Ratan Gupta | c9645fe | 2017-08-23 16:53:52 +0530 | [diff] [blame] | 180 |     fs::path filePath = confDir; | 
 | 181 |     filePath /= "00-bmc-test0.network"; | 
 | 182 |     config::Parser parser(filePath.string()); | 
| William A. Kennington III | 25511a1 | 2022-08-04 16:32:28 -0700 | [diff] [blame] | 183 |     EXPECT_EQ(servers, parser.getValues("Network", "NTP")); | 
| Ratan Gupta | c9645fe | 2017-08-23 16:53:52 +0530 | [diff] [blame] | 184 | } | 
 | 185 |  | 
| Ravi Teja | a5a0944 | 2020-07-17 00:57:33 -0500 | [diff] [blame] | 186 | TEST_F(TestEthernetInterface, addGateway) | 
 | 187 | { | 
 | 188 |     std::string gateway = "10.3.3.3"; | 
 | 189 |     interface.defaultGateway(gateway); | 
 | 190 |     EXPECT_EQ(interface.defaultGateway(), gateway); | 
| Jiaqing Zhao | c2e061f | 2022-04-07 21:55:48 +0800 | [diff] [blame] | 191 |     interface.defaultGateway(""); | 
 | 192 |     EXPECT_EQ(interface.defaultGateway(), ""); | 
| Ravi Teja | a5a0944 | 2020-07-17 00:57:33 -0500 | [diff] [blame] | 193 | } | 
 | 194 |  | 
 | 195 | TEST_F(TestEthernetInterface, addGateway6) | 
 | 196 | { | 
 | 197 |     std::string gateway6 = "ffff:ffff:ffff:fe80::1"; | 
 | 198 |     interface.defaultGateway6(gateway6); | 
 | 199 |     EXPECT_EQ(interface.defaultGateway6(), gateway6); | 
| Jiaqing Zhao | c2e061f | 2022-04-07 21:55:48 +0800 | [diff] [blame] | 200 |     interface.defaultGateway6(""); | 
 | 201 |     EXPECT_EQ(interface.defaultGateway6(), ""); | 
| Ravi Teja | a5a0944 | 2020-07-17 00:57:33 -0500 | [diff] [blame] | 202 | } | 
 | 203 |  | 
| Gunnar Mills | 57d9c50 | 2018-09-14 14:42:34 -0500 | [diff] [blame] | 204 | } // namespace network | 
 | 205 | } // namespace phosphor |