ed482176创建于 2025年12月30日历史提交
/* -------------------------------------------------------------------------
 * 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 "mockcpp/mockcpp.hpp"
#define private public
#include "runtime/inject_helpers/KernelReplacement.h"
#undef private

#include "runtime/inject_helpers/KernelContext.h"
#include "runtime/RuntimeOrigin.h"
#include "utils/FileSystem.h"

using namespace std;

TEST(KernelReplacement, input_empty_handle_then_call_create_expect_false)
{
    EXPECT_FALSE(KernelReplacement::Instance().CreateHandle(nullptr, 0));
}

void PrepareCreateHandle(uint64_t mockRegId)
{
    KernelMatcher::Config config;
    config.launchId = 0;
    string fakekernelPath = "kernel.bin";
    KernelReplacement::Instance().Init(fakekernelPath, config);
    uint64_t(KernelContext::*funcPtr)(uint64_t) = &KernelContext::GetRegisterId;

    MOCKER(funcPtr).stubs().will(returnObjectList(mockRegId, mockRegId, 1));
    KernelContext::RegisterEvent event;
    rtDevBinary_t bin;
    event.bin = bin;
    MOCKER(&KernelContext::GetRegisterEvent).stubs().with(any(), outBound(event)).will(returnValue(true));

    MOCKER(&ReadBinary).stubs().will(returnValue(1));

    const int mockSize = 10;
    vector<uint8_t> handleData(10);
    void *handleAddr = reinterpret_cast<void *>(handleData.data());
    MOCKER(&rtRegisterAllKernelOrigin).stubs()
        .with(any(), outBoundP(&handleAddr, sizeof(void *)))
        .will(returnValue(RT_ERROR_NONE));
}

TEST(KernelReplacement, init_valid_config_then_repeat_call_create_expect_success)
{
    uint64_t mockRegId = 11;
    PrepareCreateHandle(mockRegId);
    const int mockSize = 10;
    uint64_t mockData[mockSize] = {0};
    EXPECT_TRUE(KernelReplacement::Instance().CreateHandle((void **)&mockData, 0));
    EXPECT_EQ(KernelReplacement::Instance().oldKernelRegId_, mockRegId);
    EXPECT_TRUE(KernelReplacement::Instance().replaceTask_);
    EXPECT_TRUE(KernelReplacement::Instance().CreateHandle((void **)&mockData, 0));
    EXPECT_FALSE(KernelReplacement::Instance().CreateHandle((void **)&mockData, 0));

    GlobalMockObject::verify();
}

TEST(KernelReplacement, input_nullptr_then_call_release_expect_false)
{
    ASSERT_FALSE(KernelReplacement::Instance().ReleaseHandle(nullptr));
}

TEST(KernelReplacement, create_handle_success_then_call_release_expect_true)
{
    uint64_t mockRegId = 11;
    PrepareCreateHandle(mockRegId);
    const int mockSize = 10;
    uint64_t mockData[mockSize] = {0};
    uint64_t(KernelContext::*funcPtr)(const void*, bool) = &KernelContext::GetRegisterId;

    MOCKER(funcPtr).stubs().will(returnObjectList(mockRegId, mockRegId, 1));
    EXPECT_TRUE(KernelReplacement::Instance().CreateHandle((void **)&mockData, 0));
    EXPECT_TRUE(KernelReplacement::Instance().ReleaseHandle(mockData));
    GlobalMockObject::verify();
}

TEST(KernelReplaceTask, set_read_binary_failed_then_test_run_expect_fail)
{
    MOCKER(&KernelContext::GetRegisterEvent).stubs().will(returnValue(true));
    MOCKER(&ReadBinary).stubs().will(returnValue(0U));
    const int mockSize = 10;
    uint64_t mockData[mockSize] = {0};
    KernelReplaceTask task("");
    EXPECT_FALSE(task.Run((void **)&mockData, 0, false));
    GlobalMockObject::verify();
}

TEST(KernelReplaceTask, set_rt_register_all_failed_then_test_run_expect_fail)
{
    MOCKER(&KernelContext::GetRegisterEvent).stubs().will(returnValue(true));
    MOCKER(&ReadBinary).stubs().will(returnValue(1U));
    MOCKER(&rtRegisterAllKernelOrigin).stubs()
        .will(returnValue(RT_ERROR_RESERVED));
    const int mockSize = 10;
    uint64_t mockData[mockSize] = {0};
    KernelReplaceTask task("");
    EXPECT_FALSE(task.Run((void **)&mockData, 0, false));
    GlobalMockObject::verify();
}

TEST(KernelDumper, set_match_config_test_dump_expect_success)
{
    MOCKER(&MkdirRecusively).stubs().will(returnValue(true));
    MOCKER(&KernelContext::Save).stubs().will(returnValue(true));
    KernelMatcher::Config config{};
    config.launchId = 0;
    KernelDumper::Instance().Init("./", config);
    EXPECT_TRUE(KernelDumper::Instance().Dump(0));
    KernelDumper::Instance() = KernelDumper();
    GlobalMockObject::verify();
}