github.com/decred/dcrlnd@v0.7.6/kvdb/etcd/readwrite_tx_test.go (about)

     1  //go:build kvdb_etcd
     2  // +build kvdb_etcd
     3  
     4  package etcd
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/btcsuite/btcwallet/walletdb"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestChangeDuringManualTx(t *testing.T) {
    15  	t.Parallel()
    16  
    17  	f := NewEtcdTestFixture(t)
    18  	defer f.Cleanup()
    19  
    20  	db, err := newEtcdBackend(context.TODO(), f.BackendConfig())
    21  	require.NoError(t, err)
    22  
    23  	tx, err := db.BeginReadWriteTx()
    24  	require.Nil(t, err)
    25  	require.NotNil(t, tx)
    26  
    27  	apple, err := tx.CreateTopLevelBucket([]byte("apple"))
    28  	require.Nil(t, err)
    29  	require.NotNil(t, apple)
    30  
    31  	require.NoError(t, apple.Put([]byte("testKey"), []byte("testVal")))
    32  
    33  	// Try overwriting the bucket key.
    34  	f.Put(BucketKey("apple"), "banana")
    35  
    36  	// TODO: translate error
    37  	require.NotNil(t, tx.Commit())
    38  	require.Equal(t, map[string]string{
    39  		BucketKey("apple"): "banana",
    40  	}, f.Dump())
    41  }
    42  
    43  func TestChangeDuringUpdate(t *testing.T) {
    44  	t.Parallel()
    45  
    46  	f := NewEtcdTestFixture(t)
    47  	defer f.Cleanup()
    48  
    49  	db, err := newEtcdBackend(context.TODO(), f.BackendConfig())
    50  	require.NoError(t, err)
    51  
    52  	count := 0
    53  
    54  	err = db.Update(func(tx walletdb.ReadWriteTx) error {
    55  		apple, err := tx.CreateTopLevelBucket([]byte("apple"))
    56  		require.NoError(t, err)
    57  		require.NotNil(t, apple)
    58  
    59  		require.NoError(t, apple.Put([]byte("key"), []byte("value")))
    60  
    61  		if count == 0 {
    62  			f.Put(ValueKey("key", "apple"), "new_value")
    63  			f.Put(ValueKey("key2", "apple"), "value2")
    64  		}
    65  
    66  		cursor := apple.ReadCursor()
    67  		k, v := cursor.First()
    68  		require.Equal(t, []byte("key"), k)
    69  		require.Equal(t, []byte("value"), v)
    70  		require.Equal(t, v, apple.Get([]byte("key")))
    71  
    72  		k, v = cursor.Next()
    73  		if count == 0 {
    74  			require.Nil(t, k)
    75  			require.Nil(t, v)
    76  		} else {
    77  			require.Equal(t, []byte("key2"), k)
    78  			require.Equal(t, []byte("value2"), v)
    79  		}
    80  
    81  		count++
    82  		return nil
    83  	}, func() {})
    84  
    85  	require.Nil(t, err)
    86  	require.Equal(t, count, 2)
    87  
    88  	expected := map[string]string{
    89  		BucketKey("apple"):        BucketVal("apple"),
    90  		ValueKey("key", "apple"):  "value",
    91  		ValueKey("key2", "apple"): "value2",
    92  	}
    93  	require.Equal(t, expected, f.Dump())
    94  }