Skip to content

Commit

Permalink
Add database fuzzing test (#2214)
Browse files Browse the repository at this point in the history
  • Loading branch information
danlaine committed Nov 15, 2022
1 parent 680bf89 commit cbe23cf
Show file tree
Hide file tree
Showing 10 changed files with 119 additions and 4 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -60,3 +60,5 @@ tests/e2e/e2e.test
tests/upgrade/upgrade.test

vendor

**/testdata
8 changes: 8 additions & 0 deletions database/corruptabledb/db_test.go
Expand Up @@ -21,6 +21,14 @@ func TestInterface(t *testing.T) {
}
}

func FuzzInterface(f *testing.F) {
for _, test := range database.FuzzTests {
baseDB := memdb.New()
db := New(baseDB)
test(f, db)
}
}

// TestCorruption tests to make sure corruptabledb wrapper works as expected.
func TestCorruption(t *testing.T) {
key := []byte("hello")
Expand Down
21 changes: 17 additions & 4 deletions database/encdb/db_test.go
Expand Up @@ -6,15 +6,18 @@ package encdb
import (
"testing"

"github.com/stretchr/testify/require"

"github.com/ava-labs/avalanchego/database"
"github.com/ava-labs/avalanchego/database/memdb"
)

const testPassword = "lol totally a secure password" //nolint:gosec

func TestInterface(t *testing.T) {
pw := "lol totally a secure password" // #nosec G101
for _, test := range database.Tests {
unencryptedDB := memdb.New()
db, err := New([]byte(pw), unencryptedDB)
db, err := New([]byte(testPassword), unencryptedDB)
if err != nil {
t.Fatal(err)
}
Expand All @@ -23,13 +26,23 @@ func TestInterface(t *testing.T) {
}
}

func FuzzInterface(f *testing.F) {
for _, test := range database.FuzzTests {
unencryptedDB := memdb.New()
db, err := New([]byte(testPassword), unencryptedDB)
if err != nil {
require.NoError(f, err)
}
test(f, db)
}
}

func BenchmarkInterface(b *testing.B) {
pw := "lol totally a secure password" // #nosec G101
for _, size := range database.BenchmarkSizes {
keys, values := database.SetupBenchmark(b, size[0], size[1], size[2])
for _, bench := range database.Benchmarks {
unencryptedDB := memdb.New()
db, err := New([]byte(pw), unencryptedDB)
db, err := New([]byte(testPassword), unencryptedDB)
if err != nil {
b.Fatal(err)
}
Expand Down
20 changes: 20 additions & 0 deletions database/leveldb/db_test.go
Expand Up @@ -8,6 +8,8 @@ import (

"github.com/prometheus/client_golang/prometheus"

"github.com/stretchr/testify/require"

"github.com/ava-labs/avalanchego/database"
"github.com/ava-labs/avalanchego/utils/logging"
)
Expand All @@ -30,6 +32,24 @@ func TestInterface(t *testing.T) {
}
}

func FuzzInterface(f *testing.F) {
for _, test := range database.FuzzTests {
folder := f.TempDir()
db, err := New(folder, nil, logging.NoLog{}, "", prometheus.NewRegistry())
if err != nil {
require.NoError(f, err)
}

defer db.Close()

test(f, db)

// The database may have been closed by the test, so we don't care if it
// errors here.
_ = db.Close()
}
}

func BenchmarkInterface(b *testing.B) {
for _, size := range database.BenchmarkSizes {
keys, values := database.SetupBenchmark(b, size[0], size[1], size[2])
Expand Down
6 changes: 6 additions & 0 deletions database/memdb/db_test.go
Expand Up @@ -15,6 +15,12 @@ func TestInterface(t *testing.T) {
}
}

func FuzzInterface(f *testing.F) {
for _, test := range database.FuzzTests {
test(f, New())
}
}

func BenchmarkInterface(b *testing.B) {
for _, size := range database.BenchmarkSizes {
keys, values := database.SetupBenchmark(b, size[0], size[1], size[2])
Expand Down
13 changes: 13 additions & 0 deletions database/meterdb/db_test.go
Expand Up @@ -8,6 +8,8 @@ import (

"github.com/prometheus/client_golang/prometheus"

"github.com/stretchr/testify/require"

"github.com/ava-labs/avalanchego/database"
"github.com/ava-labs/avalanchego/database/memdb"
)
Expand All @@ -24,6 +26,17 @@ func TestInterface(t *testing.T) {
}
}

func FuzzInterface(f *testing.F) {
for _, test := range database.FuzzTests {
baseDB := memdb.New()
db, err := New("", prometheus.NewRegistry(), baseDB)
if err != nil {
require.NoError(f, err)
}
test(f, db)
}
}

func BenchmarkInterface(b *testing.B) {
for _, size := range database.BenchmarkSizes {
keys, values := database.SetupBenchmark(b, size[0], size[1], size[2])
Expand Down
6 changes: 6 additions & 0 deletions database/prefixdb/db_test.go
Expand Up @@ -22,6 +22,12 @@ func TestInterface(t *testing.T) {
}
}

func FuzzInterface(f *testing.F) {
for _, test := range database.FuzzTests {
test(f, New([]byte(""), memdb.New()))
}
}

func BenchmarkInterface(b *testing.B) {
for _, size := range database.BenchmarkSizes {
keys, values := database.SetupBenchmark(b, size[0], size[1], size[2])
Expand Down
9 changes: 9 additions & 0 deletions database/rpcdb/db_test.go
Expand Up @@ -79,6 +79,15 @@ func TestInterface(t *testing.T) {
}
}

func FuzzInterface(f *testing.F) {
for _, test := range database.FuzzTests {
db := setupDB(f)
test(f, db.client)

db.closeFn()
}
}

func BenchmarkInterface(b *testing.B) {
for _, size := range database.BenchmarkSizes {
keys, values := database.SetupBenchmark(b, size[0], size[1], size[2])
Expand Down
31 changes: 31 additions & 0 deletions database/test_database.go
Expand Up @@ -51,6 +51,10 @@ var Tests = []func(t *testing.T, db Database){
TestManySmallConcurrentKVPairBatches,
}

var FuzzTests = []func(*testing.F, Database){
FuzzKeyValue,
}

// TestSimpleKeyValue tests to make sure that simple Put + Get + Delete + Has
// calls return the expected values.
func TestSimpleKeyValue(t *testing.T, db Database) {
Expand Down Expand Up @@ -1329,3 +1333,30 @@ func runConcurrentBatches(
}
return eg.Wait()
}

func FuzzKeyValue(f *testing.F, db Database) {
f.Fuzz(func(t *testing.T, key []byte, value []byte) {
require := require.New(t)

err := db.Put(key, value)
require.NoError(err)

exists, err := db.Has(key)
require.NoError(err)
require.True(exists)

gotVal, err := db.Get(key)
require.NoError(err)
require.True(bytes.Equal(value, gotVal))

err = db.Delete(key)
require.NoError(err)

exists, err = db.Has(key)
require.NoError(err)
require.False(exists)

_, err = db.Get(key)
require.ErrorIs(err, ErrNotFound)
})
}
7 changes: 7 additions & 0 deletions database/versiondb/db_test.go
Expand Up @@ -18,6 +18,13 @@ func TestInterface(t *testing.T) {
}
}

func FuzzInterface(f *testing.F) {
for _, test := range database.FuzzTests {
baseDB := memdb.New()
test(f, New(baseDB))
}
}

func TestIterate(t *testing.T) {
baseDB := memdb.New()
db := New(baseDB)
Expand Down

0 comments on commit cbe23cf

Please sign in to comment.