104 lines
2.2 KiB
Go
104 lines
2.2 KiB
Go
|
package metric
|
||
|
|
||
|
import (
|
||
|
"strconv"
|
||
|
"testing"
|
||
|
"testing/quick"
|
||
|
)
|
||
|
|
||
|
func TestParseIntBytesEquivalenceFuzz(t *testing.T) {
|
||
|
f := func(b []byte, base int, bitSize int) bool {
|
||
|
exp, expErr := strconv.ParseInt(string(b), base, bitSize)
|
||
|
got, gotErr := parseIntBytes(b, base, bitSize)
|
||
|
|
||
|
return exp == got && checkErrs(expErr, gotErr)
|
||
|
}
|
||
|
|
||
|
cfg := &quick.Config{
|
||
|
MaxCount: 10000,
|
||
|
}
|
||
|
|
||
|
if err := quick.Check(f, cfg); err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseIntBytesValid64bitBase10EquivalenceFuzz(t *testing.T) {
|
||
|
buf := []byte{}
|
||
|
f := func(n int64) bool {
|
||
|
buf = strconv.AppendInt(buf[:0], n, 10)
|
||
|
|
||
|
exp, expErr := strconv.ParseInt(string(buf), 10, 64)
|
||
|
got, gotErr := parseIntBytes(buf, 10, 64)
|
||
|
|
||
|
return exp == got && checkErrs(expErr, gotErr)
|
||
|
}
|
||
|
|
||
|
cfg := &quick.Config{
|
||
|
MaxCount: 10000,
|
||
|
}
|
||
|
|
||
|
if err := quick.Check(f, cfg); err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseFloatBytesEquivalenceFuzz(t *testing.T) {
|
||
|
f := func(b []byte, bitSize int) bool {
|
||
|
exp, expErr := strconv.ParseFloat(string(b), bitSize)
|
||
|
got, gotErr := parseFloatBytes(b, bitSize)
|
||
|
|
||
|
return exp == got && checkErrs(expErr, gotErr)
|
||
|
}
|
||
|
|
||
|
cfg := &quick.Config{
|
||
|
MaxCount: 10000,
|
||
|
}
|
||
|
|
||
|
if err := quick.Check(f, cfg); err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseFloatBytesValid64bitEquivalenceFuzz(t *testing.T) {
|
||
|
buf := []byte{}
|
||
|
f := func(n float64) bool {
|
||
|
buf = strconv.AppendFloat(buf[:0], n, 'f', -1, 64)
|
||
|
|
||
|
exp, expErr := strconv.ParseFloat(string(buf), 64)
|
||
|
got, gotErr := parseFloatBytes(buf, 64)
|
||
|
|
||
|
return exp == got && checkErrs(expErr, gotErr)
|
||
|
}
|
||
|
|
||
|
cfg := &quick.Config{
|
||
|
MaxCount: 10000,
|
||
|
}
|
||
|
|
||
|
if err := quick.Check(f, cfg); err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseBoolBytesEquivalence(t *testing.T) {
|
||
|
var buf []byte
|
||
|
for _, s := range []string{"1", "t", "T", "TRUE", "true", "True", "0", "f", "F", "FALSE", "false", "False", "fail", "TrUe", "FAlSE", "numbers", ""} {
|
||
|
buf = append(buf[:0], s...)
|
||
|
|
||
|
exp, expErr := strconv.ParseBool(s)
|
||
|
got, gotErr := parseBoolBytes(buf)
|
||
|
|
||
|
if got != exp || !checkErrs(expErr, gotErr) {
|
||
|
t.Errorf("Failed to parse boolean value %q correctly: wanted (%t, %v), got (%t, %v)", s, exp, expErr, got, gotErr)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func checkErrs(a, b error) bool {
|
||
|
if (a == nil) != (b == nil) {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
return a == nil || a.Error() == b.Error()
|
||
|
}
|