262 lines
7.7 KiB
C
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;
|
|
}
|