- package db
-
- import (
- "bytes"
- "encoding/binary"
- "fmt"
- "testing"
-
- "github.com/syndtr/goleveldb/leveldb/opt"
-
- "github.com/stretchr/testify/require"
- cmn "github.com/tendermint/tendermint/libs/common"
- )
-
- func TestNewGoLevelDB(t *testing.T) {
- name := fmt.Sprintf("test_%x", cmn.RandStr(12))
- // Test write locks
- db, err := NewGoLevelDB(name, "")
- require.Nil(t, err)
- _, err = NewGoLevelDB(name, "")
- require.NotNil(t, err)
- db.Close() // Close the db to release the lock
-
- // Open the db twice in a row to test read-only locks
- ro1, err := NewGoLevelDBWithOpts(name, "", &opt.Options{ReadOnly: true})
- defer ro1.Close()
- require.Nil(t, err)
- ro2, err := NewGoLevelDBWithOpts(name, "", &opt.Options{ReadOnly: true})
- defer ro2.Close()
- require.Nil(t, err)
- }
-
- func BenchmarkRandomReadsWrites(b *testing.B) {
- b.StopTimer()
-
- numItems := int64(1000000)
- internal := map[int64]int64{}
- for i := 0; i < int(numItems); i++ {
- internal[int64(i)] = int64(0)
- }
- db, err := NewGoLevelDB(fmt.Sprintf("test_%x", cmn.RandStr(12)), "")
- if err != nil {
- b.Fatal(err.Error())
- return
- }
-
- fmt.Println("ok, starting")
- b.StartTimer()
-
- for i := 0; i < b.N; i++ {
- // Write something
- {
- idx := (int64(cmn.RandInt()) % numItems)
- internal[idx]++
- val := internal[idx]
- idxBytes := int642Bytes(int64(idx))
- valBytes := int642Bytes(int64(val))
- //fmt.Printf("Set %X -> %X\n", idxBytes, valBytes)
- db.Set(
- idxBytes,
- valBytes,
- )
- }
- // Read something
- {
- idx := (int64(cmn.RandInt()) % numItems)
- val := internal[idx]
- idxBytes := int642Bytes(int64(idx))
- valBytes := db.Get(idxBytes)
- //fmt.Printf("Get %X -> %X\n", idxBytes, valBytes)
- if val == 0 {
- if !bytes.Equal(valBytes, nil) {
- b.Errorf("Expected %v for %v, got %X",
- nil, idx, valBytes)
- break
- }
- } else {
- if len(valBytes) != 8 {
- b.Errorf("Expected length 8 for %v, got %X",
- idx, valBytes)
- break
- }
- valGot := bytes2Int64(valBytes)
- if val != valGot {
- b.Errorf("Expected %v for %v, got %v",
- val, idx, valGot)
- break
- }
- }
- }
- }
-
- db.Close()
- }
-
- func int642Bytes(i int64) []byte {
- buf := make([]byte, 8)
- binary.BigEndian.PutUint64(buf, uint64(i))
- return buf
- }
-
- func bytes2Int64(buf []byte) int64 {
- return int64(binary.BigEndian.Uint64(buf))
- }
|