Backend changes for Populating Nameservers(DNS & Static)

- As per the proposed design :
https://lists.ozlabs.org/pipermail/openbmc/2019-September/018399.html

Depends on :
https://gerrit.openbmc-project.xyz/#/c/openbmc/phosphor-dbus-interfaces/+/26060/

The idea of this commit is to

- Support NameServers(Read Only) property to display current
  Nameservers (both DHCP provided& Static) configured on the
  interface.

- Support StaticNameServers(Writable) property by which user
  can set the Nameservers on an interface.

Tested By:

1.Configure a DNS via DHCP Server & Make sure NameServer property
  populates accordingly.
2.With DNS from DHCP existing, set a name server using PATCH on
  StaticNameServer property & make sure both properties populate
  the data as per the proposal.
3.Make sure /etc/resolv.conf is populated with the right content
  in case of DHCP/Static and DHCP & Static (Co-existing)
4.Make sure network configuration file is updated properly when
  user sets a staic name server.

Signed-off-by: Manojkiran Eda <manojkiran.eda@gmail.com>
Change-Id: If10b9aa683d2b50e51780e91323c6d10a5ec3710
diff --git a/test/mock_ethernet_interface.hpp b/test/mock_ethernet_interface.hpp
new file mode 100644
index 0000000..c7c4022
--- /dev/null
+++ b/test/mock_ethernet_interface.hpp
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "ethernet_interface.hpp"
+#include "mock_syscall.hpp"
+
+#include <gmock/gmock.h>
+
+namespace phosphor
+{
+namespace network
+{
+class MockEthernetInterface : public EthernetInterface
+{
+  public:
+    MockEthernetInterface(sdbusplus::bus::bus& bus, const std::string& objPath,
+                          bool dhcpEnabled, Manager& parent, bool emitSignal) :
+        EthernetInterface(bus, objPath, dhcpEnabled, parent, emitSignal)
+    {
+    }
+
+    MOCK_METHOD((ServerList), getNameServerFromResolvd, (), (override));
+    friend class TestEthernetInterface;
+};
+} // namespace network
+} // namespace phosphor
diff --git a/test/mock_network_manager.hpp b/test/mock_network_manager.hpp
index df3efdf..b4a6894 100644
--- a/test/mock_network_manager.hpp
+++ b/test/mock_network_manager.hpp
@@ -1,5 +1,8 @@
+#pragma once
+
 #include "config.h"
 
+#include "mock_ethernet_interface.hpp"
 #include "network_manager.hpp"
 
 #include <gmock/gmock.h>
@@ -18,6 +21,27 @@
     {
     }
 
+    void createInterfaces() override
+    {
+        // clear all the interfaces first
+        interfaces.clear();
+        auto interfaceStrList = getInterfaces();
+        for (auto& interface : interfaceStrList)
+        {
+            fs::path objPath = objectPath;
+            // normal ethernet interface
+            objPath /= interface;
+            auto dhcp = getDHCPValue(confDir, interface);
+            auto intf =
+                std::make_shared<phosphor::network::MockEthernetInterface>(
+                    bus, objPath.string(), dhcp, *this, true);
+            intf->createIPAddressObjects();
+            intf->createStaticNeighborObjects();
+            intf->loadNameServers();
+            this->interfaces.emplace(
+                std::make_pair(std::move(interface), std::move(intf)));
+        }
+    }
     MOCK_METHOD1(restartSystemdUnit, void(const std::string& service));
 };
 
diff --git a/test/test_ethernet_interface.cpp b/test/test_ethernet_interface.cpp
index 30dee8a..d0beef7 100644
--- a/test/test_ethernet_interface.cpp
+++ b/test/test_ethernet_interface.cpp
@@ -12,6 +12,7 @@
 #include <exception>
 #include <fstream>
 #include <sdbusplus/bus.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
 
 #include <gtest/gtest.h>
 
@@ -25,7 +26,7 @@
   public:
     sdbusplus::bus::bus bus;
     MockManager manager;
-    EthernetInterface interface;
+    MockEthernetInterface interface;
     std::string confDir;
     TestEthernetInterface() :
         bus(sdbusplus::bus::new_default()),
@@ -53,12 +54,12 @@
 
     static constexpr ether_addr mac{0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
 
-    static EthernetInterface makeInterface(sdbusplus::bus::bus& bus,
-                                           MockManager& manager)
+    static MockEthernetInterface makeInterface(sdbusplus::bus::bus& bus,
+                                               MockManager& manager)
     {
         mock_clear();
         mock_addIF("test0", 1, mac);
-        return {bus, "/xyz/openbmc_test/network/test0", false, manager};
+        return {bus, "/xyz/openbmc_test/network/test0", false, manager, true};
     }
 
     int countIPObjects()
@@ -159,11 +160,11 @@
     EXPECT_EQ(expectedObjectPath, getObjectPath(ipaddress, prefix, gateway));
 }
 
-TEST_F(TestEthernetInterface, addNameServers)
+TEST_F(TestEthernetInterface, addStaticNameServers)
 {
     ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
     EXPECT_CALL(manager, restartSystemdUnit(networkdService)).Times(1);
-    interface.nameservers(servers);
+    interface.staticNameServers(servers);
     fs::path filePath = confDir;
     filePath /= "00-bmc-test0.network";
     config::Parser parser(filePath.string());
@@ -173,6 +174,21 @@
     EXPECT_EQ(servers, values);
 }
 
+TEST_F(TestEthernetInterface, addDynamicNameServers)
+{
+    using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+    ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
+    EXPECT_THROW(interface.nameservers(servers), NotAllowed);
+}
+
+TEST_F(TestEthernetInterface, getDynamicNameServers)
+{
+    ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
+    EXPECT_CALL(interface, getNameServerFromResolvd())
+        .WillRepeatedly(testing::Return(servers));
+    EXPECT_EQ(interface.getNameServerFromResolvd(), servers);
+}
+
 TEST_F(TestEthernetInterface, addNTPServers)
 {
     ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
diff --git a/test/test_network_manager.cpp b/test/test_network_manager.cpp
index 64ca87d..7943057 100644
--- a/test/test_network_manager.cpp
+++ b/test/test_network_manager.cpp
@@ -27,7 +27,7 @@
 {
   public:
     sdbusplus::bus::bus bus;
-    Manager manager;
+    MockManager manager;
     std::string confDir;
     TestNetworkManager() :
         bus(sdbusplus::bus::new_default()),
@@ -63,7 +63,6 @@
     using namespace sdbusplus::xyz::openbmc_project::Common::Error;
     EXPECT_THROW(createInterfaces(), InternalFailure);
 }
-
 // getifaddrs returns single interface.
 TEST_F(TestNetworkManager, WithSingleInterface)
 {
@@ -96,6 +95,5 @@
     EXPECT_EQ(true, manager.hasInterface("igb0"));
     EXPECT_EQ(true, manager.hasInterface("igb1"));
 }
-
 } // namespace network
 } // namespace phosphor