/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
 * CANN Open Software License Agreement Version 2.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 */
#include <iostream>
#include <stdexcept>
#include "gtest/gtest.h"
#include "mockcpp/mockcpp.hpp"
#include "message/prof_params.h"

using namespace analysis::dvvp::message;

///////////////////////////////////////////////////////////////////
class MESSAGE_MESSAGE_STATUSINFO_TEST: public testing::Test {
protected:
    virtual void SetUp() {
    }
    virtual void TearDown() {
    }
};

TEST_F(MESSAGE_MESSAGE_STATUSINFO_TEST, ToObject) {
    GlobalMockObject::verify();

    std::string info = "this is test";
    StatusInfo status("1", ERR, info);

    NanoJson::Json object;
    status.ToObject(object);

    EXPECT_NE(std::string::npos, object.ToString().find("\"info\":\"this is test\""));
    EXPECT_NE(std::string::npos, object.ToString().find("\"status\":1"));
    EXPECT_NE(std::string::npos, object.ToString().find("\"dev_id\":\"1\""));
}

TEST_F(MESSAGE_MESSAGE_STATUSINFO_TEST, FromObject) {
    GlobalMockObject::verify();

    std::string info = "this is test";
    StatusInfo status("1", ERR, info);

    NanoJson::Json object;
    status.ToObject(object);

    StatusInfo status1;
    status1.FromObject(object);

    EXPECT_EQ(status.dev_id, status1.dev_id);
    EXPECT_EQ(status.status, status1.status);
}

TEST_F(MESSAGE_MESSAGE_STATUSINFO_TEST, ToString) {
    GlobalMockObject::verify();

    std::string info = "this is test";
    StatusInfo status("1", ERR, info);

    EXPECT_NE(std::string::npos, status.ToString().find("\"info\":\"this is test\""));
    EXPECT_NE(std::string::npos, status.ToString().find("\"status\":1"));
    EXPECT_NE(std::string::npos, status.ToString().find("\"dev_id\":\"1\""));
}

TEST_F(MESSAGE_MESSAGE_STATUSINFO_TEST, FromString) {
    GlobalMockObject::verify();

    std::string info = "this is test";
    StatusInfo status("1", ERR, info);
    StatusInfo status1;
    EXPECT_FALSE(status1.FromString("{"));
    EXPECT_FALSE(status1.FromString(""));
    EXPECT_TRUE(status1.FromString(status.ToString()));
}

///////////////////////////////////////////////////////////////////
class MESSAGE_MESSAGE_STATUS_TEST: public testing::Test {
protected:
    virtual void SetUp() {
    }
    virtual void TearDown() {
    }
};

TEST_F(MESSAGE_MESSAGE_STATUS_TEST, ToObject) {
    GlobalMockObject::verify();

    std::string info = "this is test";
    StatusInfo status_info("1", ERR, info);

    Status status;
    status.AddStatusInfo(status_info);

    NanoJson::Json object;
    status.ToObject(object);
    std::string str = "{\"info\":[{\"info\":\"this is test\",\"status\":1,\"dev_id\":\"1\"}],\"status\":1}";

    EXPECT_NE(std::string::npos, object.ToString().find("\"info\":\"this is test\""));
    EXPECT_NE(std::string::npos, object.ToString().find("\"status\":1"));
    EXPECT_NE(std::string::npos, object.ToString().find("\"dev_id\":\"1\""));
}

TEST_F(MESSAGE_MESSAGE_STATUS_TEST, FromObject) {
    GlobalMockObject::verify();

    std::string info = "this is test";
    StatusInfo status_info("1", ERR, info);

    Status status;
    status.AddStatusInfo(status_info);

    NanoJson::Json object;
    status.ToObject(object);

    Status status1;
    status1.FromObject(object);

    EXPECT_EQ(status.status, status1.status);
}

