forked from TrueCloudLab/frostfs-node
96 lines
2.1 KiB
Go
96 lines
2.1 KiB
Go
|
package boltdb
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/nspcc-dev/neofs-node/lib/core"
|
||
|
"github.com/pkg/errors"
|
||
|
"github.com/spf13/viper"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
var config = strings.NewReader(`
|
||
|
storage:
|
||
|
test_bucket:
|
||
|
bucket: boltdb
|
||
|
path: ./temp/storage/test_bucket
|
||
|
perm: 0777
|
||
|
`)
|
||
|
|
||
|
func TestBucket(t *testing.T) {
|
||
|
file, err := ioutil.TempFile("", "test_bolt_db")
|
||
|
require.NoError(t, err)
|
||
|
require.NoError(t, file.Close())
|
||
|
|
||
|
v := viper.New()
|
||
|
require.NoError(t, v.ReadConfig(config))
|
||
|
|
||
|
// -- //
|
||
|
_, err = NewOptions("storage.test_bucket", v)
|
||
|
require.EqualError(t, err, errEmptyPath.Error())
|
||
|
|
||
|
v.SetDefault("storage.test_bucket.path", file.Name())
|
||
|
v.SetDefault("storage.test_bucket.timeout", time.Millisecond*100)
|
||
|
// -- //
|
||
|
|
||
|
opts, err := NewOptions("storage.test_bucket", v)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
db, err := NewBucket(&opts)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
require.NotPanics(t, func() { db.Size() })
|
||
|
|
||
|
var (
|
||
|
count = uint64(10)
|
||
|
expected = []byte("test")
|
||
|
)
|
||
|
|
||
|
for i := uint64(0); i < count; i++ {
|
||
|
key := make([]byte, 8)
|
||
|
binary.BigEndian.PutUint64(key, i)
|
||
|
|
||
|
require.False(t, db.Has(key))
|
||
|
|
||
|
val, err := db.Get(key)
|
||
|
require.EqualError(t, errors.Cause(err), core.ErrNotFound.Error())
|
||
|
require.Empty(t, val)
|
||
|
|
||
|
require.NoError(t, db.Set(key, expected))
|
||
|
|
||
|
require.True(t, db.Has(key))
|
||
|
|
||
|
val, err = db.Get(key)
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, expected, val)
|
||
|
|
||
|
keys, err := db.List()
|
||
|
require.NoError(t, err)
|
||
|
require.Len(t, keys, 1)
|
||
|
require.Equal(t, key, keys[0])
|
||
|
|
||
|
require.EqualError(t, db.Iterate(nil), core.ErrNilFilterHandler.Error())
|
||
|
|
||
|
items, err := core.ListBucketItems(db, func(_, _ []byte) bool { return true })
|
||
|
require.NoError(t, err)
|
||
|
require.Len(t, items, 1)
|
||
|
require.Equal(t, key, items[0].Key)
|
||
|
require.Equal(t, val, items[0].Val)
|
||
|
|
||
|
require.NoError(t, db.Del(key))
|
||
|
require.False(t, db.Has(key))
|
||
|
|
||
|
val, err = db.Get(key)
|
||
|
require.EqualError(t, errors.Cause(err), core.ErrNotFound.Error())
|
||
|
require.Empty(t, val)
|
||
|
}
|
||
|
|
||
|
require.NoError(t, db.Close())
|
||
|
require.NoError(t, os.RemoveAll(file.Name()))
|
||
|
}
|