forked from TrueCloudLab/frostfs-node
[#216] blobovnicza: Implement main methods and logic
Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
52b0c1f19a
commit
07e998d846
10 changed files with 627 additions and 0 deletions
138
pkg/local_object_storage/blobovnicza/blobovnicza_test.go
Normal file
138
pkg/local_object_storage/blobovnicza/blobovnicza_test.go
Normal file
|
@ -0,0 +1,138 @@
|
|||
package blobovnicza
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"crypto/sha256"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/nspcc-dev/neofs-api-go/pkg/container"
|
||||
objectSDK "github.com/nspcc-dev/neofs-api-go/pkg/object"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/core/object"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/util/logger/test"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func testSHA256() (h [sha256.Size]byte) {
|
||||
rand.Read(h[:])
|
||||
|
||||
return h
|
||||
}
|
||||
|
||||
func testAddress() *objectSDK.Address {
|
||||
cid := container.NewID()
|
||||
cid.SetSHA256(testSHA256())
|
||||
|
||||
oid := objectSDK.NewID()
|
||||
oid.SetSHA256(testSHA256())
|
||||
|
||||
addr := objectSDK.NewAddress()
|
||||
addr.SetObjectID(oid)
|
||||
addr.SetContainerID(cid)
|
||||
|
||||
return addr
|
||||
}
|
||||
|
||||
func testObject(sz uint64) *object.Object {
|
||||
raw := object.NewRaw()
|
||||
|
||||
addr := testAddress()
|
||||
raw.SetID(addr.ObjectID())
|
||||
raw.SetContainerID(addr.ContainerID())
|
||||
|
||||
raw.SetPayload(make([]byte, sz))
|
||||
|
||||
// fit the binary size to the required
|
||||
data, _ := raw.Marshal()
|
||||
if ln := uint64(len(data)); ln > sz {
|
||||
raw.SetPayload(raw.Payload()[:sz-(ln-sz)])
|
||||
}
|
||||
|
||||
raw.SetAttributes() // for require.Equal
|
||||
|
||||
return raw.Object()
|
||||
}
|
||||
|
||||
func testPutGet(t *testing.T, blz *Blobovnicza, sz uint64, expPut, expGet error) *objectSDK.Address {
|
||||
// create new object
|
||||
obj := testObject(sz)
|
||||
|
||||
// try to save object in Blobovnicza
|
||||
pPut := new(PutPrm)
|
||||
pPut.SetObject(obj)
|
||||
_, err := blz.Put(pPut)
|
||||
require.True(t, errors.Is(err, expPut))
|
||||
|
||||
if expPut != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
testGet(t, blz, obj.Address(), obj, expGet)
|
||||
|
||||
return obj.Address()
|
||||
}
|
||||
|
||||
func testGet(t *testing.T, blz *Blobovnicza, addr *objectSDK.Address, expObj *object.Object, expErr error) {
|
||||
pGet := new(GetPrm)
|
||||
pGet.SetAddress(addr)
|
||||
|
||||
// try to read object from Blobovnicza
|
||||
res, err := blz.Get(pGet)
|
||||
require.True(t, errors.Is(err, expErr))
|
||||
|
||||
if expErr == nil {
|
||||
require.Equal(t, expObj, res.Object())
|
||||
}
|
||||
}
|
||||
|
||||
func TestBlobovnicza(t *testing.T) {
|
||||
p := "./test_blz"
|
||||
|
||||
sizeLim := uint64(256 * 1 << 10) // 256KB
|
||||
objSizeLim := sizeLim / 2
|
||||
|
||||
// create Blobovnicza instance
|
||||
blz := New(
|
||||
WithPath(p),
|
||||
WithObjectSizeLimit(objSizeLim),
|
||||
WithFullSizeLimit(sizeLim),
|
||||
WithLogger(test.NewLogger(false)),
|
||||
)
|
||||
|
||||
defer os.Remove(p)
|
||||
|
||||
// open Blobovnicza
|
||||
require.NoError(t, blz.Open())
|
||||
|
||||
// initialize Blobovnicza
|
||||
require.NoError(t, blz.Init())
|
||||
|
||||
// try to read non-existent address
|
||||
testGet(t, blz, testAddress(), nil, ErrObjectNotFound)
|
||||
|
||||
filled := uint64(15 * 1 << 10)
|
||||
|
||||
// test object 15KB
|
||||
addr := testPutGet(t, blz, filled, nil, nil)
|
||||
|
||||
// remove the object
|
||||
dPrm := new(DeletePrm)
|
||||
dPrm.SetAddress(addr)
|
||||
|
||||
_, err := blz.Delete(dPrm)
|
||||
require.NoError(t, err)
|
||||
|
||||
// should return 404
|
||||
testGet(t, blz, addr, nil, ErrObjectNotFound)
|
||||
|
||||
// fill Blobovnicza fully
|
||||
for ; filled < sizeLim; filled += objSizeLim {
|
||||
testPutGet(t, blz, objSizeLim, nil, nil)
|
||||
}
|
||||
|
||||
// from now objects should not be saved
|
||||
testPutGet(t, blz, 1024, ErrFull, nil)
|
||||
|
||||
require.NoError(t, blz.Close())
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue