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