package collector import ( "testing" ) func TestParseMemory_Mixed(t *testing.T) { out := mustReadFile(t, "testdata/dmidecode_type17_mixed.txt") dimms := parseMemory(out) if len(dimms) != 3 { t.Fatalf("expected 3 DIMMs, got %d", len(dimms)) } // slot 0: populated, 16 GB Supermicro-style d0 := dimms[0] if d0.Present == nil || !*d0.Present { t.Errorf("dimm0: expected present=true") } if d0.SizeMB == nil || *d0.SizeMB != 16384 { t.Errorf("dimm0: size_mb=%v, want 16384", d0.SizeMB) } if d0.Slot == nil || *d0.Slot != "P1-DIMMA1" { t.Errorf("dimm0: slot=%v, want P1-DIMMA1", d0.Slot) } if d0.Location == nil || *d0.Location != "P0_Node0_Channel0_Dimm0" { t.Errorf("dimm0: location=%v, want P0_Node0_Channel0_Dimm0", d0.Location) } if d0.Manufacturer == nil || *d0.Manufacturer != "Micron" { t.Errorf("dimm0: manufacturer=%v, want Micron", d0.Manufacturer) } if d0.PartNumber == nil || *d0.PartNumber != "36ASF2G72PZ-2G1A2" { t.Errorf("dimm0: part_number=%v, want 36ASF2G72PZ-2G1A2", d0.PartNumber) } if d0.MaxSpeedMHz == nil || *d0.MaxSpeedMHz != 2133 { t.Errorf("dimm0: max_speed_mhz=%v, want 2133", d0.MaxSpeedMHz) } // slot 1: empty d1 := dimms[1] if d1.Present == nil || *d1.Present { t.Errorf("dimm1: expected present=false") } if d1.Status == nil || *d1.Status != statusEmpty { t.Errorf("dimm1: status=%v, want %s", d1.Status, statusEmpty) } if d1.SizeMB != nil { t.Errorf("dimm1: size_mb should be nil for empty slot, got %v", d1.SizeMB) } // slot 2: populated, 32768 MB Dell-style size d2 := dimms[2] if d2.Present == nil || !*d2.Present { t.Errorf("dimm2: expected present=true") } if d2.SizeMB == nil || *d2.SizeMB != 32768 { t.Errorf("dimm2: size_mb=%v, want 32768", d2.SizeMB) } if d2.Manufacturer == nil || *d2.Manufacturer != "Samsung" { t.Errorf("dimm2: manufacturer=%v, want Samsung", d2.Manufacturer) } if d2.CurrentSpeedMHz == nil || *d2.CurrentSpeedMHz != 2400 { t.Errorf("dimm2: current_speed_mhz=%v, want 2400", d2.CurrentSpeedMHz) } } func TestParseMemorySizeMB(t *testing.T) { tests := []struct { input string want int }{ {"16 GB", 16384}, {"32 GB", 32768}, {"8 GB", 8192}, {"16384 MB", 16384}, {"32768 MB", 32768}, {"No Module Installed", 0}, {"0", 0}, {"", 0}, } for _, tt := range tests { got := parseMemorySizeMB(tt.input) if got != tt.want { t.Errorf("parseMemorySizeMB(%q) = %d, want %d", tt.input, got, tt.want) } } }