mirror of
https://github.com/etcd-io/bbolt.git
synced 2025-04-05 00:09:36 +00:00
Commit 72c1660c13cb8cf0d590d91fb03625a68e53900f introduced TestMain, but forgot to call os.Exit with the value returned from m.Run This causes "go test" to exit with status 0, even if tests fail. Adding os.Exit to TestMain makes sure the success/failure of tests is correctly reported through the exit code.
91 lines
2.5 KiB
Go
91 lines
2.5 KiB
Go
package bbolt_test
|
|
|
|
import (
|
|
"bytes"
|
|
"flag"
|
|
"fmt"
|
|
"math/rand"
|
|
"os"
|
|
"reflect"
|
|
"testing"
|
|
"testing/quick"
|
|
"time"
|
|
)
|
|
|
|
// testing/quick defaults to 5 iterations and a random seed.
|
|
// You can override these settings from the command line:
|
|
//
|
|
// -quick.count 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 qcount, qseed, qmaxitems, qmaxksize, qmaxvsize int
|
|
|
|
func TestMain(m *testing.M) {
|
|
flag.IntVar(&qcount, "quick.count", 5, "")
|
|
flag.IntVar(&qseed, "quick.seed", int(time.Now().UnixNano())%100000, "")
|
|
flag.IntVar(&qmaxitems, "quick.maxitems", 1000, "")
|
|
flag.IntVar(&qmaxksize, "quick.maxksize", 1024, "")
|
|
flag.IntVar(&qmaxvsize, "quick.maxvsize", 1024, "")
|
|
flag.Parse()
|
|
fmt.Fprintln(os.Stderr, "seed:", qseed)
|
|
fmt.Fprintf(os.Stderr, "quick settings: count=%v, items=%v, ksize=%v, vsize=%v\n", qcount, qmaxitems, qmaxksize, qmaxvsize)
|
|
|
|
os.Exit(m.Run())
|
|
}
|
|
|
|
func qconfig() *quick.Config {
|
|
return &quick.Config{
|
|
MaxCount: qcount,
|
|
Rand: rand.New(rand.NewSource(int64(qseed))),
|
|
}
|
|
}
|
|
|
|
type testdata []testdataitem
|
|
|
|
func (t testdata) Len() int { return len(t) }
|
|
func (t testdata) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
|
|
func (t testdata) Less(i, j int) bool { return bytes.Compare(t[i].Key, t[j].Key) == -1 }
|
|
|
|
func (t testdata) Generate(rand *rand.Rand, size int) reflect.Value {
|
|
n := rand.Intn(qmaxitems-1) + 1
|
|
items := make(testdata, n)
|
|
used := make(map[string]bool)
|
|
for i := 0; i < n; i++ {
|
|
item := &items[i]
|
|
// Ensure that keys are unique by looping until we find one that we have not already used.
|
|
for {
|
|
item.Key = randByteSlice(rand, 1, qmaxksize)
|
|
if !used[string(item.Key)] {
|
|
used[string(item.Key)] = true
|
|
break
|
|
}
|
|
}
|
|
item.Value = randByteSlice(rand, 0, qmaxvsize)
|
|
}
|
|
return reflect.ValueOf(items)
|
|
}
|
|
|
|
type revtestdata []testdataitem
|
|
|
|
func (t revtestdata) Len() int { return len(t) }
|
|
func (t revtestdata) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
|
|
func (t revtestdata) Less(i, j int) bool { return bytes.Compare(t[i].Key, t[j].Key) == 1 }
|
|
|
|
type testdataitem struct {
|
|
Key []byte
|
|
Value []byte
|
|
}
|
|
|
|
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
|
|
}
|