/*
 * -------------------------------------------------------------------------
 * 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 <string>
#include "TrackInfoManager.h"

using namespace Dic::Module::Timeline;
class TrackInfoManagerTest : public ::testing::Test {};

/**
 * 测试Text场景首次导入
 */
TEST_F(TrackInfoManagerTest, TestGetTrackIdFirst) {
    TrackInfoManager::Instance().Reset();
    uint64_t first = TrackInfoManager::Instance().GetTrackId("gggg", "ppp", "ttt");
    uint64_t second = TrackInfoManager::Instance().GetTrackId("gggg", "ppp", "ttt");
    TrackInfo trackInfo;
    TrackInfoManager::Instance().GetTrackInfo(second, trackInfo, "gggg");
    EXPECT_EQ(first, second);
    EXPECT_EQ(trackInfo.processId, "ppp");
    EXPECT_EQ(trackInfo.threadId, "ttt");
    EXPECT_EQ(trackInfo.host.empty(), true);
    EXPECT_EQ(trackInfo.cardId, "gggg");
    EXPECT_EQ(trackInfo.rankId, "gggg");
    EXPECT_EQ(trackInfo.deviceId, "gggg");
    TrackInfoManager::Instance().Reset();
}

/**
 * 测试TrackId不存在
 */
TEST_F(TrackInfoManagerTest, TestTrackIdNotExist) {
    TrackInfoManager::Instance().Reset();
    TrackInfo trackInfo2;
    uint64_t notExistTrackId = 999999;
    bool result = TrackInfoManager::Instance().GetTrackInfo(notExistTrackId, trackInfo2, "");
    EXPECT_EQ(result, false);
    TrackInfoManager::Instance().Reset();
}

/**
 * 测试Text场景二次导入
 */
TEST_F(TrackInfoManagerTest, TestSecondImportScene) {
    TrackInfoManager::Instance().Reset();
    std::map<uint64_t, std::pair<std::string, std::string>> threadMap;
    std::pair<std::string, std::string> p("kkkk", "Hello");
    uint64_t expectTrackId = 3;
    threadMap.emplace(expectTrackId, p);
    TrackInfoManager::Instance().UpdateTrackIdMap("7788", threadMap);
    TrackInfo trackInfo;
    bool result = TrackInfoManager::Instance().GetTrackInfo(expectTrackId, trackInfo, "7788");
    EXPECT_EQ(result, true);
    EXPECT_EQ(trackInfo.processId, "Hello");
    EXPECT_EQ(trackInfo.threadId, "kkkk");
    EXPECT_EQ(trackInfo.host.empty(), true);
    EXPECT_EQ(trackInfo.cardId, "7788");
    EXPECT_EQ(trackInfo.rankId, "7788");
    EXPECT_EQ(trackInfo.deviceId, "7788");
    TrackInfoManager::Instance().Reset();
}

/**
 * 测试DB场景host存在但devicemap不存在
 */
TEST_F(TrackInfoManagerTest, TestHostIsExistAndDeviceMapNotExist) {
    TrackInfoManager::Instance().Reset();
    const std::string cardId = "hhhhhhhhhhh 9988";
    TrackInfoManager::Instance().UpdateHost(cardId, "hhhhhhhhhhh ");
    uint64_t expectTrackId = TrackInfoManager::Instance().GetTrackId(cardId, "ppp", "ttt");
    TrackInfo trackInfo;
    bool result = TrackInfoManager::Instance().GetTrackInfo(expectTrackId, trackInfo, cardId);
    EXPECT_EQ(result, true);
    EXPECT_EQ(trackInfo.processId, "ppp");
    EXPECT_EQ(trackInfo.threadId, "ttt");
    EXPECT_EQ(trackInfo.host, "hhhhhhhhhhh ");
    EXPECT_EQ(trackInfo.cardId, cardId);
    EXPECT_EQ(trackInfo.rankId, "9988");
    EXPECT_EQ(trackInfo.deviceId, "9988");
    TrackInfoManager::Instance().Reset();
}

/**
 * 测试DB场景host和devicemap都存在
 */
TEST_F(TrackInfoManagerTest, TestHostAndDeviceMapExist) {
    TrackInfoManager::Instance().Reset();
    const std::string cardId = "hhhhhhhhhhh 9988";
    TrackInfoManager::Instance().UpdateHost(cardId, "hhhhhhhhhhh ");
    std::unordered_map<std::string, std::string> deviceMap;
    deviceMap = {{"9988", "1122"}};
    TrackInfoManager::Instance().UpdateDeviceMap(cardId, deviceMap);
    uint64_t expectTrackId = TrackInfoManager::Instance().GetTrackId(cardId, "ppp", "ttt");
    TrackInfo trackInfo;
    bool result = TrackInfoManager::Instance().GetTrackInfo(expectTrackId, trackInfo, cardId);
    EXPECT_EQ(result, true);
    EXPECT_EQ(trackInfo.processId, "ppp");
    EXPECT_EQ(trackInfo.threadId, "ttt");
    EXPECT_EQ(trackInfo.host, "hhhhhhhhhhh ");
    EXPECT_EQ(trackInfo.cardId, cardId);
    EXPECT_EQ(trackInfo.rankId, "9988");
    EXPECT_EQ(trackInfo.deviceId, "1122");
    TrackInfoManager::Instance().Reset();
}

/**
 * 测试DB场景host和devicemap都存在,但deviceMap里rankId不存在
 */
TEST_F(TrackInfoManagerTest, TestHostAndDeviceMapExistAndRankIdNotExist) {
    TrackInfoManager::Instance().Reset();
    const std::string cardId = "hhhhhhhhhhh 9988";
    TrackInfoManager::Instance().UpdateHost(cardId, "hhhhhhhhhhh ");
    std::unordered_map<std::string, std::string> deviceMap;
    deviceMap = {{"9987", "1122"}};
    TrackInfoManager::Instance().UpdateDeviceMap(cardId, deviceMap);
    uint64_t expectTrackId = TrackInfoManager::Instance().GetTrackId(cardId, "ppp", "ttt");
    TrackInfo trackInfo;
    bool result = TrackInfoManager::Instance().GetTrackInfo(expectTrackId, trackInfo, cardId);
    EXPECT_EQ(result, true);
    EXPECT_EQ(trackInfo.processId, "ppp");
    EXPECT_EQ(trackInfo.threadId, "ttt");
    EXPECT_EQ(trackInfo.host, "hhhhhhhhhhh ");
    EXPECT_EQ(trackInfo.cardId, cardId);
    EXPECT_EQ(trackInfo.rankId, "9988");
    EXPECT_EQ(trackInfo.deviceId, "9988");
    TrackInfoManager::Instance().Reset();
}