TEST_F(MESSAGE_MESSAGE_STATUS_TEST, ToString) {
    GlobalMockObject::verify();

    std::string info = "this is test";
    StatusInfo status_info("1", ERR, info);

    Status status;
    status.AddStatusInfo(status_info);
    std::string str = "{\"info\":[{\"info\":\"this is test\",\"status\":1,\"dev_id\":\"1\"}],\"status\":1}";
    EXPECT_NE(std::string::npos, status.ToString().find("\"info\":\"this is test\""));
    EXPECT_NE(std::string::npos, status.ToString().find("\"status\":1"));
    EXPECT_NE(std::string::npos, status.ToString().find("\"dev_id\":\"1\""));
}

TEST_F(MESSAGE_MESSAGE_STATUS_TEST, FromString) {
    GlobalMockObject::verify();

    std::string info = "this is test";
    StatusInfo status_info("1", ERR, info);

    Status status;
    status.AddStatusInfo(status_info);

    Status status1;
    EXPECT_FALSE(status1.FromString("{"));
    EXPECT_FALSE(status1.FromString(""));
    EXPECT_TRUE(status1.FromString(status.ToString()));
}

///////////////////////////////////////////////////////////////////
class MESSAGE_MESSAGE_PROFILEPARAMS_TEST: public testing::Test {
protected:
    virtual void SetUp() {
    }
    virtual void TearDown() {
    }
};


TEST_F(MESSAGE_MESSAGE_PROFILEPARAMS_TEST, FromObject) {
    GlobalMockObject::verify();

    ProfileParams params;

    NanoJson::Json object;
    params.ToObject(object);

    ProfileParams params1;
    params1.FromObject(object);

    EXPECT_EQ(params1.aicore_sampling_interval, params.aicore_sampling_interval);
    EXPECT_EQ(params1.cpu_sampling_interval, params.cpu_sampling_interval);
    EXPECT_EQ(params1.sys_sampling_interval, params.sys_sampling_interval);
    EXPECT_EQ(params1.pid_sampling_interval, params.pid_sampling_interval);
    EXPECT_EQ(params1.hardware_mem_sampling_interval, params.hardware_mem_sampling_interval);
    EXPECT_EQ(params1.llc_interval, params.llc_interval);
    EXPECT_EQ(params1.ddr_interval, params.ddr_interval);
    EXPECT_EQ(params1.hbmInterval, params.hbmInterval);
    EXPECT_EQ(params1.io_sampling_interval, params.io_sampling_interval);
    EXPECT_EQ(params1.nicInterval, params.nicInterval);
    EXPECT_EQ(params1.roceInterval, params.roceInterval);
    EXPECT_EQ(params1.interconnection_sampling_interval, params.interconnection_sampling_interval);
    EXPECT_EQ(params1.hccsInterval, params.hccsInterval);
    EXPECT_EQ(params1.pcieInterval, params.pcieInterval);
    EXPECT_EQ(params1.dvpp_sampling_interval, params.dvpp_sampling_interval);
}

