- package remotedb_test
-
- import (
- "net"
- "os"
- "testing"
-
- "github.com/stretchr/testify/require"
-
- "github.com/tendermint/tendermint/libs/db/remotedb"
- "github.com/tendermint/tendermint/libs/db/remotedb/grpcdb"
- )
-
- func TestRemoteDB(t *testing.T) {
- cert := "test.crt"
- key := "test.key"
- ln, err := net.Listen("tcp", "0.0.0.0:0")
- require.Nil(t, err, "expecting a port to have been assigned on which we can listen")
- srv, err := grpcdb.NewServer(cert, key)
- require.Nil(t, err)
- defer srv.Stop()
- go func() {
- if err := srv.Serve(ln); err != nil {
- t.Fatalf("BindServer: %v", err)
- }
- }()
-
- client, err := remotedb.NewRemoteDB(ln.Addr().String(), cert)
- require.Nil(t, err, "expecting a successful client creation")
- dbName := "test-remote-db"
- require.Nil(t, client.InitRemote(&remotedb.Init{Name: dbName, Type: "leveldb"}))
- defer func() {
- err := os.RemoveAll(dbName + ".db")
- if err != nil {
- panic(err)
- }
- }()
-
- k1 := []byte("key-1")
- v1 := client.Get(k1)
- require.Equal(t, 0, len(v1), "expecting no key1 to have been stored, got %X (%s)", v1, v1)
- vv1 := []byte("value-1")
- client.Set(k1, vv1)
- gv1 := client.Get(k1)
- require.Equal(t, gv1, vv1)
-
- // Simple iteration
- itr := client.Iterator(nil, nil)
- itr.Next()
- require.Equal(t, itr.Key(), []byte("key-1"))
- require.Equal(t, itr.Value(), []byte("value-1"))
- require.Panics(t, itr.Next)
- itr.Close()
-
- // Set some more keys
- k2 := []byte("key-2")
- v2 := []byte("value-2")
- client.SetSync(k2, v2)
- has := client.Has(k2)
- require.True(t, has)
- gv2 := client.Get(k2)
- require.Equal(t, gv2, v2)
-
- // More iteration
- itr = client.Iterator(nil, nil)
- itr.Next()
- require.Equal(t, itr.Key(), []byte("key-1"))
- require.Equal(t, itr.Value(), []byte("value-1"))
- itr.Next()
- require.Equal(t, itr.Key(), []byte("key-2"))
- require.Equal(t, itr.Value(), []byte("value-2"))
- require.Panics(t, itr.Next)
- itr.Close()
-
- // Deletion
- client.Delete(k1)
- client.DeleteSync(k2)
- gv1 = client.Get(k1)
- gv2 = client.Get(k2)
- require.Equal(t, len(gv2), 0, "after deletion, not expecting the key to exist anymore")
- require.Equal(t, len(gv1), 0, "after deletion, not expecting the key to exist anymore")
-
- // Batch tests - set
- k3 := []byte("key-3")
- k4 := []byte("key-4")
- k5 := []byte("key-5")
- v3 := []byte("value-3")
- v4 := []byte("value-4")
- v5 := []byte("value-5")
- bat := client.NewBatch()
- bat.Set(k3, v3)
- bat.Set(k4, v4)
- rv3 := client.Get(k3)
- require.Equal(t, 0, len(rv3), "expecting no k3 to have been stored")
- rv4 := client.Get(k4)
- require.Equal(t, 0, len(rv4), "expecting no k4 to have been stored")
- bat.Write()
- rv3 = client.Get(k3)
- require.Equal(t, rv3, v3, "expecting k3 to have been stored")
- rv4 = client.Get(k4)
- require.Equal(t, rv4, v4, "expecting k4 to have been stored")
-
- // Batch tests - deletion
- bat = client.NewBatch()
- bat.Delete(k4)
- bat.Delete(k3)
- bat.WriteSync()
- rv3 = client.Get(k3)
- require.Equal(t, 0, len(rv3), "expecting k3 to have been deleted")
- rv4 = client.Get(k4)
- require.Equal(t, 0, len(rv4), "expecting k4 to have been deleted")
-
- // Batch tests - set and delete
- bat = client.NewBatch()
- bat.Set(k4, v4)
- bat.Set(k5, v5)
- bat.Delete(k4)
- bat.WriteSync()
- rv4 = client.Get(k4)
- require.Equal(t, 0, len(rv4), "expecting k4 to have been deleted")
- rv5 := client.Get(k5)
- require.Equal(t, rv5, v5, "expecting k5 to have been stored")
- }
|