#include "elog_entry.hpp"
#include "extensions.hpp"

#include <sdbusplus/test/sdbus_mock.hpp>

#include <gtest/gtest.h>

using namespace phosphor::logging;

// gtest doesn't like this happening in another file, so do it here.
StartupFunctions Extensions::startupFunctions{};
CreateFunctions Extensions::createFunctions{};
DeleteFunctions Extensions::deleteFunctions{};
DeleteProhibitedFunctions Extensions::deleteProhibitedFunctions{};
Extensions::DefaultErrorCaps Extensions::defaultErrorCaps =
    Extensions::DefaultErrorCaps::enable;

void startup1(internal::Manager& /*manager*/)
{
}

void startup2(internal::Manager& /*manager*/)
{
}

void create1(const std::string& /*message*/, uint32_t /*id*/,
             uint64_t /*timestamp*/, Entry::Level /*severity*/,
             const AdditionalDataArg& /*additionalData*/,
             const AssociationEndpointsArg& /*assocs*/, const FFDCArg& /*ffdc*/)
{
}

void create2(const std::string& /*message*/, uint32_t /*id*/,
             uint64_t /*timestamp*/, Entry::Level /*severity*/,
             const AdditionalDataArg& /*additionalData*/,
             const AssociationEndpointsArg& /*assocs*/, const FFDCArg& /*ffdc*/)
{
}

void deleteLog1(uint32_t /*id*/)
{
}

void deleteLog2(uint32_t /*id*/)
{
}

void deleteProhibited1(uint32_t /*id*/, bool& prohibited)
{
    prohibited = true;
}

void deleteProhibited2(uint32_t /*id*/, bool& prohibited)
{
    prohibited = true;
}

DISABLE_LOG_ENTRY_CAPS()
REGISTER_EXTENSION_FUNCTION(startup1)
REGISTER_EXTENSION_FUNCTION(startup2)
REGISTER_EXTENSION_FUNCTION(create1)
REGISTER_EXTENSION_FUNCTION(create2)
REGISTER_EXTENSION_FUNCTION(deleteProhibited1)
REGISTER_EXTENSION_FUNCTION(deleteProhibited2)
REGISTER_EXTENSION_FUNCTION(deleteLog1)
REGISTER_EXTENSION_FUNCTION(deleteLog2)

TEST(ExtensionsTest, FunctionCallTest)
{
    sdbusplus::SdBusMock sdbusMock;
    sdbusplus::bus::bus bus = sdbusplus::get_mocked_new(&sdbusMock);
    internal::Manager manager(bus, "testpath");

    EXPECT_EQ(Extensions::getStartupFunctions().size(), 2);
    for (auto& s : Extensions::getStartupFunctions())
    {
        s(manager);
    }

    AdditionalDataArg ad;
    AssociationEndpointsArg assocs;
    FFDCArg ffdc;
    EXPECT_EQ(Extensions::getCreateFunctions().size(), 2);
    for (auto& c : Extensions::getCreateFunctions())
    {
        c("test", 5, 6, Entry::Level::Informational, ad, assocs, ffdc);
    }

    EXPECT_EQ(Extensions::getDeleteFunctions().size(), 2);
    for (auto& d : Extensions::getDeleteFunctions())
    {
        d(5);
    }

    EXPECT_EQ(Extensions::getDeleteProhibitedFunctions().size(), 2);
    for (auto& p : Extensions::getDeleteProhibitedFunctions())
    {
        bool prohibited = false;
        p(5, prohibited);
        EXPECT_TRUE(prohibited);
    }

    EXPECT_TRUE(Extensions::disableDefaultLogCaps());
}
