github.com/eris-ltd/erisdb@v0.25.0/storage/rwtree_test.go (about) 1 package storage 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/stretchr/testify/assert" 10 dbm "github.com/tendermint/tendermint/libs/db" 11 ) 12 13 func TestSave(t *testing.T) { 14 db := dbm.NewMemDB() 15 rwt := NewRWTree(db, 100) 16 foo := bz("foo") 17 gaa := bz("gaa") 18 dam := bz("dam") 19 rwt.Set(foo, gaa) 20 rwt.Save() 21 assert.Equal(t, gaa, rwt.Get(foo)) 22 rwt.Set(foo, dam) 23 _, _, err := rwt.Save() 24 require.NoError(t, err) 25 assert.Equal(t, dam, rwt.Get(foo)) 26 } 27 28 func TestEmptyTree(t *testing.T) { 29 db := dbm.NewMemDB() 30 rwt := NewRWTree(db, 100) 31 fmt.Printf("%X\n", rwt.Hash()) 32 } 33 34 func TestRollback(t *testing.T) { 35 db := dbm.NewMemDB() 36 rwt := NewRWTree(db, 100) 37 rwt.Set(bz("Raffle"), bz("Topper")) 38 _, _, err := rwt.Save() 39 40 foo := bz("foo") 41 gaa := bz("gaa") 42 dam := bz("dam") 43 rwt.Set(foo, gaa) 44 hash1, version1, err := rwt.Save() 45 require.NoError(t, err) 46 47 // Perform some writes on top of version1 48 rwt.Set(foo, gaa) 49 rwt.Set(gaa, dam) 50 hash2, version2, err := rwt.Save() 51 rwt.Iterate(nil, nil, true, func(key, value []byte) error { 52 fmt.Println(string(key), " => ", string(value)) 53 return nil 54 }) 55 require.NoError(t, err) 56 57 // Make a new tree 58 rwt = NewRWTree(db, 100) 59 err = rwt.Load(version1, true) 60 require.NoError(t, err) 61 // If you load version1 the working hash is that which you saved after version0, i.e. hash0 62 require.Equal(t, hash1, rwt.Hash()) 63 64 // Run the same writes again 65 rwt.Set(foo, gaa) 66 rwt.Set(gaa, dam) 67 hash3, version3, err := rwt.Save() 68 require.NoError(t, err) 69 rwt.Iterate(nil, nil, true, func(key, value []byte) error { 70 fmt.Println(string(key), " => ", string(value)) 71 return nil 72 }) 73 74 // Expect the same hashes 75 assert.Equal(t, hash2, hash3) 76 assert.Equal(t, version2, version3) 77 } 78 79 func TestVersionDivergence(t *testing.T) { 80 // This test serves as a reminder that IAVL nodes contain the version and a new node is created for every write 81 rwt1 := NewRWTree(dbm.NewMemDB(), 100) 82 rwt1.Set(bz("Raffle"), bz("Topper")) 83 hash11, _, err := rwt1.Save() 84 require.NoError(t, err) 85 86 rwt2 := NewRWTree(dbm.NewMemDB(), 100) 87 rwt2.Set(bz("Raffle"), bz("Topper")) 88 hash21, _, err := rwt2.Save() 89 require.NoError(t, err) 90 91 // The following 'ought' to be idempotent but isn't since it replaces the previous node with an identical one, but 92 // with an incremented version number 93 rwt2.Set(bz("Raffle"), bz("Topper")) 94 hash22, _, err := rwt2.Save() 95 require.NoError(t, err) 96 97 assert.Equal(t, hash11, hash21) 98 assert.NotEqual(t, hash11, hash22) 99 } 100 101 func TestMutableTree_Iterate(t *testing.T) { 102 mut := NewMutableTree(dbm.NewMemDB(), 100) 103 mut.Set(bz("aa"), bz("1")) 104 mut.Set(bz("aab"), bz("2")) 105 mut.Set(bz("aac"), bz("3")) 106 mut.Set(bz("aad"), bz("4")) 107 mut.Set(bz("ab"), bz("5")) 108 _, _, err := mut.SaveVersion() 109 require.NoError(t, err) 110 mut.IterateRange(bz("aab"), bz("aad"), true, func(key []byte, value []byte) bool { 111 fmt.Printf("%q -> %q\n", key, value) 112 return false 113 }) 114 fmt.Println("foo") 115 mut.IterateRange(bz("aab"), bz("aad"), false, func(key []byte, value []byte) bool { 116 fmt.Printf("%q -> %q\n", key, value) 117 return false 118 }) 119 fmt.Println("foo") 120 mut.IterateRange(bz("aad"), bz("aab"), true, func(key []byte, value []byte) bool { 121 fmt.Printf("%q -> %q\n", key, value) 122 return false 123 }) 124 }