/*
 * -------------------------------------------------------------------------
 * This file is part of the MindStudio project.
 * Copyright (c) 2025 Huawei Technologies Co.,Ltd.
 *
 * MindStudio is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * 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 FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 */

#include <gtest/gtest.h>
#include "CommunicationProtocolRequest.h"

const int NUMBER_TEN = 10;
const int NUMBER_ONE = 1;
class CommunicationProtocolRequestTest : public ::testing::Test {};

TEST_F(CommunicationProtocolRequestTest, OperatorDetailsParamTest) {
    Dic::Protocol::OperatorDetailsParam base;
    base.iterationId = "1";
    base.orderBy = "orderBy";
    base.order = "order";
    base.stage = "stage";
    base.pageSize = NUMBER_ONE;
    base.currentPage = NUMBER_TEN;
    Dic::Protocol::OperatorDetailsParam param1(base);
    param1.iterationId = ";";
    Dic::Protocol::OperatorDetailsParam param3(base);
    param3.orderBy = ";";
    Dic::Protocol::OperatorDetailsParam param4(base);
    param4.order = ";";
    Dic::Protocol::OperatorDetailsParam param5(base);
    param5.stage = ";";
    std::string msg;
    EXPECT_EQ(param1.CheckParams(msg), false);
    EXPECT_EQ(param3.CheckParams(msg), false);
    EXPECT_EQ(param4.CheckParams(msg), false);
    EXPECT_EQ(param5.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, BandwidthDataParamTest) {
    Dic::Protocol::BandwidthDataParam param1 = {";", "1", "opName", "stage"};
    Dic::Protocol::BandwidthDataParam param2 = {"1", "1", ";", "stage"};
    Dic::Protocol::BandwidthDataParam param3 = {"1", "1", "opName", ";"};
    std::string msg;
    EXPECT_EQ(param1.CheckParams(msg), false);
    EXPECT_EQ(param2.CheckParams(msg), false);
    EXPECT_EQ(param3.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DistributionDataParamTest) {
    Dic::Protocol::DistributionDataParam param1 = {";", "1", "opName", "type", "stage", ""};
    Dic::Protocol::DistributionDataParam param2 = {"1", "1", ";", "type", "stage", ""};
    Dic::Protocol::DistributionDataParam param3 = {"1", "1", "opName", ";", "stage", ""};
    Dic::Protocol::DistributionDataParam param4 = {"1", "1", "opName", "type", ";", ""};
    std::string msg;
    EXPECT_EQ(param1.CheckParams(msg), false);
    EXPECT_EQ(param2.CheckParams(msg), false);
    EXPECT_EQ(param3.CheckParams(msg), false);
    EXPECT_EQ(param4.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorNamesParamsTest) {
    Dic::Protocol::OperatorNamesParams base;
    base.iterationId = "1";
    base.rankList.emplace_back("1");
    base.stage = "stage";
    Dic::Protocol::OperatorNamesParams param1(base);
    param1.iterationId = ";";
    Dic::Protocol::OperatorNamesParams param2(base);
    param2.stage = ";";
    std::string msg;
    EXPECT_EQ(param1.CheckParams(msg), false);
    EXPECT_EQ(param2.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DurationListParamsTest) {
    Dic::Protocol::DurationListParams base;
    base.iterationId = "1";
    base.operatorName = "opName";
    base.stage = "stage";
    Dic::Protocol::DurationListParams param1(base);
    param1.iterationId = ";";
    Dic::Protocol::DurationListParams param2(base);
    param2.operatorName = ";";
    Dic::Protocol::DurationListParams param3(base);
    param3.stage = ";";
    std::string msg;
    EXPECT_EQ(param1.CheckParams(msg), false);
    EXPECT_EQ(param2.CheckParams(msg), false);
    EXPECT_EQ(param3.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, MatrixGroupParamTest) {
    Dic::Protocol::MatrixGroupParam param1 = {";", "1"};
    std::string msg;
    EXPECT_EQ(param1.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, MatrixGroupParamTestBaselineStepError) {
    Dic::Protocol::MatrixGroupParam param1 = {"1", ";"};
    std::string msg;
    EXPECT_EQ(param1.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, MatrixBandwidthParamTest) {
    Dic::Protocol::MatrixBandwidthParam param1 = {"stage", "opName", ";", "", "", false, "1"};
    Dic::Protocol::MatrixBandwidthParam param2 = {"stage", ";", "1", "", "", false, "1"};
    Dic::Protocol::MatrixBandwidthParam param3 = {";", "opName", "1", "", "", false, "1"};
    Dic::Protocol::MatrixBandwidthParam param4 = {"stage", "opName", "1", "", "", false, ";"};
    std::string msg;
    EXPECT_EQ(param1.CheckParams(msg), false);
    EXPECT_EQ(param2.CheckParams(msg), false);
    EXPECT_EQ(param3.CheckParams(msg), false);
    EXPECT_EQ(param4.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorDetailsParamTestPageSizeInvalid) {
    Dic::Protocol::OperatorDetailsParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.orderBy = "time";
    param.order = "desc";
    param.stage = "forward";
    param.queryType = "Comparison";
    param.pgName = "test";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    param.pageSize = 0;
    param.currentPage = 1;
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorDetailsParamTestCurrentPageInvalid) {
    Dic::Protocol::OperatorDetailsParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.pageSize = 10;
    param.currentPage = 0;
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorDetailsParamTestRankIdInvalid) {
    Dic::Protocol::OperatorDetailsParam param;
    param.iterationId = "1";
    param.rankId = ";";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorDetailsParamTestQueryTypeInvalid) {
    Dic::Protocol::OperatorDetailsParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.queryType = ";";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorDetailsParamTestPgNameInvalid) {
    Dic::Protocol::OperatorDetailsParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.pgName = ";";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorDetailsParamTestClusterPathInvalid) {
    Dic::Protocol::OperatorDetailsParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.clusterPath = ";";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorDetailsParamTestGroupIdHashInvalid) {
    Dic::Protocol::OperatorDetailsParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.clusterPath = "/data";
    param.groupIdHash = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, BandwidthDataParamTestRankIdInvalid) {
    Dic::Protocol::BandwidthDataParam param;
    param.iterationId = "1";
    param.rankId = ";";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.pgName = "test";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, BandwidthDataParamTestPgNameInvalid) {
    Dic::Protocol::BandwidthDataParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.pgName = ";";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, BandwidthDataParamTestClusterPathInvalid) {
    Dic::Protocol::BandwidthDataParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.clusterPath = ";";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, BandwidthDataParamTestGroupIdHashInvalid) {
    Dic::Protocol::BandwidthDataParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.clusterPath = "/data";
    param.groupIdHash = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DistributionDataParamTestRankIdInvalid) {
    Dic::Protocol::DistributionDataParam param;
    param.iterationId = "1";
    param.rankId = ";";
    param.operatorName = "AllReduce";
    param.transportType = "SDMA";
    param.stage = "forward";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DistributionDataParamTestPgNameInvalid) {
    Dic::Protocol::DistributionDataParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.pgName = ";";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DistributionDataParamTestClusterPathInvalid) {
    Dic::Protocol::DistributionDataParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.clusterPath = ";";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DistributionDataParamTestGroupIdHashInvalid) {
    Dic::Protocol::DistributionDataParam param;
    param.iterationId = "1";
    param.rankId = "0";
    param.clusterPath = "/data";
    param.groupIdHash = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, IterationsParamsTestClusterPathInvalid) {
    Dic::Protocol::IterationsParams param;
    param.clusterPath = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, IterationsParamsTestNormal) {
    Dic::Protocol::IterationsParams param;
    param.isCompare = true;
    param.clusterPath = "/data";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), true);
}

TEST_F(CommunicationProtocolRequestTest, OperatorNamesParamsTestPgNameInvalid) {
    Dic::Protocol::OperatorNamesParams param;
    param.iterationId = "1";
    param.stage = "forward";
    param.pgName = ";";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorNamesParamsTestClusterPathInvalid) {
    Dic::Protocol::OperatorNamesParams param;
    param.iterationId = "1";
    param.stage = "forward";
    param.clusterPath = ";";
    param.groupIdHash = "hash123";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, OperatorNamesParamsTestGroupIdHashInvalid) {
    Dic::Protocol::OperatorNamesParams param;
    param.iterationId = "1";
    param.stage = "forward";
    param.clusterPath = "/data";
    param.groupIdHash = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DurationListParamsTestBaselineIterationIdInvalid) {
    Dic::Protocol::DurationListParams param;
    param.iterationId = "1";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.baselineIterationId = ";";
    param.clusterPath = "/data";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DurationListParamsTestPgNameInvalid) {
    Dic::Protocol::DurationListParams param;
    param.iterationId = "1";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.pgName = ";";
    param.clusterPath = "/data";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DurationListParamsTestClusterPathInvalid) {
    Dic::Protocol::DurationListParams param;
    param.iterationId = "1";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.clusterPath = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DurationListParamsTestGroupIdHashInvalid) {
    Dic::Protocol::DurationListParams param;
    param.iterationId = "1";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.clusterPath = "/data";
    param.groupIdHash = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, DurationListParamsTestBaselineGroupIdHashInvalid) {
    Dic::Protocol::DurationListParams param;
    param.iterationId = "1";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.clusterPath = "/data";
    param.groupIdHash = "hash123";
    param.baselineGroupIdHash = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, MatrixGroupParamTestClusterPathInvalid) {
    Dic::Protocol::MatrixGroupParam param;
    param.iterationId = "1";
    param.baselineIterationId = "2";
    param.clusterPath = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, MatrixBandwidthParamTestPgNameInvalid) {
    Dic::Protocol::MatrixBandwidthParam param;
    param.iterationId = "1";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.baselineIterationId = "2";
    param.pgName = ";";
    param.clusterPath = "/data";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, MatrixBandwidthParamTestClusterPathInvalid) {
    Dic::Protocol::MatrixBandwidthParam param;
    param.iterationId = "1";
    param.operatorName = "AllReduce";
    param.stage = "forward";
    param.baselineIterationId = "2";
    param.clusterPath = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, CommunicationAdvisorParamTestClusterPathInvalid) {
    Dic::Protocol::CommunicationAdvisorParam param;
    param.clusterPath = ";";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), false);
}

TEST_F(CommunicationProtocolRequestTest, CommunicationAdvisorParamTestNormal) {
    Dic::Protocol::CommunicationAdvisorParam param;
    param.clusterPath = "/data";
    std::string msg;
    EXPECT_EQ(param.CheckParams(msg), true);
}