package collector import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" ) func TestRedfishConnectorCollect(t *testing.T) { mux := http.NewServeMux() register := func(path string, payload interface{}) { mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(payload) }) } register("/redfish/v1", map[string]interface{}{"Name": "ServiceRoot"}) register("/redfish/v1/Systems/1", map[string]interface{}{ "Manufacturer": "Supermicro", "Model": "SYS-TEST", "SerialNumber": "SYS123", "BiosVersion": "2.1a", }) register("/redfish/v1/Systems/1/Bios", map[string]interface{}{"Version": "2.1a"}) register("/redfish/v1/Systems/1/SecureBoot", map[string]interface{}{"SecureBootCurrentBoot": "Enabled"}) register("/redfish/v1/Systems/1/Processors", map[string]interface{}{ "Members": []map[string]string{ {"@odata.id": "/redfish/v1/Systems/1/Processors/CPU1"}, }, }) register("/redfish/v1/Systems/1/Processors/CPU1", map[string]interface{}{ "Name": "CPU1", "Model": "Xeon Gold", "TotalCores": 32, "TotalThreads": 64, "MaxSpeedMHz": 3600, }) register("/redfish/v1/Systems/1/Memory", map[string]interface{}{ "Members": []map[string]string{ {"@odata.id": "/redfish/v1/Systems/1/Memory/DIMM1"}, }, }) register("/redfish/v1/Systems/1/Memory/DIMM1", map[string]interface{}{ "Name": "DIMM A1", "CapacityMiB": 32768, "MemoryDeviceType": "DDR5", "OperatingSpeedMhz": 4800, "Status": map[string]interface{}{ "Health": "OK", }, }) register("/redfish/v1/Systems/1/Storage", map[string]interface{}{ "Members": []map[string]string{ {"@odata.id": "/redfish/v1/Systems/1/Storage/1"}, }, }) register("/redfish/v1/Systems/1/Storage/1", map[string]interface{}{ "Drives": []map[string]string{ {"@odata.id": "/redfish/v1/Systems/1/Storage/1/Drives/1"}, }, }) register("/redfish/v1/Systems/1/Storage/1/Drives/1", map[string]interface{}{ "Name": "Drive1", "Model": "NVMe Test", "MediaType": "SSD", "Protocol": "NVMe", "CapacityGB": 960, "SerialNumber": "SN123", }) register("/redfish/v1/Chassis/1/NetworkAdapters", map[string]interface{}{ "Members": []map[string]string{ {"@odata.id": "/redfish/v1/Chassis/1/NetworkAdapters/1"}, }, }) register("/redfish/v1/Chassis/1/NetworkAdapters/1", map[string]interface{}{ "Name": "Mellanox", "Model": "ConnectX-6", "SerialNumber": "NIC123", }) register("/redfish/v1/Managers/1", map[string]interface{}{ "FirmwareVersion": "1.25", }) register("/redfish/v1/Managers/1/NetworkProtocol", map[string]interface{}{ "Id": "NetworkProtocol", }) ts := httptest.NewServer(mux) defer ts.Close() c := NewRedfishConnector() result, err := c.Collect(context.Background(), Request{ Host: ts.URL, Port: 443, Protocol: "redfish", Username: "admin", AuthType: "password", Password: "secret", TLSMode: "strict", }, nil) if err != nil { t.Fatalf("collect failed: %v", err) } if result.Hardware == nil { t.Fatalf("expected hardware config") } if result.Hardware.BoardInfo.ProductName != "SYS-TEST" { t.Fatalf("unexpected board model: %q", result.Hardware.BoardInfo.ProductName) } if len(result.Hardware.CPUs) != 1 { t.Fatalf("expected one CPU, got %d", len(result.Hardware.CPUs)) } if len(result.Hardware.Memory) != 1 { t.Fatalf("expected one DIMM, got %d", len(result.Hardware.Memory)) } if len(result.Hardware.Storage) != 1 { t.Fatalf("expected one drive, got %d", len(result.Hardware.Storage)) } if len(result.Hardware.NetworkAdapters) != 1 { t.Fatalf("expected one nic, got %d", len(result.Hardware.NetworkAdapters)) } if len(result.Hardware.Firmware) == 0 { t.Fatalf("expected firmware entries") } }