github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/store/db/leveldb_store_test.go (about) 1 /* 2 * Copyright (C) 2018 The ontology Authors 3 * This file is part of The ontology library. 4 * 5 * The ontology is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU Lesser General Public License as published by 7 * the Free Software Foundation, either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * The ontology is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with The ontology. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 package db 19 20 import ( 21 "fmt" 22 "os" 23 "testing" 24 25 "bytes" 26 27 "github.com/syndtr/goleveldb/leveldb/util" 28 ) 29 30 var testLevelDB *LevelDBStore 31 32 func TestMain(m *testing.M) { 33 dbFile := "./test" 34 var err error 35 testLevelDB, err = NewLevelDBStore(dbFile) 36 if err != nil { 37 fmt.Printf("NewLevelDBStore error:%s\n", err) 38 return 39 } 40 m.Run() 41 testLevelDB.Close() 42 os.RemoveAll(dbFile) 43 os.RemoveAll("ActorLog") 44 } 45 46 func TestLevelDB(t *testing.T) { 47 key := "foo" 48 value := "bar" 49 err := testLevelDB.Put([]byte(key), []byte(value)) 50 if err != nil { 51 t.Errorf("Put error:%s", err) 52 return 53 } 54 v, err := testLevelDB.Get([]byte(key)) 55 if err != nil { 56 t.Errorf("Get error:%s", err) 57 return 58 } 59 if string(v) != value { 60 t.Errorf("Get error %s != %s", v, value) 61 return 62 } 63 err = testLevelDB.Delete([]byte(key)) 64 if err != nil { 65 t.Errorf("Delete error:%s", err) 66 return 67 } 68 ok, err := testLevelDB.Has([]byte(key)) 69 if err != nil { 70 t.Errorf("Has error:%s", err) 71 return 72 } 73 if ok { 74 t.Errorf("Key:%s shoule delete", key) 75 return 76 } 77 } 78 79 func TestBatch(t *testing.T) { 80 testLevelDB.NewBatch() 81 82 key1 := "foo1" 83 value1 := "bar1" 84 testLevelDB.BatchPut([]byte(key1), []byte(value1)) 85 86 key2 := "foo2" 87 value2 := "bar2" 88 testLevelDB.BatchPut([]byte(key2), []byte(value2)) 89 90 err := testLevelDB.BatchCommit() 91 if err != nil { 92 t.Errorf("BatchCommit error:%s", err) 93 return 94 } 95 96 v1, err := testLevelDB.Get([]byte(key1)) 97 if err != nil { 98 t.Errorf("Get error:%s", err) 99 return 100 } 101 if string(v1) != value1 { 102 t.Errorf("Get %s != %s", v1, value1) 103 return 104 } 105 } 106 107 func TestIterator(t *testing.T) { 108 kvMap := make(map[string]string) 109 kvMap["foo0001"] = "bar0001" 110 kvMap["foo0002"] = "bar0002" 111 kvMap["foo0005"] = "bar0005" 112 kvMap["foo0101"] = "bar0101" 113 kvMap["foo1001"] = "bar1001" 114 kvMap["foo0021"] = "bar0021" 115 testLevelDB.NewBatch() 116 for k, v := range kvMap { 117 testLevelDB.BatchPut([]byte(k), []byte(v)) 118 } 119 err := testLevelDB.BatchCommit() 120 if err != nil { 121 t.Errorf("BatchCommit error:%s", err) 122 return 123 } 124 kvs := make(map[string]string) 125 126 fmt.Println("--------------------iter1----------------------------") 127 iter := testLevelDB.NewIterator([]byte("fo")) 128 for iter.Next() { 129 key := iter.Key() 130 value := iter.Value() 131 kvs[string(key)] = string(value) 132 fmt.Printf("Key:%s Value:%s\n", key, value) 133 } 134 iter.Release() 135 136 fmt.Println("--------------------iter2----------------------------") 137 iter2 := testLevelDB.NewSeniorIterator(&util.Range{Start: []byte("foo0002"), Limit: []byte("foo0010")}) 138 for iter2.Next() { 139 key := iter2.Key() 140 value := iter2.Value() 141 fmt.Printf("Key:%s Value:%s\n", key, value) 142 } 143 /* iter2.Prev() 144 iter2.Prev() 145 fmt.Printf("Key:%s Value:%s\n", iter2.Key(), iter2.Value())*/ 146 iter2.Release() 147 148 fmt.Println("--------------------iter3----------------------------") 149 iter3 := testLevelDB.NewSeniorIterator(util.BytesPrefix([]byte("foo0001"))) 150 for iter3.Next() { 151 fmt.Printf("Key:%s Value:%s\n", iter3.Key(), iter3.Value()) 152 } 153 154 iter3.Release() 155 fmt.Println("--------------------iter4----------------------------") 156 iter4 := testLevelDB.NewSeniorIterator(nil) 157 /* for ok := iter4.Seek([]byte("foo1001")); ok; ok = iter4.Prev() { 158 fmt.Printf("查找数据:%s, value:%s\n", iter4.Key(), iter4.Value()) 159 }*/ 160 flag := true 161 if iter4.Seek([]byte("foo0011")) { 162 cmp := bytes.Compare(iter4.Key(), []byte("foo0003")) 163 if cmp == 0 { 164 fmt.Printf("查找数据1:%s, value:%s\n", iter4.Key(), iter4.Value()) 165 flag = false 166 } 167 } 168 if flag && iter4.Prev() { 169 fmt.Printf("查找数据2:%s, value:%s\n", iter4.Key(), iter4.Value()) 170 } 171 iter4.Release() 172 } 173 174 func BenchmarkIterator(b *testing.B) { 175 kvMap := make(map[string]string) 176 kvMap["foo0001"] = "bar0001" 177 kvMap["foo0002"] = "bar0002" 178 kvMap["foo0005"] = "bar0005" 179 kvMap["foo0101"] = "bar0101" 180 kvMap["foo1001"] = "bar1001" 181 kvMap["foo0021"] = "bar0021" 182 testLevelDB.NewBatch() 183 for k, v := range kvMap { 184 testLevelDB.BatchPut([]byte(k), []byte(v)) 185 } 186 err := testLevelDB.BatchCommit() 187 if err != nil { 188 b.Errorf("BatchCommit error:%s", err) 189 return 190 } 191 b.ReportAllocs() 192 for i := 0; i < b.N; i++ { //use b.N for looping 193 iter4 := testLevelDB.NewSeniorIterator(nil) 194 /* for ok := iter4.Seek([]byte("foo1001")); ok; ok = iter4.Prev() { 195 fmt.Printf("Find data:%s, value:%s\n", iter4.Key(), iter4.Value()) 196 }*/ 197 flag := true 198 if iter4.Seek([]byte("foo0011")) { 199 cmp := bytes.Compare(iter4.Key(), []byte("foo0003")) 200 if cmp == 0 { 201 //fmt.Printf("Find data1:%s, value:%s\n", iter4.Key(), iter4.Value()) 202 flag = false 203 } 204 } 205 if flag && iter4.Prev() { 206 //fmt.Printf("Find data2:%s, value:%s\n", iter4.Key(), iter4.Value()) 207 } 208 iter4.Release() 209 210 } 211 }