TEST_F(MESSAGE_MESSAGE_PROFILEPARAMS_TEST, DISABLED_ToString) {
    GlobalMockObject::verify();

    ProfileParams params;
    std::string str = "{\"hostAllPidMemProfiling\":\"off\",\"hcclTrace\":\"\",\"runtimeApi\":\"off\",\"aicore_sampling_interval\":10,\"qosProfiling\":\"\",\"dvpp_sampling_interval\":20,\"aicpuTrace\":\"\",\"aiv_sampling_interval\":10,\"ccuInstr\":\"off\",\"host_mem_profiling\":\"off\",\"host_osrt_profiling\":\"off\",\"hostProfiling\":false,\"io_sampling_interval\":10,\"host_network_profiling\":\"off\",\"nicProfiling\":\"off\",\"ts_cpu_hot_function\":\"\",\"instrProfilingFreq\":1000,\"ai_core_profiling_metrics\":\"\",\"dvpp_profiling\":\"off\",\"ubProfiling\":\"off\",\"interconnection_sampling_interval\":20,\"l2CacheTaskProfilingEvents\":\"\",\"sys_sampling_interval\":100,\"cpu_sampling_interval\":20,\"ai_core_profiling_mode\":\"\",\"devices\":\"\",\"runtimeTrace\":\"\",\"app_parameters\":\"\",\"host_cpu_profiling\":\"off\",\"interconnection_profiling\":\"off\",\"pcieProfiling\":\"\",\"npuEvents\":\"\",\"ts_memcpy\":\"\",\"memServiceflow\":\"\",\"sys_profiling\":\"off\",\"ai_core_status\":\"\",\"profiling_options\":\"\",\"pcSampling\":\"off\",\"roceProfiling\":\"off\",\"aiCtrlCpuProfiling\":\"off\",\"tsCpuProfiling\":\"off\",\"pureCpu\":\"off\",\"hardware_mem_sampling_interval\":20000,\"io_profiling\":\"off\",\"cpu_profiling\":\"off\",\"instrProfiling\":\"\",\"host_sys\":\"\",\"app_dir\":\"\",\"memProfiling\":\"off\",\"ts_cpu_profiling_events\":\"\",\"hostSysUsage\":\"\",\"storageLimit\":\"\",\"ai_core_profiling\":\"\",\"app_env\":\"\",\"hscb\":\"off\",\"result_dir\":\"\",\"profiling_mode\":\"\",\"llc_interval\":20,\"jobInfo\":\"\",\"hwts_log1\":\"\",\"pid_sampling_interval\":100,\"aiv_profiling_metrics\":\"\",\"aiv_profiling_events\":\"\",\"aiv_profiling_mode\":\"\",\"hardware_mem\":\"off\",\"msprof\":\"off\",\"taskTrace\":\"on\",\"msprof_llc_profiling\":\"\",\"prof_level\":\"off\",\"ts_keypoint\":\"\",\"job_id\":\"\",\"app_location\":\"\",\"app\":\"\",\"ai_core_lpm\":\"off\",\"ubInterval\":20,\"aiv_profiling\":\"\",\"hbmProfiling\":\"\",\"ts_task_track\":\"\",\"ai_core_metrics\":\"\",\"ts_fw_training\":\"\",\"ts_cpu_usage\":\"\",\"taskTime\":\"on\",\"ts_timeline\":\"\",\"stars_acsq_task\":\"\",\"ai_vector_status\":\"\",\"fwkSchedule\":\"off\",\"sysLp\":\"off\",\"taskTsfw\":\"off\",\"hwts_log\":\"\",\"l2CacheTaskProfiling\":\"\",\"profiling_period\":-1,\"ai_core_profiling_events\":\"\",\"hccsProfiling\":\"off\",\"hccsInterval\":20,\"ai_ctrl_cpu_profiling_events\":\"\",\"nicInterval\":10,\"taskBlock\":\"\",\"aiv_metrics\":\"\",\"pcieInterval\":20,\"isCancel\":false,\"roceInterval\":10,\"pid_profiling\":\"off\",\"llc_profiling\":\"\",\"opType\":\"\",\"llc_profiling_events\":\"\",\"durationTime\":\"\",\"taskMemory\":\"off\",\"memInterval\":20,\"ddr_profiling\":\"\",\"ddr_interval\":20,\"msprofBinPid\":-1,\"ddr_master_id\":0,\"hbm_profiling_events\":\"\",\"hbmInterval\":20,\"ddr_profiling_events\":\"\",\"host_sys_pid\":-1,\"host_disk_profiling\":\"off\",\"msproftx\":\"off\",\"host_disk_freq\":50,\"sysLpFreq\":10000,\"aicScale\":\"all\",\"profMode\":\"\",\"delayTime\":\"\",\"qosEvents\":\"\",\"hostProfilingSamplingInterval\":20,\"acl\":\"\",\"hostAllPidCpuProfiling\":\"off\"}";
    EXPECT_STREQ(str.c_str(), params.ToString().c_str());
}

