package unraid import ( "testing" "git.mchus.pro/mchus/logpile/internal/parser" ) func TestParseInventoryAndLogs(t *testing.T) { files := []parser.ExtractedFile{ {Path: "diagnostics/system/motherboard.txt", Content: []byte(`Acme NAS Board BIOS Information Vendor: Acme Version: 1.2.3 `)}, {Path: "diagnostics/system/meminfo.txt", Content: []byte(`Handle 0x0010, DMI type 17, 84 bytes Memory Device Size: 32 GB Locator: DIMM_A1 Bank Locator: BANK 0 Type: DDR5 Speed: 5600 MT/s Configured Memory Speed: 5200 MT/s Manufacturer: Micron Serial Number: MEM-1 Part Number: PN-1 Rank: 2 `)}, {Path: "diagnostics/system/ifconfig.txt", Content: []byte("eth0 UP 192.0.2.10/24\nlo UP 127.0.0.1\n")}, {Path: "diagnostics/system/ethtool.txt", Content: []byte(`Settings for eth0: driver: mlx5_core firmware-version: 1.0 bus-info: 0000:5e:00.0 Speed: 100000Mb/s Link detected: yes `)}, {Path: "diagnostics/system/lspci.txt", Content: []byte(`5e:00.0 Ethernet controller [0200]: Mellanox Technologies Network Adapter [15b3:101e] 3b:00.0 Non-Volatile memory controller [0108]: Acme NVMe [1234:5678] `)}, {Path: "diagnostics/system/vars.txt", Content: []byte(`disks ( [disk1] => Array ( [device] => sda [id] => WDC-1 [size] => 2097152 [temp] => 55 [fsType] => xfs ) ) flashGUID ( [flashGUID] => HOST-1 ) `)}, {Path: "diagnostics/logs/syslog.txt", Content: []byte("Feb 5 23:33:01 host kernel: fatal disk error\nFeb 5 23:33:02 host daemon: normal message\n")}, } result, err := (&Parser{}).Parse(files) if err != nil { t.Fatalf("Parse: %v", err) } if result.Hardware.BoardInfo.Manufacturer != "Acme" || result.Hardware.BoardInfo.ProductName != "Acme NAS Board" { t.Fatalf("unexpected board: %+v", result.Hardware.BoardInfo) } if result.Hardware.BoardInfo.SerialNumber != "HOST-1" { t.Fatalf("host serial = %q", result.Hardware.BoardInfo.SerialNumber) } if len(result.Hardware.Memory) != 1 || result.Hardware.Memory[0].Slot != "DIMM_A1" || result.Hardware.Memory[0].SizeMB != 32768 { t.Fatalf("unexpected memory: %+v", result.Hardware.Memory) } if len(result.Hardware.NetworkAdapters) != 1 || result.Hardware.NetworkAdapters[0].Slot != "eth0" || result.Hardware.NetworkAdapters[0].Status != "ok" { t.Fatalf("unexpected NICs: %+v", result.Hardware.NetworkAdapters) } if len(result.Hardware.PCIeDevices) != 2 { t.Fatalf("unexpected PCIe devices: %+v", result.Hardware.PCIeDevices) } if len(result.Hardware.Storage) != 1 || result.Hardware.Storage[0].Slot != "disk1" || result.Hardware.Storage[0].SizeGB != 2 { t.Fatalf("unexpected storage: %+v", result.Hardware.Storage) } if len(result.Sensors) != 1 || result.Sensors[0].Status != "warning" { t.Fatalf("unexpected sensors: %+v", result.Sensors) } if len(result.Events) != 2 || result.Events[0].Severity != "critical" { t.Fatalf("unexpected syslog events: %+v", result.Events) } } func TestUnraidParsingHelpers(t *testing.T) { if got := firstWords("Mellanox Technologies Adapter", 2); got != "Mellanox Technologies" { t.Fatalf("firstWords = %q", got) } if got := getTempStatus(60); got != "critical" { t.Fatalf("temperature status = %q", got) } if got := getTempStatus(20); got != "ok" { t.Fatalf("temperature status = %q", got) } if got := extractDiskSection(" [disk1] => Array\n (\n [id] => disk\n )", "disk1"); got == "" { t.Fatal("expected disk section") } }