-- 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.

loadfile(os.getenv('CONFIG_FILE'), 't', { package = package, os = os })()
package.path = '../../gen/storage/?.lua;' .. package.path

local utils = require('utils.core')
local logging = require('mc.logging')
local current_file_dir = debug.getinfo(1).source:match('@?(.*)/')
utils.chdir(current_file_dir)
logging:setPrint(nil)
logging:setLevel(logging.INFO)

-- 预加载 messages 模块:temp 目录中的 messages 文件是 Skynet 字节码格式,
-- Lua 5.4 解释器无法加载,需要从 conan 缓存加载 Lua 5.4 字节码版本
do
    local function is_skynet_bytecode(path)
        local f = io.open(path, 'rb')
        if not f then
            return false
        end
        local h = f:read(4)
        f:close()
        return h and h:sub(1, 3) == '\x1bSk'
    end

    local temp_base = '../../temp/opt/bmc/lualib/messages/base.lua'
    if is_skynet_bytecode(temp_base) then
        local pipe = io.popen(
            [[
            for dir in /root/.conan2/p/b/mdb_*/p /root/.conan2/p/mdb_*/p; do
                [ -d "$dir" ] || continue
                f="$dir/opt/bmc/lualib/messages/base.lua"
                if [ -f "$f" ]; then
                    h=$(head -c 4 "$f" | xxd -p 2>/dev/null)
                    if [ "$h" = "1b4c7561" ]; then
                        echo "$dir/opt/bmc/lualib/messages"
                        break
                    fi
                fi
            done
        ]],
            'r'
        )
        local conan_msg_dir = pipe:read('*l')
        pipe:close()
        if conan_msg_dir then
            local fn = loadfile(conan_msg_dir .. '/base.lua')
            if fn then
                package.preload['messages.base'] = fn
            end
            fn = loadfile(conan_msg_dir .. '/custom.lua')
            if fn then
                package.preload['messages.custom'] = fn
            end
            fn = loadfile(conan_msg_dir .. '/init.lua')
            if fn then
                package.preload['messages'] = fn
            end
        end
    end
end

local lu = require('luaunit')

require('test_common')
-- require 'test_controller'
-- require 'test_array'
-- require 'test_drive'
-- require 'test_pd_identify'
require('test_sml')
require('test_sml_recent_multilib')
require('test_upgrade')
require('test_io_latency_nvme')
require('test_ssd_form_factor')
require('test_nvme_raid_manufacturer')
-- require 'test_volume'
-- require 'test_controller_ccheck'
-- require 'test_battery'
require('test_nvme_mi_protocol')
require('test_bma.test_handler_pass_through_drive_stub')
require('test_mdb_object')
require('test_set_fault_indicator_state')
require('test_set_slot_power_state')
require('test_error_engine')
require('test_nvme')
require('device_mgmt')
require('test_storage_app')
require('test_method_misc')
require('test_bma.test_handler_base')
require('test_bma.test_handler_nvme')
require('test_bma_mdb_mgmt')
require('test_raid_info_update')
require('test_controller_slow_drive')

require('test_battery_init')
require('test_rpc_sevice_subhealth')
require('test_controller_epdsupport')
require('test_controller_faultcode')
require('test_drive_slow_disk_info')
require('test_controller_dump_info')
require('test_drive_get_position')
require('test_policy_connector')
require('test_vpd_connector')
require('test_start_update_task')
require('test_ipmi')
require('test_drives_object')
require('test_controller_object')
require('test_controller_collection_dump_logs')
require('test_ctrl_log_dump')
require('test_drive_object')
require('test_link_volume_array_drive_service_array_id')
require('test_rpc_service_drive')
require('test_compatible')
require('test_ctrl_info')
require('test_rpc_service_nvme_drive')
require('test_replica_drive')
require('test_pd_identify_debug')
require('test_pd_identify_service')
require('test_drive_collection')
require('test_drive_time_sync_service')
require('test_drive_smart_dump')
require('test_drive_predictive_failure')
require('test_config_manager')
require('test_add_event')
require('test_phy_biterr')
require('test_rpc_service_controller')
require('test_update_controller_battery_info')
require('test_storageconfig')
require('test_drive_firmware_info')
require('test_sata_hw_defined_smart')
require('test_rpc_service_drive_subhealth')
require('test_rpc_service_volume')
require('test_ipmi_service')
pcall(require, 'test_ipmi_ssu_service') -- feature_ssu 裁剪包中 ssu 源码不存在,容错跳过
require('test_rpc_service_subhealth_ex')
require('test_sync_task')
require('test_storage_bus_db')
require('test_ipmi_ex')
require('test_volume_param_check')
require('test_volume_dump')
require('test_volume_object')
require('test_drive_get_passthrough_fwversion')
require('test_faultlog_and_fw_fault')
require('test_nvme_capacitor_spare')
require('test_handler_nvme')
require('test_array_dump')

require('test_controller_collection')
require('test_battery_created_by_device')
require('test_battery_mgmt')
require('test_controller_mgmt')
require('test_controller_firmware_object')

require('test_bma.test_bma_init')
require('test_bus_monitor_service')
require('test_task_service')
require('test_tasks')

require('test_mctp')
require('test_metric_collect')
require('test_patition_mgmt')
require('test_customize_config')
require('test_array_collection')
require('test_drive_upgrade')
require('test_sml_init')
require('test_controller_dump')
require('test_ctrl_config_backup')
require('test_drive_config_backup')

os.exit(lu.LuaUnit.run())