Files
nip/testhelper/helpers.go
Brian Cunnie b1b95e8214 🐞 Don't accidentally produce hex-notation hostname
I have a test helper which produces a random 8-character string
consisting of mixed-case alphabetic characters; however, there's a small
chance (6/26^8 == 0.0008%) that it would produce a valid 8-character
hexadecimal string, which could be mistakenly recognized as an IP
address, which _might_ break a test.

Out of an abundance of caution, I guard against producing an 8-byte
string that might be accidentally recognized as 8-byte hexadecimal
notation by making sure the first & last bytes are NOT hex characters.
2025-07-12 05:50:40 -07:00

43 lines
1.4 KiB
Go

package testhelper
import (
"encoding/binary"
"math/rand"
"net"
)
// RandomIPv6Address is used for fuzz testing
func RandomIPv6Address() net.IP {
upperHalf := make([]byte, 8)
lowerHalf := make([]byte, 8)
binary.LittleEndian.PutUint64(upperHalf, rand.Uint64())
binary.LittleEndian.PutUint64(lowerHalf, rand.Uint64())
ipv6 := net.IP(append(upperHalf, lowerHalf...))
// IPv6 addrs have a lot of all-zero two-byte sections
// So we zero-out ~50% of the sections
for i := 0; i < 8; i++ {
if rand.Int()%2 == 0 {
for j := 0; j < 2; j++ {
ipv6[i*2+j] = 0
}
}
}
// avoid pathological case: an IPv4 address []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, ?, ?, ?, ?})
ipv6[10] &= 0xfe
return ipv6
}
// Random8ByteString() returns an 8-char mixed-case string consisting solely of the letters a-z.
// the first & last characters are non-hexadecimal to avoid confusion with hexadecimal notation
func Random8ByteString() string {
var randomString []byte
// 71 == ascii 'G', +32 (103) == ascii 'g'
randomString = append(randomString, byte(71+32*rand.Intn(2)+rand.Intn(20)))
for range 6 {
// 65 == ascii 'A', +32 (96) == ascii 'a', there are 26 letters in the alphabet. Mix upper case, too.
randomString = append(randomString, byte(65+32*rand.Intn(2)+rand.Intn(26)))
}
randomString = append(randomString, byte(71+32*rand.Intn(2)+rand.Intn(20)))
return string(randomString)
}