mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-03-30 15:08:33 +00:00

* [NOD-863] Write TestCursorNext. * [NOD-863] Write TestCursorFirst. * [NOD-863] Fix merge errors. * [NOD-863] Add TestCursorSeek. * [NOD-863] Add TestCursorCloseErrors. * [NOD-863] Add TestCursorCloseFirstAndNext. * [NOD-863] Add TestDataAccessorPut. * [NOD-863] Add TestDataAccessorGet. * [NOD-863] Add TestDataAccessorHas. * [NOD-863] Add TestDatabaseDelete. * [NOD-863] Add TestDatabaseAppendToStoreAndRetrieveFromStore. * [NOD-863] Add TestTransactionAppendToStoreAndRetrieveFromStore. * [NOD-863] Add TestTransactionDelete. * [NOD-863] Add TestTransactionHas. * [NOD-863] Add TestTransactionGet. * [NOD-863] Add TestTransactionPut. * [NOD-863] Move cursor tests to the bottom of interface_test.go. * [NOD-863] Move interface_test.go to a database_test package. * [NOD-863] Make each test in interface_test.go run for every database driver. Currently, only ffldb. * [NOD-863] Make each cursor test in interface_test.go run for every database driver. Currently, only ffldb. * [NOD-863] Split interface_test.go into separate files. * [NOD-863] Rename interface_test.go to common_test.go. * [NOD-863] Extract testForAllDatabaseTypes to a separate function. * [NOD-863] Reorganize how test data gets added to the database. * [NOD-863] Add explanations about testForAllDatabaseTypes. * [NOD-863] Add tests that make sure that database changes don't affect previously opened transactions. * [NOD-863] Extract databasePrepareFunc to a type alias. * [NOD-863] Fix comments. * [NOD-863] Add cursor exhaustion test to testCursorFirst. * [NOD-863] Add cursor Next clause to testCursorSeek. * [NOD-863] Add additional varification to testDatabasePut. * [NOD-863] Add an additional verification into to testTransactionGet. * [NOD-863] Add TestTransactionCommit. * [NOD-863] Add TestTransactionRollback. * [NOD-863] Add TestTransactionRollbackUnlessClosed. * [NOD-863] Remove equals sign from databasePrepareFunc declaration.
85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
package database_test
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/kaspanet/kaspad/database"
|
|
"github.com/kaspanet/kaspad/database/ffldb"
|
|
"io/ioutil"
|
|
"testing"
|
|
)
|
|
|
|
type databasePrepareFunc func(t *testing.T, testName string) (db database.Database, name string, teardownFunc func())
|
|
|
|
// databasePrepareFuncs is a set of functions, in which each function
|
|
// prepares a separate database type for testing.
|
|
// See testForAllDatabaseTypes for further details.
|
|
var databasePrepareFuncs = []databasePrepareFunc{
|
|
prepareFFLDBForTest,
|
|
}
|
|
|
|
func prepareFFLDBForTest(t *testing.T, testName string) (db database.Database, name string, teardownFunc func()) {
|
|
// Create a temp db to run tests against
|
|
path, err := ioutil.TempDir("", testName)
|
|
if err != nil {
|
|
t.Fatalf("%s: TempDir unexpectedly "+
|
|
"failed: %s", testName, err)
|
|
}
|
|
db, err = ffldb.Open(path)
|
|
if err != nil {
|
|
t.Fatalf("%s: Open unexpectedly "+
|
|
"failed: %s", testName, err)
|
|
}
|
|
teardownFunc = func() {
|
|
err = db.Close()
|
|
if err != nil {
|
|
t.Fatalf("%s: Close unexpectedly "+
|
|
"failed: %s", testName, err)
|
|
}
|
|
}
|
|
return db, "ffldb", teardownFunc
|
|
}
|
|
|
|
// testForAllDatabaseTypes runs the given testFunc for every database
|
|
// type defined in databasePrepareFuncs. This is to make sure that
|
|
// all supported database types adhere to the assumptions defined in
|
|
// the interfaces in this package.
|
|
func testForAllDatabaseTypes(t *testing.T, testName string,
|
|
testFunc func(t *testing.T, db database.Database, testName string)) {
|
|
|
|
for _, prepareDatabase := range databasePrepareFuncs {
|
|
func() {
|
|
db, dbType, teardownFunc := prepareDatabase(t, testName)
|
|
defer teardownFunc()
|
|
|
|
testName := fmt.Sprintf("%s: %s", dbType, testName)
|
|
testFunc(t, db, testName)
|
|
}()
|
|
}
|
|
}
|
|
|
|
type keyValuePair struct {
|
|
key *database.Key
|
|
value []byte
|
|
}
|
|
|
|
func populateDatabaseForTest(t *testing.T, db database.Database, testName string) []keyValuePair {
|
|
// Prepare a list of key/value pairs
|
|
entries := make([]keyValuePair, 10)
|
|
for i := 0; i < 10; i++ {
|
|
key := database.MakeBucket().Key([]byte(fmt.Sprintf("key%d", i)))
|
|
value := []byte("value")
|
|
entries[i] = keyValuePair{key: key, value: value}
|
|
}
|
|
|
|
// Put the pairs into the database
|
|
for _, entry := range entries {
|
|
err := db.Put(entry.key, entry.value)
|
|
if err != nil {
|
|
t.Fatalf("%s: Put unexpectedly "+
|
|
"failed: %s", testName, err)
|
|
}
|
|
}
|
|
|
|
return entries
|
|
}
|