mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 02:42:27 +00:00
ethdb_test: convert put/get test to a testing table
The paradigm being used to test a LDBDatabase and MemDatabase is amenable to using testing tables. Additionally some minor refactorings were performed to improve test failure reporting and the helper function for creating the LDBDatabase now uses a testing.T to report errors, rather than using a panic.
This commit is contained in:
parent
722004ba57
commit
b5b9252e34
1 changed files with 100 additions and 102 deletions
|
|
@ -27,11 +27,110 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
"github.com/ethereum/go-ethereum/ethdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newTestLDB() (*ethdb.LDBDatabase, func()) {
|
var values = []string{"", "a", "1251", "\x00123\x00"}
|
||||||
|
|
||||||
|
func TestLDB_PutGet(t *testing.T) {
|
||||||
|
ldb, remove := newTestLDB(t)
|
||||||
|
defer remove()
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
db ethdb.Database
|
||||||
|
}{
|
||||||
|
{"LDB", ldb},
|
||||||
|
{"MemoryDB", ethdb.NewMemDatabase()},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range tests {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, k := range values {
|
||||||
|
err := tc.db.Put([]byte(k), nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("tc.db.Put(%q, <nil>) = %v, want <nil>", k, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, k := range values {
|
||||||
|
data, err := tc.db.Get([]byte(k))
|
||||||
|
if err != nil || len(data) != 0 {
|
||||||
|
t.Fatalf("tc.db.Get(%q) = %q, %v, want \"\", <nil>", k, string(data), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := tc.db.Get([]byte("non-exist-key"))
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("tc.db.Get(\"non-exist-key\") = %q, %v, want <nil>, <error: \"not found\">", string(data), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range values {
|
||||||
|
err := tc.db.Put([]byte(v), []byte(v))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("tc.db.Put(%q, %q) = %v, want <nil>", v, v, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range values {
|
||||||
|
data, err := tc.db.Get([]byte(v))
|
||||||
|
if err != nil || !bytes.Equal(data, []byte(v)) {
|
||||||
|
t.Fatalf("tc.db.Get(%q) = %q, %v, want %q, <nil>", v, string(data), err, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range values {
|
||||||
|
err := tc.db.Put([]byte(v), []byte("?"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("tc.db.Put(%q, \"?\") = %v, want <nil>", v, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range values {
|
||||||
|
data, err := tc.db.Get([]byte(v))
|
||||||
|
if err != nil || !bytes.Equal(data, []byte("?")) {
|
||||||
|
t.Fatalf("tc.db.Get(%q) = %q, %v, want \"?\", <nil>", v, string(data), err)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range values {
|
||||||
|
orig, err := tc.db.Get([]byte(v))
|
||||||
|
if err != nil || !bytes.Equal(orig, []byte("?")) {
|
||||||
|
t.Fatalf("tc.db.Get(%q) = %q, %v, want \"?\", <nil>", v, string(orig), err)
|
||||||
|
}
|
||||||
|
// Mutate the original to ensure that the database is not returning the same value instance.
|
||||||
|
orig[0] = byte(0xff)
|
||||||
|
data, err := tc.db.Get([]byte(v))
|
||||||
|
if err != nil || !bytes.Equal(data, []byte("?")) {
|
||||||
|
t.Fatalf("tc.db.Get(%q) = %q, %v, want \"?\", <nil>", v, string(data), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range values {
|
||||||
|
err := tc.db.Delete([]byte(v))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("tc.db.Delete(%q) = %v, want <nil>", v, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range values {
|
||||||
|
data, err := tc.db.Get([]byte(v))
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("tc.db.Get(%q) = %q, %v, want \"\", <error: \"not found\">", v, string(data), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTestLDB(t *testing.T) (*ethdb.LDBDatabase, func()) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
dirname, err := ioutil.TempDir(os.TempDir(), "ethdb_test_")
|
dirname, err := ioutil.TempDir(os.TempDir(), "ethdb_test_")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("failed to create test file: " + err.Error())
|
panic("failed to create test file: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
db, err := ethdb.NewLDBDatabase(dirname, 0, 0)
|
db, err := ethdb.NewLDBDatabase(dirname, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("failed to create test database: " + err.Error())
|
panic("failed to create test database: " + err.Error())
|
||||||
|
|
@ -42,104 +141,3 @@ func newTestLDB() (*ethdb.LDBDatabase, func()) {
|
||||||
os.RemoveAll(dirname)
|
os.RemoveAll(dirname)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var test_values = []string{"", "a", "1251", "\x00123\x00"}
|
|
||||||
|
|
||||||
func TestLDB_PutGet(t *testing.T) {
|
|
||||||
db, remove := newTestLDB()
|
|
||||||
defer remove()
|
|
||||||
testPutGet(db, t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMemoryDB_PutGet(t *testing.T) {
|
|
||||||
testPutGet(ethdb.NewMemDatabase(), t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testPutGet(db ethdb.Database, t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
for _, k := range test_values {
|
|
||||||
err := db.Put([]byte(k), nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("put failed: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, k := range test_values {
|
|
||||||
data, err := db.Get([]byte(k))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("get failed: %v", err)
|
|
||||||
}
|
|
||||||
if len(data) != 0 {
|
|
||||||
t.Fatalf("get returned wrong result, got %q expected nil", string(data))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := db.Get([]byte("non-exist-key"))
|
|
||||||
if err == nil {
|
|
||||||
t.Fatalf("expect to return a not found error")
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, v := range test_values {
|
|
||||||
err := db.Put([]byte(v), []byte(v))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("put failed: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, v := range test_values {
|
|
||||||
data, err := db.Get([]byte(v))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("get failed: %v", err)
|
|
||||||
}
|
|
||||||
if !bytes.Equal(data, []byte(v)) {
|
|
||||||
t.Fatalf("get returned wrong result, got %q expected %q", string(data), v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, v := range test_values {
|
|
||||||
err := db.Put([]byte(v), []byte("?"))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("put override failed: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, v := range test_values {
|
|
||||||
data, err := db.Get([]byte(v))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("get failed: %v", err)
|
|
||||||
}
|
|
||||||
if !bytes.Equal(data, []byte("?")) {
|
|
||||||
t.Fatalf("get returned wrong result, got %q expected ?", string(data))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, v := range test_values {
|
|
||||||
orig, err := db.Get([]byte(v))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("get failed: %v", err)
|
|
||||||
}
|
|
||||||
orig[0] = byte(0xff)
|
|
||||||
data, err := db.Get([]byte(v))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("get failed: %v", err)
|
|
||||||
}
|
|
||||||
if !bytes.Equal(data, []byte("?")) {
|
|
||||||
t.Fatalf("get returned wrong result, got %q expected ?", string(data))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, v := range test_values {
|
|
||||||
err := db.Delete([]byte(v))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("delete %q failed: %v", v, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, v := range test_values {
|
|
||||||
_, err := db.Get([]byte(v))
|
|
||||||
if err == nil {
|
|
||||||
t.Fatalf("got deleted value %q", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue