package db import ( "bytes" "encoding/binary" "fmt" "os" "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) defer os.RemoveAll("./" + name + ".db") _, 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)) }