Add fuzz tests for config, remap, and sacn packages

This commit is contained in:
Ian Gulliver
2026-01-28 12:34:32 -08:00
parent 8e24dee91f
commit 416e67b3f1
3 changed files with 381 additions and 0 deletions

153
config/fuzz_test.go Normal file
View File

@@ -0,0 +1,153 @@
package config
import (
"testing"
)
func FuzzParseUniverse(f *testing.F) {
f.Add("artnet:0.0.0")
f.Add("artnet:0.0.1")
f.Add("artnet:127.15.15")
f.Add("artnet:0")
f.Add("artnet:32767")
f.Add("sacn:1")
f.Add("sacn:63999")
f.Add("sacn:100")
f.Add("")
f.Add("invalid")
f.Add("artnet:")
f.Add("sacn:")
f.Add("artnet:a.b.c")
f.Add("artnet:-1")
f.Add("sacn:0")
f.Add("sacn:64000")
f.Fuzz(func(t *testing.T, input string) {
u, err := ParseUniverse(input)
if err != nil {
return
}
s := u.String()
u2, err := ParseUniverse(s)
if err != nil {
t.Fatalf("roundtrip failed: parsed %q -> %v -> %q, but re-parse failed: %v", input, u, s, err)
}
if u != u2 {
t.Fatalf("roundtrip mismatch: %v != %v", u, u2)
}
})
}
func FuzzFromAddrParse(f *testing.F) {
f.Add("artnet:0.0.0")
f.Add("artnet:0.0.1:1-512")
f.Add("artnet:0.0.1:50-100")
f.Add("artnet:0.0.1:1")
f.Add("artnet:0.0.1:512")
f.Add("artnet:0.0.1:1-")
f.Add("sacn:1:100-200")
f.Add("sacn:100")
f.Add("")
f.Add("artnet:0.0.0:0")
f.Add("artnet:0.0.0:513")
f.Add("artnet:0.0.0:-1")
f.Add("artnet:0.0.0:abc")
f.Fuzz(func(t *testing.T, input string) {
var addr FromAddr
err := addr.parse(input)
if err != nil {
return
}
if addr.ChannelStart > addr.ChannelEnd {
t.Fatalf("ChannelStart > ChannelEnd: %d > %d", addr.ChannelStart, addr.ChannelEnd)
}
if addr.ChannelStart < 1 || addr.ChannelEnd > 512 {
return
}
s := addr.String()
var addr2 FromAddr
if err := addr2.parse(s); err != nil {
t.Fatalf("roundtrip failed: parsed %q -> %v -> %q, but re-parse failed: %v", input, addr, s, err)
}
})
}
func FuzzToAddrParse(f *testing.F) {
f.Add("artnet:0.0.0")
f.Add("artnet:0.0.1:1")
f.Add("artnet:0.0.1:512")
f.Add("sacn:1:100")
f.Add("sacn:100")
f.Add("")
f.Add("artnet:0.0.0:0")
f.Add("artnet:0.0.0:1-100")
f.Add("artnet:0.0.0:513")
f.Fuzz(func(t *testing.T, input string) {
var addr ToAddr
err := addr.parse(input)
if err != nil {
return
}
if addr.ChannelStart < 1 || addr.ChannelStart > 512 {
return
}
s := addr.String()
var addr2 ToAddr
if err := addr2.parse(s); err != nil {
t.Fatalf("roundtrip failed: parsed %q -> %v -> %q, but re-parse failed: %v", input, addr, s, err)
}
})
}
func FuzzParseUniverseNumber(f *testing.F) {
f.Add("0.0.0", string(ProtocolArtNet))
f.Add("127.15.15", string(ProtocolArtNet))
f.Add("0", string(ProtocolArtNet))
f.Add("32767", string(ProtocolArtNet))
f.Add("1", string(ProtocolSACN))
f.Add("63999", string(ProtocolSACN))
f.Add("", string(ProtocolArtNet))
f.Add("invalid", string(ProtocolArtNet))
f.Add("0.0", string(ProtocolArtNet))
f.Add("0.0.0.0", string(ProtocolArtNet))
f.Add("-1", string(ProtocolArtNet))
f.Fuzz(func(t *testing.T, input string, protoStr string) {
proto := Protocol(protoStr)
if proto != ProtocolArtNet && proto != ProtocolSACN {
return
}
_, _ = parseUniverseNumber(input, proto)
})
}
func FuzzParseChannelRange(f *testing.F) {
f.Add("1-512")
f.Add("1")
f.Add("512")
f.Add("1-")
f.Add("100-200")
f.Add("")
f.Add("-")
f.Add("abc")
f.Add("1-abc")
f.Add("-1")
f.Add("0")
f.Add("513")
f.Fuzz(func(t *testing.T, input string) {
var start, end int
err := parseChannelRange(input, &start, &end)
if err != nil {
return
}
if start < 0 {
t.Fatalf("start should not be negative: %d", start)
}
if end < 0 {
t.Fatalf("end should not be negative: %d", end)
}
})
}