-- Copyright (c) 2026 Huawei Technologies Co., Ltd.
-- openUBMC 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.

local c_mctp_eid_table = require('mctp_eid_table')
local lu = require('luaunit')
local mctp_def = require('mctp_def')

TestMctpEidTable = {}

function TestMctpEidTable:setupClass()
    local system_id = 1
    self.eid_table = c_mctp_eid_table.new(system_id)
end

function TestMctpEidTable:teardown()
    self.eid_table:reset()
end

local reg_info =
    { module_name = 'MctpTest', phy_addr = 8, msg_src_eid = 9, msg_type = 2, pid = 1, process_tag = 3224632059 }
local reg_info2 =
    { module_name = 'MctpTest', phy_addr = 8, msg_src_eid = 9, msg_type = 2, pid = 2, process_tag = 3224632059 }

function TestMctpEidTable:test_add_reg_info()
    local updated = false
    local add_reg = {}
    local del_reg = {}
    local update_reg = {}
    self.eid_table.on_update_reg:on(function(reg)
        updated = true
        update_reg = reg
    end)
    self.eid_table.on_add_reg:on(function(reg)
        add_reg = reg
    end)
    self.eid_table.on_del_reg:on(function(reg)
        del_reg = reg
    end)
    -- 第一次添加
    self.eid_table:add_reg_info(
        reg_info.process_tag,
        reg_info.pid,
        reg_info.msg_src_eid,
        reg_info.phy_addr,
        reg_info.msg_type,
        reg_info.module_name
    )
    local expert = {
        module_name = 'MctpTest',
        phy_addr = 8,
        msg_src_eid = 9,
        msg_type = 2,
        pid = 1,
        process_tag = 3224632059,
        medium_type = mctp_def.PHY_MEDIUM_PCI,
        ep_status = mctp_def.ENDPOINT_IS_DISCOVERY,
    }
    lu.assertEquals(updated, false)
    lu.assertEquals(add_reg, expert)
    lu.assertEquals(self.eid_table.reg_table[1], expert)
    updated = false
    -- 第二次添加
    self.eid_table:add_reg_info(
        reg_info2.process_tag,
        reg_info2.pid,
        reg_info2.msg_src_eid,
        reg_info2.phy_addr,
        reg_info2.msg_type,
        reg_info2.module_name
    )
    local expert2 = {
        module_name = 'MctpTest',
        phy_addr = 8,
        msg_src_eid = 9,
        msg_type = 2,
        pid = 2,
        process_tag = 3224632059,
        medium_type = mctp_def.PHY_MEDIUM_PCI,
        ep_status = mctp_def.ENDPOINT_IS_DISCOVERY,
    }
    lu.assertEquals(updated, false)
    lu.assertEquals(add_reg, expert2)
    lu.assertEquals(self.eid_table.reg_table[2], expert2)
    -- 修改信息
    expert.module_name = 'MctpTest2'
    self.eid_table:add_reg_info(
        reg_info.process_tag,
        reg_info.pid,
        reg_info.msg_src_eid,
        reg_info.phy_addr,
        reg_info.msg_type,
        'MctpTest2'
    )
    lu.assertEquals(updated, true)
    lu.assertEquals(update_reg, expert)
    lu.assertEquals(self.eid_table.reg_table[1], expert)
    -- 重置
    self.eid_table:reset()
    -- 重置是倒序, 第一个添加的reg_info最后一个删除
    lu.assertEquals(del_reg, expert)
    lu.assertEquals(self.eid_table.reg_table, {})
end

function TestMctpEidTable:test_dump_eid_table()
    self.eid_table:add_reg_info(
        reg_info.process_tag,
        reg_info.pid,
        reg_info.msg_src_eid,
        reg_info.phy_addr,
        reg_info.msg_type,
        reg_info.module_name
    )
    local res = self.eid_table:dump_eid_table()
    local expert = {
        '[MCTP Registry Info]\n',
        'idx:0, module_name = MctpTest, phy_addr = 8, msg_src_eid = 9, msg_type = 2, pid = 1, process_tag = 3224632059\n',
    }
    lu.assertEquals(res, expert)
end

function TestMctpEidTable:test_find_reg_info()
    self.eid_table:add_reg_info(
        reg_info.process_tag,
        reg_info.pid,
        reg_info.msg_src_eid,
        reg_info.phy_addr,
        reg_info.msg_type,
        reg_info.module_name
    )
    local res = self.eid_table:find_reg_info(reg_info.pid, reg_info.msg_src_eid, reg_info.phy_addr, reg_info.msg_type)
    local expert = {
        module_name = 'MctpTest',
        phy_addr = 8,
        msg_src_eid = 9,
        msg_type = 2,
        pid = 1,
        process_tag = 3224632059,
        medium_type = mctp_def.PHY_MEDIUM_PCI,
        ep_status = mctp_def.ENDPOINT_IS_DISCOVERY,
    }
    lu.assertEquals(res, expert)
    self.eid_table:reset()
    res = self.eid_table:find_reg_info(reg_info.pid, reg_info.msg_src_eid, reg_info.phy_addr, reg_info.msg_type)
    lu.assertEquals(res, nil)
end