/* * test_all_pages.c * * Test all mock driver pages */ #include #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; }