blob: d5b69897dc1282a5160c3d348136b866bea17a4b [file] [log] [blame]
Ratan Gupta2aca45c2017-07-26 01:16:27 +05301#include "config_parser.hpp"
Ratan Gupta2aca45c2017-07-26 01:16:27 +05302#include "ipaddress.hpp"
Ratan Gupta35297172018-11-28 18:40:16 +05303#include "mock_network_manager.hpp"
Gunnar Mills57d9c502018-09-14 14:42:34 -05004#include "mock_syscall.hpp"
William A. Kennington IIIfd862be2022-10-09 18:40:55 -07005#include "system_queries.hpp"
Gunnar Mills57d9c502018-09-14 14:42:34 -05006#include "vlan_interface.hpp"
Ratan Gupta2aca45c2017-07-26 01:16:27 +05307
Gunnar Mills57d9c502018-09-14 14:42:34 -05008#include <arpa/inet.h>
Ratan Gupta2aca45c2017-07-26 01:16:27 +05309#include <net/if.h>
10#include <netinet/in.h>
Gunnar Mills57d9c502018-09-14 14:42:34 -050011
Manojkiran Edaa879baa2020-06-13 14:39:08 +053012#include <filesystem>
Gunnar Mills57d9c502018-09-14 14:42:34 -050013#include <sdbusplus/bus.hpp>
William A. Kennington III84bfe672022-07-13 14:15:30 -070014#include <stdplus/gtest/tmp.hpp>
Gunnar Mills57d9c502018-09-14 14:42:34 -050015
16#include <gtest/gtest.h>
Ratan Gupta2aca45c2017-07-26 01:16:27 +053017
18namespace phosphor
19{
20namespace network
21{
22
Manojkiran Edaa879baa2020-06-13 14:39:08 +053023namespace fs = std::filesystem;
William A. Kennington IIId298f932022-10-17 14:31:38 -070024using std::literals::string_view_literals::operator""sv;
Ratan Gupta2aca45c2017-07-26 01:16:27 +053025
William A. Kennington III84bfe672022-07-13 14:15:30 -070026class TestVlanInterface : public stdplus::gtest::TestWithTmp
Ratan Gupta2aca45c2017-07-26 01:16:27 +053027{
Gunnar Mills57d9c502018-09-14 14:42:34 -050028 public:
Patrick Williamsc38b0712022-07-22 19:26:54 -050029 sdbusplus::bus_t bus;
William A. Kennington III84bfe672022-07-13 14:15:30 -070030 std::string confDir;
Ratan Gupta35297172018-11-28 18:40:16 +053031 MockManager manager;
Gunnar Mills57d9c502018-09-14 14:42:34 -050032 EthernetInterface interface;
Gunnar Mills57d9c502018-09-14 14:42:34 -050033 TestVlanInterface() :
William A. Kennington III84bfe672022-07-13 14:15:30 -070034 bus(sdbusplus::bus::new_default()), confDir(CaseTmpDir()),
35 manager(bus, "/xyz/openbmc_test/network", confDir),
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070036 interface(makeInterface(bus, manager))
Ratan Gupta2aca45c2017-07-26 01:16:27 +053037
Gunnar Mills57d9c502018-09-14 14:42:34 -050038 {
Gunnar Mills57d9c502018-09-14 14:42:34 -050039 }
Ratan Gupta2aca45c2017-07-26 01:16:27 +053040
Patrick Williamsc38b0712022-07-22 19:26:54 -050041 static EthernetInterface makeInterface(sdbusplus::bus_t& bus,
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070042 MockManager& manager)
43 {
William A. Kennington III77848562022-10-26 17:32:57 -070044 system::mock_clear();
45 system::InterfaceInfo info{.idx = 1, .flags = 0, .name = "test0"};
46 system::mock_addIF(info);
William A. Kennington III26275a32021-07-13 20:32:42 -070047 return {bus,
William A. Kennington III26275a32021-07-13 20:32:42 -070048 manager,
William A. Kennington III77848562022-10-26 17:32:57 -070049 info,
William A. Kennington IIId298f932022-10-17 14:31:38 -070050 "/xyz/openbmc_test/network"sv,
51 config::Parser(),
52 /*emitSignal=*/false,
William A. Kennington III9ecb90e2022-10-14 03:12:43 -070053 /*nicEnabled=*/true};
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070054 }
55
William A. Kennington IIId298f932022-10-17 14:31:38 -070056 void createVlan(uint16_t id)
Gunnar Mills57d9c502018-09-14 14:42:34 -050057 {
William A. Kennington III77848562022-10-26 17:32:57 -070058 system::mock_addIF(system::InterfaceInfo{
59 .idx = id + 10u, .flags = 0, .name = fmt::format("test0.{}", id)});
Gunnar Mills57d9c502018-09-14 14:42:34 -050060 interface.createVLAN(id);
61 }
62
63 void deleteVlan(const std::string& interfaceName)
64 {
65 interface.deleteVLANObject(interfaceName);
66 }
67
68 int countIPObjects()
69 {
70 return interface.getAddresses().size();
71 }
72
73 bool isIPObjectExist(const std::string& ipaddress)
74 {
75 auto address = interface.getAddresses().find(ipaddress);
76 if (address == interface.getAddresses().end())
Ratan Gupta2aca45c2017-07-26 01:16:27 +053077 {
Ratan Gupta2aca45c2017-07-26 01:16:27 +053078 return false;
79 }
Gunnar Mills57d9c502018-09-14 14:42:34 -050080 return true;
81 }
82
83 bool deleteIPObject(const std::string& ipaddress)
84 {
85 auto address = interface.getAddresses().find(ipaddress);
86 if (address == interface.getAddresses().end())
87 {
88 return false;
89 }
90 address->second->delete_();
91 return true;
92 }
93
94 void createIPObject(IP::Protocol addressType, const std::string& ipaddress,
95 uint8_t subnetMask, const std::string& gateway)
96 {
Patrick Williams6aef7692021-05-01 06:39:41 -050097 interface.ip(addressType, ipaddress, subnetMask, gateway);
Gunnar Mills57d9c502018-09-14 14:42:34 -050098 }
Ratan Gupta2aca45c2017-07-26 01:16:27 +053099};
100
101TEST_F(TestVlanInterface, createVLAN)
102{
103 createVlan(50);
104 fs::path filePath = confDir;
105 filePath /= "test0.50.netdev";
106
William A. Kennington IIIe21a5cf2022-08-09 12:19:14 -0700107 config::Parser parser(filePath);
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700108 EXPECT_EQ(parser.map, config::SectionMap(config::SectionMapInt{
109 {"NetDev",
110 {
111 {{"Name", {"test0.50"}}, {"Kind", {"vlan"}}},
112 }},
113 {"VLAN", {{{"Id", {"50"}}}}},
114 }));
Ratan Gupta2aca45c2017-07-26 01:16:27 +0530115}
116
117TEST_F(TestVlanInterface, deleteVLAN)
118{
119 createVlan(50);
120 deleteVlan("test0.50");
Ratan Gupta2aca45c2017-07-26 01:16:27 +0530121
122 fs::path filePath = confDir;
123 filePath /= "test0.50.netdev";
William A. Kennington IIIe21a5cf2022-08-09 12:19:14 -0700124 EXPECT_FALSE(fs::is_regular_file(filePath));
Ratan Gupta2aca45c2017-07-26 01:16:27 +0530125}
126
127TEST_F(TestVlanInterface, createMultipleVLAN)
128{
129 createVlan(50);
130 createVlan(60);
131
132 fs::path filePath = confDir;
133 filePath /= "test0.50.netdev";
William A. Kennington IIIe21a5cf2022-08-09 12:19:14 -0700134 config::Parser parser(filePath);
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700135 EXPECT_EQ(parser.map, config::SectionMap(config::SectionMapInt{
136 {"NetDev",
137 {
138 {{"Name", {"test0.50"}}, {"Kind", {"vlan"}}},
139 }},
140 {"VLAN", {{{"Id", {"50"}}}}},
141 }));
Ratan Gupta2aca45c2017-07-26 01:16:27 +0530142
143 filePath = confDir;
144 filePath /= "test0.60.netdev";
William A. Kennington IIIe21a5cf2022-08-09 12:19:14 -0700145 parser.setFile(filePath);
William A. Kennington III34bb3e22022-08-18 15:17:22 -0700146 EXPECT_EQ(parser.map, config::SectionMap(config::SectionMapInt{
147 {"NetDev",
148 {
149 {{"Name", {"test0.60"}}, {"Kind", {"vlan"}}},
150 }},
151 {"VLAN", {{{"Id", {"60"}}}}},
152 }));
Ratan Gupta2aca45c2017-07-26 01:16:27 +0530153
154 deleteVlan("test0.50");
155 deleteVlan("test0.60");
156}
157
Gunnar Mills57d9c502018-09-14 14:42:34 -0500158} // namespace network
159} // namespace phosphor