aboutsummaryrefslogtreecommitdiff
path: root/quick_test.go
blob: d85249d48bfc083f00bd9c809783f21b217d6bc9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package bolt

import (
	"flag"
	"math/rand"
	"reflect"
	"testing/quick"
	"time"
)

// testing/quick defaults to 100 iterations and a random seed.
// You can override these settings from the command line:
//
//   -quickchecks     The number of iterations to perform.
//   -quick.seed      The seed to use for randomizing.
//   -quick.maxitems  The maximum number of items to insert into a DB.
//   -quick.maxksize  The maximum size of a key.
//   -quick.maxvsize  The maximum size of a value.
//

var seed, testMaxItemCount, testMaxKeySize, testMaxValueSize int

func init() {
	flag.IntVar(&seed, "quick.seed", int(time.Now().UnixNano())%100000, "")
	flag.IntVar(&testMaxItemCount, "quick.maxitems", 1024, "")
	flag.IntVar(&testMaxKeySize, "quick.maxksize", 1024, "")
	flag.IntVar(&testMaxValueSize, "quick.maxvsize", 1024, "")
	warn("seed:", seed)
}

// qc creates a testing/quick configuration.
func qc() *quick.Config {
	return &quick.Config{Rand: rand.New(rand.NewSource(int64(seed)))}
}

type testKeyValuePairs []testKeyValuePair

func (t testKeyValuePairs) Generate(rand *rand.Rand, size int) reflect.Value {
	n := rand.Intn(testMaxItemCount-1) + 1
	items := make(testKeyValuePairs, n)
	for i := 0; i < n; i++ {
		items[i].Generate(rand, size)
	}
	return reflect.ValueOf(items)
}

type testKeyValuePair struct {
	Key   []byte
	Value []byte
}

func (t testKeyValuePair) Generate(rand *rand.Rand, size int) reflect.Value {
	t.Key = randByteSlice(rand, 1, testMaxKeySize)
	t.Value = randByteSlice(rand, 0, testMaxValueSize)
	return reflect.ValueOf(t)
}

func randByteSlice(rand *rand.Rand, minSize, maxSize int) []byte {
	n := rand.Intn(maxSize - minSize) + minSize
	b := make([]byte, n)
	for i := 0; i < n; i++ {
		b[i] = byte(rand.Intn(255))
	}
	return b
}