Files
rust_raidguardx/raidguard_c_gui_server_mock/test_all_pages.c
T

262 lines
7.7 KiB
C

/*
* test_all_pages.c
*
* Test all mock driver pages
*/
#include <stdio.h>
#include "mock_driver.h"
void print_hex(const char *label, unsigned char *buf, int len) {
printf("%s:\n", label);
for (int i = 0; i < len; i++) {
printf("%02X ", buf[i]);
if ((i + 1) % 16 == 0) printf("\n");
}
printf("\n");
}
void test_page0(void) {
printf("\n========== TEST PAGE 0: Controller Info ==========\n");
unsigned char buf[1024];
unsigned char heatsink;
CHAR result = mock_QuaryDTR(0, buf, &heatsink);
printf("Result: %d\n", result);
printf("Serial Number: %.16s\n", buf + 0);
printf("Model Name: %.32s\n", buf + 16);
printf("Firmware Version: %.8s\n", buf + 64);
printf("BIOS Version: %.8s\n", buf + 72);
printf("Status: 0x%02X\n", buf[96]);
printf("RAID Ports: %d\n", buf[104]);
printf("Disk Count: %d\n", buf[105]);
printf("Controller #: %d\n", buf[106]);
print_hex("Full Page 0 (first 128 bytes)", buf, 128);
}
void test_page1(void) {
printf("\n========== TEST PAGE 1: RAID Snapshot ==========\n");
// Use accessor to get internal data
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
unsigned char *buf = ctrl->bPage1Data;
printf("RAID 0 Status: 0x%02X\n", buf[0]);
printf("RAID 0 Level: 0x%02X\n", buf[1]);
printf("RAID 0 Disk Count: %d\n", buf[2]);
printf("RAID 1 Status: 0x%02X\n", buf[128]);
printf("RAID 1 Level: 0x%02X\n", buf[129]);
printf("RAID 1 Disk Count: %d\n", buf[130]);
print_hex("Full Page 1 (first 256 bytes)", buf, 256);
}
void test_page7(void) {
printf("\n========== TEST PAGE 7: LUN Map Table ==========\n");
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
unsigned char *buf = ctrl->bPage7Data;
printf("LUN 0: 0x%02X\n", buf[0]);
printf("RAID ID 0: 0x%02X\n", buf[1]);
printf("Enable: 0x%02X\n", buf[2]);
print_hex("Full Page 7", buf, 64);
}
void test_page10(void) {
printf("\n========== TEST PAGE 10: RAID Info 0-1 ==========\n");
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
unsigned char *buf = ctrl->bPage10Data;
printf("RAID 0 Status: 0x%02X\n", buf[0]);
printf("RAID 0 Level: 0x%02X\n", buf[1]);
printf("RAID 0 Disks: %d\n", buf[2]);
printf("RAID 0 Stripe: 0x%02X\n", buf[3]);
// Capacity (big-endian)
unsigned long long capacity = 0;
for (int i = 0; i < 8; i++) {
capacity = (capacity << 8) | buf[8 + i];
}
printf("RAID 0 Capacity: %llu bytes\n", capacity);
print_hex("Full Page 10", buf, 128);
}
void test_page11(void) {
printf("\n========== TEST PAGE 11: RAID Info 2-3 ==========\n");
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
unsigned char *buf = ctrl->bPage11Data;
printf("Status: 0x%02X\n", buf[0]);
print_hex("Full Page 11", buf, 64);
}
void test_page14(void) {
printf("\n========== TEST PAGE 14: Event Log ==========\n");
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
unsigned char *buf = ctrl->bPage14Data;
printf("Event Count: %d\n", buf[960]);
// Print first event
printf("\nEvent 0:\n");
printf(" Type: 0x%02X\n", buf[0]);
printf(" Timestamp: %u\n", *(unsigned int*)(buf + 4));
printf(" Slot/EID: 0x%02X\n", *(unsigned int*)(buf + 8));
printf(" Status: 0x%02X\n", buf[12]);
printf(" Message: %.32s\n", buf + 32);
// Print second event
printf("\nEvent 1:\n");
printf(" Type: 0x%02X\n", buf[64]);
printf(" Timestamp: %u\n", *(unsigned int*)(buf + 68));
printf(" Slot/EID: 0x%02X\n", *(unsigned int*)(buf + 72));
printf(" Status: 0x%02X\n", buf[76]);
printf(" Message: %.32s\n", buf + 96);
print_hex("Page 14 (first 128 bytes)", buf, 128);
}
void test_page20(void) {
printf("\n========== TEST PAGE 20: Enclosure Info ==========\n");
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
unsigned char *buf = ctrl->bPage20Data;
printf("Enclosure ID: %d\n", buf[0]);
printf("Fan Count: %d\n", buf[1]);
printf("Power Supply Count: %d\n", buf[2]);
printf("Temperature Sensor Count: %d\n", buf[3]);
printf("Heat Sink Count: %d\n", buf[4]);
// Fan speeds
unsigned short fan1 = buf[0x10] | (buf[0x11] << 8);
unsigned short fan2 = buf[0x12] | (buf[0x13] << 8);
printf("Fan 1 Speed: %d RPM\n", fan1);
printf("Fan 2 Speed: %d RPM\n", fan2);
// Temperatures
printf("Temperature 1: %d C\n", buf[0x20]);
printf("Temperature 2: %d C\n", buf[0x21]);
printf("Temperature 3: %d C\n", buf[0x22]);
printf("Temperature 4: %d C\n", buf[0x23]);
// Temp status
printf("Temp 1 Status: %d\n", buf[0x40]);
printf("Temp 2 Status: %d\n", buf[0x41]);
printf("Temp 3 Status: %d\n", buf[0x42]);
// Power Supply status
printf("Power Supply 1: %s\n", buf[0x50] == 0 ? "OK" : "FAIL");
printf("Power Supply 2: %s\n", buf[0x51] == 0 ? "OK" : "FAIL");
// Battery
printf("Battery Present: %s\n", buf[0x60] == 1 ? "Yes" : "No");
printf("Battery Charge: %d%%\n", buf[0x61]);
print_hex("Full Page 20", buf, 128);
}
void test_page27(void) {
printf("\n========== TEST PAGE 27: Disk List ==========\n");
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
unsigned char *buf = ctrl->bPage27Data;
for (int i = 0; i < 8; i++) {
int offset = i * 16;
printf("Disk %d: Slot=0x%02X Status=0x%02X Type=0x%02X\n",
i, buf[offset], buf[offset+1], buf[offset+2]);
}
print_hex("Full Page 27", buf, 128);
}
void test_devioctl(void) {
printf("\n========== TEST DevIoControl ==========\n");
unsigned char outBuf[1024];
USHORT errCode;
UCHAR result;
// Test IOCTL 0x9001 - GET_CONTROLLER_INFO
result = mock_DevIoControl(0, 0x9001, 0, NULL, 1024, (char*)outBuf, &errCode);
printf("IOCTL 0x9001 (Controller Info): result=0x%02X err=0x%04X\n", result, errCode);
printf(" SN: %.16s\n", outBuf);
// Test IOCTL 0x9002 - GET_RAID_INFO
result = mock_DevIoControl(0, 0x9002, 0, NULL, 1024, (char*)outBuf, &errCode);
printf("IOCTL 0x9002 (RAID Info): result=0x%02X err=0x%04X\n", result, errCode);
printf(" RAID 0 Status: 0x%02X\n", outBuf[0]);
// Test IOCTL 0x9020 - GET_INBAND_EVENT
result = mock_DevIoControl(0, 0x9020, 0, NULL, 512, (char*)outBuf, &errCode);
printf("IOCTL 0x9020 (Event): result=0x%02X err=0x%04X\n", result, errCode);
}
void test_events(void) {
printf("\n========== TEST Events ==========\n");
// Generate various events
mock_clear_events();
// Disk events
mock_generate_disk_event(0, 0x01); // Online
mock_generate_disk_event(1, 0x01); // Online
mock_generate_disk_event(2, 0x02); // Offline
mock_generate_disk_event(3, 0x03); // Error
// RAID events
mock_generate_raid_event(0, 0x10); // Rebuild start
mock_generate_raid_event(0, 0x11); // Rebuild done
printf("Generated 6 events\n");
// Read all events
EVENT_INFO evt;
int count = 0;
while (mock_GetCtlrEvent(0, &evt) == SYSOK && evt.bStatus && count < 10) {
printf("Event %d: Type=0x%02X Slot/ID=0x%02X\n",
count + 1, evt.bEventBuf[0], evt.bEventBuf[3]);
count++;
}
printf("Total events read: %d\n", count);
}
int main(int argc, char *argv[]) {
printf("=== Mock Driver - All Pages Test ===\n");
// Enable verbose
mock_set_verbose(true);
// Initialize
mock_init();
// Run all tests
test_page0();
test_page1();
test_page7();
test_page10();
test_page11();
test_page14();
test_page20();
test_page27();
test_devioctl();
test_events();
// Cleanup
mock_cleanup();
printf("\n=== All Tests Completed ===\n");
return 0;
}