/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.
 */
#include <gtest/gtest.h>
#include <mockcpp/mockcpp.hpp>
#include "common.h"
#include "mindx_engine.h"
namespace {
using namespace ock::ttp;

#ifndef MOCKER_CPP
#define MOCKER_CPP(api, TT) MOCKCPP_NS::mockAPI(#api, reinterpret_cast<TT>(api))
#endif
#ifndef MOCKCPP_RESET
#define MOCKCPP_RESET GlobalMockObject::reset()
#endif
MindXEnginePtr g_mindxEngine1 = nullptr;


class TestMindxEngine : public testing::Test {
public:
    static void SetUpTestCase();
    static void TearDownTestCase();
    void SetUp() override;
    void TearDown() override;

public:
    void InitSource();

    int Register2MindX(void *ctx, int ctxSize)
    {
        registerCount.fetch_add(1);
        return 0;
    }

    void InitMindxEngine(MindXEnginePtr& ctrl)
    {
        int32_t ret;
        ctrl = MakeRef<MindXEngine>();
        ASSERT_TRUE(ctrl != nullptr);
        ctrl = MindXEngine::GetInstance();
        ret = ctrl->RegisterEventHandler(MindXEvent::MINDX_EVENT_REGISTER,
                                         std::bind(&TestMindxEngine::Register2MindX, this,
                                                   std::placeholders::_1, std::placeholders::_2));
        ASSERT_EQ(ret, 0);
    }

public:

    std::atomic<uint32_t> registerCount = { 0 };
};

void TestMindxEngine::InitSource()
{
    registerCount.store(0);
    TestMindxEngine::InitMindxEngine(g_mindxEngine1);
}


TEST_F(TestMindxEngine, register_faild)
{
    ASSERT_EQ(setenv("MINDX_TASK_ID", "0", 1), 0);
    MOCKER_CPP(&MindXEngine::EventProcess, TResult(*)(void)).expects(atLeast(1)).will(returnValue(TResult::TTP_ERROR));
    TestMindxEngine::InitSource();
    TResult ret = g_mindxEngine1->EventProcess(MindXEvent::MINDX_EVENT_REGISTER, nullptr, 0);

    g_mindxEngine1->Register2MindX();
    ASSERT_EQ(ret, TTP_ERROR);

    unsetenv("MINDX_TASK_ID");
    MOCKCPP_RESET;
}

void TestMindxEngine::SetUpTestCase() {}

void TestMindxEngine::TearDownTestCase()
{
    MindXEnginePtr ctrl = MindXEngine::GetInstance();
    ctrl->Destroy();
    MindXEngine::GetInstance(true);
}

void TestMindxEngine::SetUp() {}

void TestMindxEngine::TearDown()
{
    g_mindxEngine1->Destroy();
}
}