#pragma once

#include "config.h"

#include "mock_ethernet_interface.hpp"
#include "network_manager.hpp"

#include <gmock/gmock.h>

namespace phosphor
{
namespace network
{

void initializeTimers();
void refreshObjects();

class MockManager : public phosphor::network::Manager
{
  public:
    MockManager(sdbusplus::bus::bus& bus, const char* path,
                const std::string& dir) :
        phosphor::network::Manager(bus, path, dir)
    {
    }

    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));
};

} // namespace network
} // namespace phosphor
