github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/tm-db/remotedb/remotedb_test.go (about)

     1  package remotedb_test
     2  
     3  import (
     4  	"net"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/fibonacci-chain/fbc/libs/tm-db/remotedb"
    11  	"github.com/fibonacci-chain/fbc/libs/tm-db/remotedb/grpcdb"
    12  )
    13  
    14  func TestRemoteDB(t *testing.T) {
    15  	cert := "test.crt"
    16  	key := "test.key"
    17  	ln, err := net.Listen("tcp", "localhost:0")
    18  	require.Nil(t, err, "expecting a port to have been assigned on which we can listen")
    19  	srv, err := grpcdb.NewServer(cert, key)
    20  	require.Nil(t, err)
    21  	defer srv.Stop()
    22  	go func() { //nolint:staticcheck
    23  		if err := srv.Serve(ln); err != nil {
    24  			t.Fatalf("BindServer: %v", err)
    25  		}
    26  	}()
    27  
    28  	client, err := remotedb.NewRemoteDB(ln.Addr().String(), cert)
    29  	require.Nil(t, err, "expecting a successful client creation")
    30  	dbName := "test-remote-db"
    31  	require.Nil(t, client.InitRemote(&remotedb.Init{Name: dbName, Type: "goleveldb"}))
    32  	defer func() {
    33  		err := os.RemoveAll(dbName + ".db")
    34  		if err != nil {
    35  			panic(err)
    36  		}
    37  	}()
    38  
    39  	k1 := []byte("key-1")
    40  	v1, err := client.Get(k1)
    41  	require.NoError(t, err)
    42  	require.Equal(t, 0, len(v1), "expecting no key1 to have been stored, got %X (%s)", v1, v1)
    43  	vv1 := []byte("value-1")
    44  	err = client.Set(k1, vv1)
    45  	require.NoError(t, err)
    46  
    47  	gv1, err := client.Get(k1)
    48  	require.NoError(t, err)
    49  	require.Equal(t, gv1, vv1)
    50  
    51  	// Simple iteration
    52  	itr, err := client.Iterator(nil, nil)
    53  	require.NoError(t, err)
    54  
    55  	itr.Next()
    56  
    57  	key1 := itr.Key()
    58  	value := itr.Value()
    59  
    60  	require.Equal(t, key1, []byte("key-1"))
    61  	require.Equal(t, value, []byte("value-1"))
    62  	itr.Close()
    63  
    64  	// Set some more keys
    65  	k2 := []byte("key-2")
    66  	v2 := []byte("value-2")
    67  	err = client.SetSync(k2, v2)
    68  	require.NoError(t, err)
    69  	has, err := client.Has(k2)
    70  	require.NoError(t, err)
    71  	require.True(t, has)
    72  	gv2, err := client.Get(k2)
    73  	require.NoError(t, err)
    74  	require.Equal(t, gv2, v2)
    75  
    76  	// More iteration
    77  	itr, err = client.Iterator(nil, nil)
    78  	require.NoError(t, err)
    79  
    80  	itr.Next()
    81  
    82  	key1 = itr.Key()
    83  
    84  	value = itr.Value()
    85  
    86  	require.Equal(t, key1, []byte("key-1"))
    87  	require.Equal(t, value, []byte("value-1"))
    88  	itr.Next()
    89  
    90  	key1 = itr.Key()
    91  
    92  	value = itr.Value()
    93  	require.Equal(t, key1, []byte("key-2"))
    94  	require.Equal(t, value, []byte("value-2"))
    95  	itr.Close()
    96  
    97  	// Deletion
    98  	err = client.Delete(k1)
    99  	require.NoError(t, err)
   100  	err = client.DeleteSync(k2)
   101  	require.NoError(t, err)
   102  	gv1, err = client.Get(k1)
   103  	require.NoError(t, err)
   104  	gv2, err = client.Get(k2)
   105  	require.NoError(t, err)
   106  	require.Equal(t, len(gv2), 0, "after deletion, not expecting the key to exist anymore")
   107  	require.Equal(t, len(gv1), 0, "after deletion, not expecting the key to exist anymore")
   108  
   109  	// Batch tests - set
   110  	k3 := []byte("key-3")
   111  	k4 := []byte("key-4")
   112  	k5 := []byte("key-5")
   113  	v3 := []byte("value-3")
   114  	v4 := []byte("value-4")
   115  	v5 := []byte("value-5")
   116  	bat := client.NewBatch()
   117  	bat.Set(k3, v3)
   118  	bat.Set(k4, v4)
   119  
   120  	rv3, err := client.Get(k3)
   121  	require.NoError(t, err)
   122  	require.Equal(t, 0, len(rv3), "expecting no k3 to have been stored")
   123  
   124  	rv4, err := client.Get(k4)
   125  	require.NoError(t, err)
   126  	require.Equal(t, 0, len(rv4), "expecting no k4 to have been stored")
   127  	err = bat.Write()
   128  	require.NoError(t, err)
   129  
   130  	rv3, err = client.Get(k3)
   131  	require.NoError(t, err)
   132  	require.Equal(t, rv3, v3, "expecting k3 to have been stored")
   133  
   134  	rv4, err = client.Get(k4)
   135  	require.NoError(t, err)
   136  	require.Equal(t, rv4, v4, "expecting k4 to have been stored")
   137  
   138  	// Batch tests - deletion
   139  	bat = client.NewBatch()
   140  	bat.Delete(k4)
   141  	bat.Delete(k3)
   142  	err = bat.WriteSync()
   143  	require.NoError(t, err)
   144  
   145  	rv3, err = client.Get(k3)
   146  	require.NoError(t, err)
   147  	require.Equal(t, 0, len(rv3), "expecting k3 to have been deleted")
   148  
   149  	rv4, err = client.Get(k4)
   150  	require.NoError(t, err)
   151  	require.Equal(t, 0, len(rv4), "expecting k4 to have been deleted")
   152  
   153  	// Batch tests - set and delete
   154  	bat = client.NewBatch()
   155  	bat.Set(k4, v4)
   156  	bat.Set(k5, v5)
   157  	bat.Delete(k4)
   158  	err = bat.WriteSync()
   159  	require.NoError(t, err)
   160  
   161  	rv4, err = client.Get(k4)
   162  	require.NoError(t, err)
   163  	require.Equal(t, 0, len(rv4), "expecting k4 to have been deleted")
   164  
   165  	rv5, err := client.Get(k5)
   166  	require.NoError(t, err)
   167  	require.Equal(t, rv5, v5, "expecting k5 to have been stored")
   168  }