testing/quick: generate all possible int64, uint64 values

When generating a random int8, uint8, int16, uint16, int32, uint32,
quick.Value chooses among all possible values.

But when generating a random int64 or uint64, it only chooses
values in the range [-2⁶², 2⁶²) (even for uint64).
It should, like for all the other integers, use the full range.

If it had, this would have caught #19807 earlier.
Instead it let us discover the presence of #19809.

While we are here, also make the default source of
randomness not completely deterministic.

Fixes #19808.

Change-Id: I070f852531c92b3670bd76523326c9132bfc9416
Reviewed-on: https://go-review.googlesource.com/39152
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
This commit is contained in:
Russ Cox 2017-03-31 12:46:35 -04:00
parent 65c17a05e9
commit 719c7b03ba
3 changed files with 13 additions and 6 deletions

View file

@ -14,6 +14,7 @@ import (
"math/rand"
"reflect"
"strings"
"time"
)
var defaultMaxCount *int = flag.Int("quickchecks", 100, "The default number of iterations for each check")
@ -43,8 +44,14 @@ func randFloat64(rand *rand.Rand) float64 {
return f
}
// randInt64 returns a random integer taking half the range of an int64.
func randInt64(rand *rand.Rand) int64 { return rand.Int63() - 1<<62 }
// randInt64 returns a random int64.
func randInt64(rand *rand.Rand) int64 {
x := rand.Int63() - 1<<62
// x in [-2⁶²,2⁶²), so top two bits are 00 or 11, never 10 or 01.
// Mix in some bits from the middle.
x ^= x<<29 ^ x<<43
return x
}
// complexSize is the maximum length of arbitrary values that contain other
// values.
@ -193,7 +200,7 @@ var defaultConfig Config
// getRand returns the *rand.Rand to use for a given Config.
func (c *Config) getRand() *rand.Rand {
if c.Rand == nil {
return rand.New(rand.NewSource(0))
return rand.New(rand.NewSource(time.Now().UnixNano()))
}
return c.Rand
}