ethernet_interface: Merge VLAN into EthernetInterface

This simplifies the ethernet interface as it codepended on the vlan
interface to make VLANs. It also removes the naming dependency and
tracks VLANs by adapter type and parent indexes.

Change-Id: I8db09cc2474472e6d4a06c6be5cf0440ee48d132
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/test/test_network_manager.cpp b/test/test_network_manager.cpp
index 459bacf..7e3e211 100644
--- a/test/test_network_manager.cpp
+++ b/test/test_network_manager.cpp
@@ -1,3 +1,4 @@
+#include "config_parser.hpp"
 #include "mock_network_manager.hpp"
 #include "mock_syscall.hpp"
 
@@ -6,6 +7,7 @@
 #include <netinet/in.h>
 #include <stdlib.h>
 
+#include <filesystem>
 #include <sdbusplus/bus.hpp>
 #include <stdplus/gtest/tmp.hpp>
 
@@ -21,7 +23,7 @@
 
 class TestNetworkManager : public stdplus::gtest::TestWithTmp
 {
-  public:
+  protected:
     sdbusplus::bus_t bus;
     MockManager manager;
     TestNetworkManager() :
@@ -35,13 +37,18 @@
     {
         manager.createInterfaces();
     }
+
+    void deleteVLAN(std::string_view ifname)
+    {
+        manager.interfaces.find(ifname)->second->vlan->delete_();
+    }
 };
 
 // getifaddrs will not return any interface
 TEST_F(TestNetworkManager, NoInterface)
 {
     createInterfaces();
-    EXPECT_TRUE(manager.getInterfaces().empty());
+    EXPECT_TRUE(manager.interfaces.empty());
 }
 // getifaddrs returns single interface.
 TEST_F(TestNetworkManager, WithSingleInterface)
@@ -52,7 +59,7 @@
     // Now create the interfaces which will call the mocked getifaddrs
     // which returns the above interface detail.
     createInterfaces();
-    EXPECT_THAT(manager.getInterfaces(), UnorderedElementsAre(Key("igb1")));
+    EXPECT_THAT(manager.interfaces, UnorderedElementsAre(Key("igb1")));
 }
 
 // getifaddrs returns two interfaces.
@@ -62,8 +69,34 @@
     system::mock_addIF({.idx = 2, .flags = 0, .name = "igb1"});
 
     createInterfaces();
-    EXPECT_THAT(manager.getInterfaces(),
+    EXPECT_THAT(manager.interfaces,
                 UnorderedElementsAre(Key("igb0"), Key("igb1")));
 }
+
+TEST_F(TestNetworkManager, WithVLAN)
+{
+    EXPECT_THROW(manager.vlan("", 8000), std::exception);
+    EXPECT_THROW(manager.vlan("", 0), std::exception);
+    EXPECT_THROW(manager.vlan("eth0", 2), std::exception);
+
+    system::mock_addIF({.idx = 1, .flags = 0, .name = "eth0"});
+    manager.createInterfaces();
+    EXPECT_NO_THROW(manager.vlan("eth0", 2));
+    EXPECT_NO_THROW(manager.vlan("eth0", 4094));
+    EXPECT_THAT(
+        manager.interfaces,
+        UnorderedElementsAre(Key("eth0"), Key("eth0.2"), Key("eth0.4094")));
+    auto netdev1 = config::pathForIntfDev(CaseTmpDir(), "eth0.2");
+    auto netdev2 = config::pathForIntfDev(CaseTmpDir(), "eth0.4094");
+    EXPECT_TRUE(std::filesystem::is_regular_file(netdev1));
+    EXPECT_TRUE(std::filesystem::is_regular_file(netdev2));
+
+    deleteVLAN("eth0.2");
+    EXPECT_THAT(manager.interfaces,
+                UnorderedElementsAre(Key("eth0"), Key("eth0.4094")));
+    EXPECT_FALSE(std::filesystem::is_regular_file(netdev1));
+    EXPECT_TRUE(std::filesystem::is_regular_file(netdev2));
+}
+
 } // namespace network
 } // namespace phosphor