TEST_F(MESSAGE_MESSAGE_PROFILEPARAMS_TEST, FromString) {
    GlobalMockObject::verify();

    ProfileParams params;

    ProfileParams params1;
    EXPECT_FALSE(params1.FromString("{"));
    EXPECT_FALSE(params1.FromString(""));
    EXPECT_TRUE(params1.FromString(params.ToString()));
}

TEST_F(MESSAGE_MESSAGE_PROFILEPARAMS_TEST, NtsMetricsSerialization) {
    GlobalMockObject::verify();

    ProfileParams params;
    params.ntsMetrics = "PipeUtilization";
    params.ntsPmuEvents = "0x301,0x312";

    std::string serializedParams = params.ToString();
    EXPECT_NE(std::string::npos, serializedParams.find("\"ntsPmuEvents\":\"0x301,0x312\""));
    EXPECT_EQ(std::string::npos, serializedParams.find("ntsPmuProfilingEvents"));

    ProfileParams params1;
    EXPECT_TRUE(params1.FromString(serializedParams));
    EXPECT_EQ("PipeUtilization", params1.ntsMetrics);
    EXPECT_EQ("0x301,0x312", params1.ntsPmuEvents);
}

///////////////////////////////////////////////////////////////////
class MESSAGE_MESSAGE_JOBCONTEXT_TEST: public testing::Test {
protected:
    virtual void SetUp() {
    }
    virtual void TearDown() {
    }
};

TEST_F(MESSAGE_MESSAGE_JOBCONTEXT_TEST, ToObject) {
    GlobalMockObject::verify();

    JobContext ctx;

    NanoJson::Json object;
    ctx.ToObject(object);

    EXPECT_NE(std::string::npos, object.ToString().find("\"dataModule\":0"));
    EXPECT_NE(std::string::npos, object.ToString().find("\"chunkEndTime\":0"));
    EXPECT_NE(std::string::npos, object.ToString().find("\"stream_enabled\":\"\""));
    EXPECT_NE(std::string::npos, object.ToString().find("\"chunkStartTime\":0"));
    EXPECT_NE(std::string::npos, object.ToString().find("\"dev_id\":\"\""));
    EXPECT_NE(std::string::npos, object.ToString().find("\"tag\":\"\""));
    EXPECT_NE(std::string::npos, object.ToString().find("\"module\":\"\""));
    EXPECT_NE(std::string::npos, object.ToString().find("\"job_id\":\"\""));
    EXPECT_NE(std::string::npos, object.ToString().find("\"result_dir\":\"\""));
}

TEST_F(MESSAGE_MESSAGE_JOBCONTEXT_TEST, ToString) {
    GlobalMockObject::verify();

    JobContext ctx;

    EXPECT_NE(std::string::npos, ctx.ToString().find("\"dataModule\":0"));
    EXPECT_NE(std::string::npos, ctx.ToString().find("\"chunkEndTime\":0"));
    EXPECT_NE(std::string::npos, ctx.ToString().find("\"stream_enabled\":\"\""));
    EXPECT_NE(std::string::npos, ctx.ToString().find("\"chunkStartTime\":0"));
    EXPECT_NE(std::string::npos, ctx.ToString().find("\"dev_id\":\"\""));
    EXPECT_NE(std::string::npos, ctx.ToString().find("\"tag\":\"\""));
    EXPECT_NE(std::string::npos, ctx.ToString().find("\"module\":\"\""));
    EXPECT_NE(std::string::npos, ctx.ToString().find("\"job_id\":\"\""));
    EXPECT_NE(std::string::npos, ctx.ToString().find("\"result_dir\":\"\""));
}

TEST_F(MESSAGE_MESSAGE_JOBCONTEXT_TEST, FromString) {
    GlobalMockObject::verify();

    JobContext ctx;

    JobContext ctx1;
    EXPECT_FALSE(ctx1.FromString("{"));
    EXPECT_FALSE(ctx1.FromString(""));
    EXPECT_TRUE(ctx1.FromString(ctx.ToString()));
}