Files
bee/audit/internal/webui/ipmi_fru_test.go
Mikhail Chusavitin 796acdfec1 ipmi fru: add Asset Tag and vendor Extra field write support (in-band)
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>
2026-07-01 17:21:26 +03:00

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)
}