github.com/evdatsion/aphelion-dpos-bft@v0.32.1/libs/db/db_test.go (about) 1 package db 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestDBIteratorSingleKey(t *testing.T) { 12 for backend := range backends { 13 t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) { 14 db, dir := newTempDB(t, backend) 15 defer os.RemoveAll(dir) 16 17 db.SetSync(bz("1"), bz("value_1")) 18 itr := db.Iterator(nil, nil) 19 20 checkValid(t, itr, true) 21 checkNext(t, itr, false) 22 checkValid(t, itr, false) 23 checkNextPanics(t, itr) 24 25 // Once invalid... 26 checkInvalid(t, itr) 27 }) 28 } 29 } 30 31 func TestDBIteratorTwoKeys(t *testing.T) { 32 for backend := range backends { 33 t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) { 34 db, dir := newTempDB(t, backend) 35 defer os.RemoveAll(dir) 36 37 db.SetSync(bz("1"), bz("value_1")) 38 db.SetSync(bz("2"), bz("value_1")) 39 40 { // Fail by calling Next too much 41 itr := db.Iterator(nil, nil) 42 checkValid(t, itr, true) 43 44 checkNext(t, itr, true) 45 checkValid(t, itr, true) 46 47 checkNext(t, itr, false) 48 checkValid(t, itr, false) 49 50 checkNextPanics(t, itr) 51 52 // Once invalid... 53 checkInvalid(t, itr) 54 } 55 }) 56 } 57 } 58 59 func TestDBIteratorMany(t *testing.T) { 60 for backend := range backends { 61 t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) { 62 db, dir := newTempDB(t, backend) 63 defer os.RemoveAll(dir) 64 65 keys := make([][]byte, 100) 66 for i := 0; i < 100; i++ { 67 keys[i] = []byte{byte(i)} 68 } 69 70 value := []byte{5} 71 for _, k := range keys { 72 db.Set(k, value) 73 } 74 75 itr := db.Iterator(nil, nil) 76 defer itr.Close() 77 for ; itr.Valid(); itr.Next() { 78 assert.Equal(t, db.Get(itr.Key()), itr.Value()) 79 } 80 }) 81 } 82 } 83 84 func TestDBIteratorEmpty(t *testing.T) { 85 for backend := range backends { 86 t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) { 87 db, dir := newTempDB(t, backend) 88 defer os.RemoveAll(dir) 89 90 itr := db.Iterator(nil, nil) 91 92 checkInvalid(t, itr) 93 }) 94 } 95 } 96 97 func TestDBIteratorEmptyBeginAfter(t *testing.T) { 98 for backend := range backends { 99 t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) { 100 db, dir := newTempDB(t, backend) 101 defer os.RemoveAll(dir) 102 103 itr := db.Iterator(bz("1"), nil) 104 105 checkInvalid(t, itr) 106 }) 107 } 108 } 109 110 func TestDBIteratorNonemptyBeginAfter(t *testing.T) { 111 for backend := range backends { 112 t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) { 113 db, dir := newTempDB(t, backend) 114 defer os.RemoveAll(dir) 115 116 db.SetSync(bz("1"), bz("value_1")) 117 itr := db.Iterator(bz("2"), nil) 118 119 checkInvalid(t, itr) 120 }) 121 } 122 } 123 124 func TestDBBatchWrite(t *testing.T) { 125 testCases := []struct { 126 modify func(batch Batch) 127 calls map[string]int 128 }{ 129 0: { 130 func(batch Batch) { 131 batch.Set(bz("1"), bz("1")) 132 batch.Set(bz("2"), bz("2")) 133 batch.Delete(bz("3")) 134 batch.Set(bz("4"), bz("4")) 135 batch.Write() 136 }, 137 map[string]int{ 138 "Set": 0, "SetSync": 0, "SetNoLock": 3, "SetNoLockSync": 0, 139 "Delete": 0, "DeleteSync": 0, "DeleteNoLock": 1, "DeleteNoLockSync": 0, 140 }, 141 }, 142 1: { 143 func(batch Batch) { 144 batch.Set(bz("1"), bz("1")) 145 batch.Set(bz("2"), bz("2")) 146 batch.Set(bz("4"), bz("4")) 147 batch.Delete(bz("3")) 148 batch.Write() 149 }, 150 map[string]int{ 151 "Set": 0, "SetSync": 0, "SetNoLock": 3, "SetNoLockSync": 0, 152 "Delete": 0, "DeleteSync": 0, "DeleteNoLock": 1, "DeleteNoLockSync": 0, 153 }, 154 }, 155 2: { 156 func(batch Batch) { 157 batch.Set(bz("1"), bz("1")) 158 batch.Set(bz("2"), bz("2")) 159 batch.Delete(bz("3")) 160 batch.Set(bz("4"), bz("4")) 161 batch.WriteSync() 162 }, 163 map[string]int{ 164 "Set": 0, "SetSync": 0, "SetNoLock": 2, "SetNoLockSync": 1, 165 "Delete": 0, "DeleteSync": 0, "DeleteNoLock": 1, "DeleteNoLockSync": 0, 166 }, 167 }, 168 3: { 169 func(batch Batch) { 170 batch.Set(bz("1"), bz("1")) 171 batch.Set(bz("2"), bz("2")) 172 batch.Set(bz("4"), bz("4")) 173 batch.Delete(bz("3")) 174 batch.WriteSync() 175 }, 176 map[string]int{ 177 "Set": 0, "SetSync": 0, "SetNoLock": 3, "SetNoLockSync": 0, 178 "Delete": 0, "DeleteSync": 0, "DeleteNoLock": 0, "DeleteNoLockSync": 1, 179 }, 180 }, 181 } 182 183 for i, tc := range testCases { 184 mdb := newMockDB() 185 batch := mdb.NewBatch() 186 187 tc.modify(batch) 188 189 for call, exp := range tc.calls { 190 got := mdb.calls[call] 191 assert.Equal(t, exp, got, "#%v - key: %s", i, call) 192 } 193 } 194 }