Product Asset Tag (p 5) and the repeated custom "Extra" fields (Product Extra p 7, Board Extra b 5/6/7, Chassis Extra c 2/3) from the Inspur FRU field doc weren't writable — ipmitool prints identically-named lines for each custom field with no index of its own, so a plain name lookup couldn't tell them apart. parseFRUOutput now counts occurrences per area to recover the real index, and the existing area/index round-trip in the FRU editor write path picks it up automatically. Out-of-band (-H/-U/-P) writing remains out of scope. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
60 lines
1.8 KiB
Go
60 lines
1.8 KiB
Go
package webui
|
|
|
|
import "testing"
|
|
|
|
func TestParseFRUOutputExtraFields(t *testing.T) {
|
|
// Realistic ipmitool fru print output: repeated "<Area> Extra" lines
|
|
// (one per custom field) must resolve to sequential indices per the
|
|
// vendor FRU doc (Chassis Extra starts at 2, Board Extra at 5, Product
|
|
// Extra at 7), not all collapse onto the same index.
|
|
out := `
|
|
Product Manufacturer : Inspur
|
|
Product Name : NF5280M6
|
|
Product Part Number : PN123
|
|
Product Version : 1.0
|
|
Product Serial : SN123
|
|
Product Asset Tag : ASSET01
|
|
Product Extra : custom-p1
|
|
Board Mfg : Inspur
|
|
Board Product : BoardX
|
|
Board Serial : BSN1
|
|
Board Part Number : BPN1
|
|
Board Extra : custom-b1
|
|
Board Extra : custom-b2
|
|
Board Extra : custom-b3
|
|
Chassis Part Number : CPN1
|
|
Chassis Serial : CSN1
|
|
Chassis Extra : front-half
|
|
Chassis Extra : back-half
|
|
`
|
|
fields := parseFRUOutput(out)
|
|
|
|
byName := map[string][]fruField{}
|
|
for _, f := range fields {
|
|
byName[f.Name] = append(byName[f.Name], f)
|
|
}
|
|
|
|
assertMeta := func(name string, occurrence int, wantArea string, wantIndex int) {
|
|
t.Helper()
|
|
list := byName[name]
|
|
if occurrence >= len(list) {
|
|
t.Fatalf("expected occurrence %d of %q, got %d entries", occurrence, name, len(list))
|
|
}
|
|
f := list[occurrence]
|
|
if f.Area != wantArea || f.Index != wantIndex {
|
|
t.Errorf("%s[%d] = area:%q index:%d, want area:%q index:%d", name, occurrence, f.Area, f.Index, wantArea, wantIndex)
|
|
}
|
|
if !f.Editable {
|
|
t.Errorf("%s[%d] expected editable", name, occurrence)
|
|
}
|
|
}
|
|
|
|
assertMeta("Product Asset Tag", 0, "p", 5)
|
|
assertMeta("Product Extra", 0, "p", 7)
|
|
assertMeta("Board Extra", 0, "b", 5)
|
|
assertMeta("Board Extra", 1, "b", 6)
|
|
assertMeta("Board Extra", 2, "b", 7)
|
|
assertMeta("Chassis Extra", 0, "c", 2)
|
|
assertMeta("Chassis Extra", 1, "c", 3)
|
|
}
|