Files
lneto/x/tls/stringers_const_test.go
T
2026-08-08 21:31:53 -07:00

74 lines
2.5 KiB
Go

package tls_test
import (
"strings"
"testing"
"github.com/soypat/lneto/x/tls"
)
// StringConst must name defined values as String does, GREASE values "GREASE"
// and everything else "unknown", over the whole range and without allocating.
// A constant added without extending a StringConst switch fails here.
func TestStringConst(t *testing.T) {
for _, tc := range []struct {
name string
n int
grease bool // type carries GREASE values
str func(int) string
cst func(int) string
}{
{"ContentType", 1 << 8, false,
func(i int) string { return tls.ContentType(i).String() },
func(i int) string { return tls.ContentType(i).StringConst() }},
{"HandshakeType", 1 << 8, false,
func(i int) string { return tls.HandshakeType(i).String() },
func(i int) string { return tls.HandshakeType(i).StringConst() }},
{"AlertLevel", 1 << 8, false,
func(i int) string { return tls.AlertLevel(i).String() },
func(i int) string { return tls.AlertLevel(i).StringConst() }},
{"AlertDescription", 1 << 8, false,
func(i int) string { return tls.AlertDescription(i).String() },
func(i int) string { return tls.AlertDescription(i).StringConst() }},
{"ExtensionType", 1 << 16, true,
func(i int) string { return tls.ExtensionType(i).String() },
func(i int) string { return tls.ExtensionType(i).StringConst() }},
{"NamedGroup", 1 << 16, true,
func(i int) string { return tls.NamedGroup(i).String() },
func(i int) string { return tls.NamedGroup(i).StringConst() }},
{"SignatureScheme", 1 << 16, true,
func(i int) string { return tls.SignatureScheme(i).String() },
func(i int) string { return tls.SignatureScheme(i).StringConst() }},
{"CipherSuite", 1 << 16, true,
func(i int) string { return tls.CipherSuite(i).String() },
func(i int) string { return tls.CipherSuite(i).StringConst() }},
} {
t.Run(tc.name, func(t *testing.T) {
for i := range tc.n {
str, cst := tc.str(i), tc.cst(i)
if !strings.ContainsRune(str, '(') { // stringer names undefined values "Type(9)".
if cst != str {
t.Fatalf("%s(%d)=%q want %q", tc.name, i, cst, str)
}
continue
}
want := "unknown"
if tc.grease && tls.IsGREASE(uint16(i)) {
want = "GREASE"
}
if cst != want {
t.Fatalf("%s(%d)=%q want %q", tc.name, i, cst, want)
}
}
allocs := testing.AllocsPerRun(1, func() {
for i := range tc.n {
_ = tc.cst(i)
}
})
if allocs != 0 {
t.Errorf("%s allocated %v times", tc.name, allocs)
}
})
}
}