cosmos-sdk/tools/benchmark/generator/gen_test.go

139 lines
3.2 KiB
Go

package gen
import (
"bytes"
"testing"
"github.com/cespare/xxhash/v2"
"github.com/stretchr/testify/require"
benchmarkmodulev1 "cosmossdk.io/api/cosmos/benchmark/module/v1"
)
func Test_Genesis(t *testing.T) {
params := &benchmarkmodulev1.GeneratorParams{
Seed: 34,
BucketCount: 10,
GenesisCount: 2_000_000,
KeyMean: 64,
KeyStdDev: 8,
ValueMean: 1024,
ValueStdDev: 256,
}
g := NewGenerator(Options{GeneratorParams: params})
db := make(map[uint64]map[uint64]bool)
for kv := range g.GenesisSet() {
if _, ok := db[kv.StoreKey]; !ok {
db[kv.StoreKey] = make(map[uint64]bool)
}
db[kv.StoreKey][kv.Key[0]] = true
}
g = NewGenerator(Options{
GeneratorParams: params,
InsertWeight: 0.25,
DeleteWeight: 0.05,
UpdateWeight: 0.50,
GetWeight: 0.20,
}, WithGenesis())
for range 100_000 {
sk, op, err := g.Next()
require.NoError(t, err)
switch {
case op.Delete:
require.True(t, db[sk][op.Seed])
delete(db[sk], op.Seed)
case op.ValueLength > 0:
if op.Exists {
// update
require.True(t, db[sk][op.Seed])
} else {
// insert
require.False(t, db[sk][op.Seed])
}
db[sk][op.Seed] = true
case op.ValueLength == 0:
// get
require.True(t, db[sk][op.Seed])
default:
t.Fatalf("unexpected op: %v", op)
}
}
// Test state Marshal/Unmarshal
var buf bytes.Buffer
require.NoError(t, g.state.Marshal(&buf))
s := &State{}
require.NoError(t, s.Unmarshal(bytes.NewReader(buf.Bytes())))
require.Equal(t, len(g.state.Keys), len(s.Keys))
for i := range g.state.Keys {
require.Equal(t, len(g.state.Keys[i]), len(s.Keys[i]))
for j := range g.state.Keys[i] {
require.Equal(t, g.state.Keys[i][j], s.Keys[i][j])
}
}
}
func Test_Genesis_BytesKey(t *testing.T) {
params := &benchmarkmodulev1.GeneratorParams{
Seed: 34,
BucketCount: 10,
GenesisCount: 2_000_000,
KeyMean: 64,
KeyStdDev: 8,
ValueMean: 1024,
ValueStdDev: 256,
}
g := NewGenerator(Options{GeneratorParams: params})
db := make(map[uint64]map[uint64]bool)
for kv := range g.GenesisSet() {
if _, ok := db[kv.StoreKey]; !ok {
db[kv.StoreKey] = make(map[uint64]bool)
}
key := xxhash.Sum64(Bytes(kv.Key.Seed(), kv.Key.Length()))
db[kv.StoreKey][key] = true
}
g = NewGenerator(Options{
GeneratorParams: params,
InsertWeight: 0.25,
DeleteWeight: 0.05,
UpdateWeight: 0.50,
GetWeight: 0.20,
}, WithGenesis())
for range 1_000_000 {
sk, op, err := g.Next()
require.NoError(t, err)
key := xxhash.Sum64(Bytes(op.Seed, op.KeyLength))
switch {
case op.Delete:
require.True(t, db[sk][key])
delete(db[sk], key)
case op.ValueLength > 0:
if op.Exists {
// update
require.True(t, db[sk][key])
} else {
// insert
require.False(t, db[sk][key])
}
db[sk][key] = true
case op.ValueLength == 0:
// get
require.True(t, db[sk][key])
default:
t.Fatalf("unexpected op: %v", op)
}
}
}
func Test_Bytes_Deterministic(t *testing.T) {
seed := uint64(12345)
length := uint64(53)
expected := Bytes(seed, length)
for i := 0; i < 100; i++ {
result := Bytes(seed, length)
require.Equal(t, expected, result, "Bytes() should be deterministic")
}
}