Files
rust_raidguardx/raidguard_c_gui_server_mock

RAIDGuard X Mock Driver (C)

Mock driver for RAIDGuard X GUI Server - provides simulated RAID controller for testing without hardware.

目錄結構

raidguard_c_gui_server_mock/
├── mock_driver.h      # Header file
├── mock_driver.c      # Implementation
├── test_mock_driver.c # Test program
├── Makefile          # Build file
└── README.md         # This file

建構

make

執行測試

./test_mock_driver

使用方式

1. 初始化

#include "mock_driver.h"

// 初始化 Mock Driver
mock_init();

// 啟用詳細輸出
mock_set_verbose(true);

2. 設定控制器

// 設定控制器數量 (預設 1)
mock_set_controller_count(2);

// 設定控制器序號
mock_set_controller_serial(0, "MOCK00000001");
mock_set_controller_serial(1, "MOCK00000002");

// 設定控制器型號
mock_set_controller_model(0, "Accusys GEN2");

3. 查詢控制器資訊

UCHAR pageBuf[1024];
UCHAR heatsink;

// 查詢控制器資訊
CHAR result = mock_QuaryDTR(0, pageBuf, &heatsink);

if (result == 1) {
    // 取得序號
    printf("SN: %.16s\n", pageBuf);
    
    // 取得型號
    printf("Model: %.20s\n", pageBuf + 16);
    
    // 取得韌體版本
    printf("FW: %.8s\n", pageBuf + 64);
}

4. 取得事件

EVENT_INFO evt;
UCHAR result = mock_GetCtlrEvent(0, &evt);

if (result == SYSOK && evt.bStatus) {
    // 處理事件
    printf("Event Type: %d\n", evt.bEventBuf[0]);
}

5. 模擬事件

// 模擬磁碟上線事件
mock_generate_disk_event(5, 0x01);

// 模擬 RAID 重建事件
mock_generate_raid_event(0, 0x02);

// 自訂事件
UCHAR customEvent[] = {
    0x03, 0x00, 0x00, 0x00,  // Event Type
    0x00, 0x00, 0x00, 0x00,  // Timestamp
    0x00, 0x00, 0x00, 0x00,  // Data
    0x00, 0x00, 0x00, 0x00
};
mock_push_event(customEvent, 16);

6. 清理

mock_cleanup();

API 參考

初始化與清理

函數 說明
mock_init() 初始化 Mock Driver
mock_cleanup() 清理資源
mock_set_verbose(bool) 設定詳細輸出

控制器設定

函數 說明
mock_set_controller_count(int) 設定控制器數量
mock_set_controller_serial(int, const char*) 設定控制器序號
mock_set_controller_model(int, const char*) 設定控制器型號
mock_set_controller_status(int, UCHAR) 設定控制器狀態

Driver 函數

函數 說明
mock_QuaryDTR(UCHAR, UCHAR*, UCHAR*) 查詢控制器資訊
mock_DevIoControl(...) I/O Control (模擬)
mock_GetCtlrEvent(UCHAR, EVENT_INFO*) 取得事件

事件模擬

函數 說明
mock_push_event(UCHAR*, int) 推入自訂事件
mock_clear_events() 清除所有事件
mock_generate_disk_event(int, int) 產生磁碟事件
mock_generate_raid_event(int, int) 產生 RAID 事件

模擬的 Page 資料

Page 大小 內容
0x00 1024 Controller Info
0x01 1024 RAID Snapshot
0x07 512 LUN Map Table
0x0A 1024 RAID Info
0x0B 1024 RAID Info
0x0E 1024 RAID Info
0x1B 512 Disk List

整合到 GS

要將 Mock Driver 整合到 GS (DtrGuiSrv),請在編譯時使用 -DENABLE_MOCK_MODE

ifdef ENABLE_MOCK_MODE
    CFLAGS += -DENABLE_MOCK_MODE
    SRCS += mock_driver.c
    
    # 置換函數
    CFLAGS += -DQuaryDTR=mock_QuaryDTR
    CFLAGS += -DDevIoControl=mock_DevIoControl
    CFLAGS += -DGetCtlrEvent=mock_GetCtlrEvent
endif

或使用 FFI

#ifdef ENABLE_MOCK_MODE
    #include "mock_driver.h"
    #define DevIoControl mock_DevIoControl
    #define QuaryDTR mock_QuaryDTR
    #define GetCtlrEvent mock_GetCtlrEvent
#endif

開發日誌

  • 2024-03-29: 初始版本
    • 基本控制器模擬
    • 事件佇列
    • Page 0-1, 7, 10, 27 資料

License

Proprietary - Accusys Inc.