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 }