Adds board and memory parser test fixtures based on real dmidecode output from Dell PowerEdge R740xd, HPE ProLiant DL380 Gen10, and Supermicro SYS-6028R-WTR sourced from the linuxhw/DMI dataset. Extends cleanDMIValue with four additional vendor placeholder strings found in the dataset: "0123456789", "1234567890", "NOT AVAILABLE", and "TO BE FILLED BY O.E.M" (without trailing dot). Adds memory_test.go covering mixed populated/empty DIMM slots and both GB and MB size formats. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
88 lines
2.4 KiB
Go
88 lines
2.4 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|