-- Copyright (c) 2024 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 lu = require 'luaunit'
local Hi182X = require 'hardware_config.Hi182X'
local hi1822_mctp = Hi182X.mctp('endpoint')

-- 测试套件
TestHi182X = {}

-- 覆盖 LinkStatus 中速率表、全双工表以及 speed_duplex==0x0F 分支
function TestHi182X:test_link_status()
    -- 基础连接状态解析（不要求具体速率/双工取值，只验证结构）
    local data = string.char(
        0x00, 0x00,  -- response_code
        0x00, 0x00,  -- reason_code
        0x00,        -- extended_speed_duplex
        0x00,        -- 第二个字节
        0x00,        -- 第三个字节
        0x05,        -- 第四个字节，具体比特含义由实现决定
        0x00, 0x00, 0x00, 0x00,  -- other indication
        0x00, 0x00, 0x00, 0x00   -- oem_link_status
    )
    local result = hi1822_mctp.properties.LinkStatus.response(data)

    lu.assertNotNil(result)
    lu.assertEquals(type(result.LinkStatus), 'string')
    lu.assertEquals(type(result.SpeedMbps), 'number')
    lu.assertEquals(type(result.FullDuplex), 'number')

    -- 额外覆盖 speed_duplex==0x0F 分支：枚举最后一个字节，确保至少一次进入分支
    for i = 0, 255 do
        local data_ext = string.char(
            0x00, 0x00,  -- response_code
            0x00, 0x00,  -- reason_code
            0x10,        -- extended_speed_duplex（用于扩展速率索引）
            0x00,        -- 第二个字节
            0x00,        -- 第三个字节
            i,           -- 第四个字节，遍历所有比特组合
            0x00, 0x00, 0x00, 0x00,  -- other indication
            0x00, 0x00, 0x00, 0x00   -- oem_link_status
        )
        hi1822_mctp.properties.LinkStatus.response(data_ext)
    end
end

-- 测试模块导出函数
function TestHi182X:test_module_functions()
    -- smbus/mctp/mctp_pldm 工厂函数存在
    lu.assertNotNil(Hi182X.smbus)
    lu.assertNotNil(Hi182X.mctp)
    lu.assertNotNil(Hi182X.mctp_pldm)

    -- mctp 工厂
    local mctp_obj = Hi182X.mctp('test_endpoint')
    lu.assertNotNil(mctp_obj)
    lu.assertEquals(mctp_obj.protocol_dependencies.ncsi_standard.endpoint, 'test_endpoint')
    lu.assertEquals(mctp_obj.protocol_dependencies.ncsi_huawei.endpoint, 'test_endpoint')
    lu.assertNotNil(mctp_obj.properties.LinkStatus)

    -- smbus 工厂
    local smbus_obj = Hi182X.smbus('ref_chip0')
    lu.assertNotNil(smbus_obj)
    lu.assertEquals(smbus_obj.protocol_dependencies.smbus.ref_chip, 'ref_chip0')
    lu.assertNotNil(smbus_obj.properties.Health)

    -- pldm 工厂
    local pldm_obj = Hi182X.mctp_pldm('pldm_endpoint')
    lu.assertNotNil(pldm_obj)
    lu.assertEquals(pldm_obj.protocol_dependencies.pldm_huawei.endpoint, 'pldm_endpoint')
    lu.assertNotNil(pldm_obj.properties.BlackBox)
end