mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-11-29 16:38:39 +00:00
Just some name changes, put in a stand in emission amount, and started copying the algo from Karlsen. Not release worthy yet. Therefore Dev branch exists now. Also, for now this is for research purposes only. I got no clue what to build on top of Kaspa yet. Help would be appreciated for ideas and implementations.
154 lines
4.1 KiB
Go
154 lines
4.1 KiB
Go
package ldb
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/zoomy-network/zoomyd/infrastructure/db/database"
|
|
)
|
|
|
|
func prepareDatabaseForTest(t *testing.T, testName string) (ldb *LevelDB, 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)
|
|
}
|
|
ldb, err = NewLevelDB(path, 8)
|
|
if err != nil {
|
|
t.Fatalf("%s: NewLevelDB unexpectedly "+
|
|
"failed: %s", testName, err)
|
|
}
|
|
teardownFunc = func() {
|
|
err = ldb.Close()
|
|
if err != nil {
|
|
t.Fatalf("%s: Close unexpectedly "+
|
|
"failed: %s", testName, err)
|
|
}
|
|
}
|
|
return ldb, teardownFunc
|
|
}
|
|
|
|
func TestLevelDBSanity(t *testing.T) {
|
|
ldb, teardownFunc := prepareDatabaseForTest(t, "TestLevelDBSanity")
|
|
defer teardownFunc()
|
|
|
|
// Put something into the db
|
|
key := database.MakeBucket(nil).Key([]byte("key"))
|
|
putData := []byte("Hello world!")
|
|
err := ldb.Put(key, putData)
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBSanity: Put returned "+
|
|
"unexpected error: %s", err)
|
|
}
|
|
|
|
// Get from the key previously put to
|
|
getData, err := ldb.Get(key)
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBSanity: Get returned "+
|
|
"unexpected error: %s", err)
|
|
}
|
|
|
|
// Make sure that the put data and the get data are equal
|
|
if !reflect.DeepEqual(getData, putData) {
|
|
t.Fatalf("TestLevelDBSanity: get data and "+
|
|
"put data are not equal. Put: %s, got: %s",
|
|
string(putData), string(getData))
|
|
}
|
|
}
|
|
|
|
func TestLevelDBTransactionSanity(t *testing.T) {
|
|
ldb, teardownFunc := prepareDatabaseForTest(t, "TestLevelDBTransactionSanity")
|
|
defer teardownFunc()
|
|
|
|
// Case 1. Write in tx and then read directly from the DB
|
|
// Begin a new transaction
|
|
tx, err := ldb.Begin()
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBTransactionSanity: Begin "+
|
|
"unexpectedly failed: %s", err)
|
|
}
|
|
|
|
// Put something into the transaction
|
|
key := database.MakeBucket(nil).Key([]byte("key"))
|
|
putData := []byte("Hello world!")
|
|
err = tx.Put(key, putData)
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBTransactionSanity: Put "+
|
|
"returned unexpected error: %s", err)
|
|
}
|
|
|
|
// Get from the key previously put to. Since the tx is not
|
|
// yet committed, this should return ErrNotFound.
|
|
_, err = ldb.Get(key)
|
|
if err == nil {
|
|
t.Fatalf("TestLevelDBTransactionSanity: Get " +
|
|
"unexpectedly succeeded")
|
|
}
|
|
if !database.IsNotFoundError(err) {
|
|
t.Fatalf("TestLevelDBTransactionSanity: Get "+
|
|
"returned wrong error: %s", err)
|
|
}
|
|
|
|
// Commit the transaction
|
|
err = tx.Commit()
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBTransactionSanity: Commit "+
|
|
"returned unexpected error: %s", err)
|
|
}
|
|
|
|
// Get from the key previously put to. Now that the tx was
|
|
// committed, this should succeed.
|
|
getData, err := ldb.Get(key)
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBTransactionSanity: Get "+
|
|
"returned unexpected error: %s", err)
|
|
}
|
|
|
|
// Make sure that the put data and the get data are equal
|
|
if !reflect.DeepEqual(getData, putData) {
|
|
t.Fatalf("TestLevelDBTransactionSanity: get "+
|
|
"data and put data are not equal. Put: %s, got: %s",
|
|
string(putData), string(getData))
|
|
}
|
|
|
|
// Case 2. Write directly to the DB and then read from a tx
|
|
// Put something into the db
|
|
key = database.MakeBucket(nil).Key([]byte("key2"))
|
|
putData = []byte("Goodbye world!")
|
|
err = ldb.Put(key, putData)
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBTransactionSanity: Put "+
|
|
"returned unexpected error: %s", err)
|
|
}
|
|
|
|
// Begin a new transaction
|
|
tx, err = ldb.Begin()
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBTransactionSanity: Begin "+
|
|
"unexpectedly failed: %s", err)
|
|
}
|
|
|
|
// Get from the key previously put to
|
|
getData, err = tx.Get(key)
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBTransactionSanity: Get "+
|
|
"returned unexpected error: %s", err)
|
|
}
|
|
|
|
// Make sure that the put data and the get data are equal
|
|
if !reflect.DeepEqual(getData, putData) {
|
|
t.Fatalf("TestLevelDBTransactionSanity: get "+
|
|
"data and put data are not equal. Put: %s, got: %s",
|
|
string(putData), string(getData))
|
|
}
|
|
|
|
// Rollback the transaction
|
|
err = tx.Rollback()
|
|
if err != nil {
|
|
t.Fatalf("TestLevelDBTransactionSanity: rollback "+
|
|
"returned unexpected error: %s", err)
|
|
}
|
|
}
|