frostfs-node/pkg/local_object_storage/metabase/util_test.go

135 lines
2.7 KiB
Go
Raw Normal View History

package meta
import (
"crypto/rand"
"testing"
"github.com/stretchr/testify/require"
)
func Test_lockWithExpEpoch(t *testing.T) {
t.Parallel()
id1 := make([]byte, objectKeySize)
id2 := make([]byte, objectKeySize)
epoch1 := make([]byte, epochSize)
epoch2 := make([]byte, epochSize)
noEpoch := make([]byte, epochSize)
_, _ = rand.Read(id1)
_, _ = rand.Read(id2)
_, _ = rand.Read(epoch1)
_, _ = rand.Read(epoch2)
for _, testCase := range []struct {
name string
rawLockList [][]byte
ids [][]byte
expEpochs [][]byte
shouldFail bool
}{
{
name: "nil lock",
},
{
name: "empty lock",
rawLockList: [][]byte{},
},
{
name: "all locks have epochs",
rawLockList: [][]byte{
id1, epoch1,
id2, epoch2,
id1, epoch2,
},
ids: [][]byte{id1, id2, id1},
expEpochs: [][]byte{epoch1, epoch2, epoch2},
},
{
name: "some locks have epochs",
rawLockList: [][]byte{
id1,
id2, epoch1,
id1, epoch2,
id2,
id2, epoch2,
},
ids: [][]byte{id1, id2, id1, id2, id2},
expEpochs: [][]byte{noEpoch, epoch1, epoch2, noEpoch, epoch2},
},
{
name: "locks have no epochs",
rawLockList: [][]byte{
id1,
id2,
id1,
id2,
},
ids: [][]byte{id1, id2, id1, id2},
expEpochs: [][]byte{noEpoch, noEpoch, noEpoch, noEpoch},
},
{
name: "got an epoch when want an id (in the beginning)",
rawLockList: [][]byte{
epoch1,
id1,
id2, epoch2,
},
shouldFail: true,
},
{
name: "got an epoch when want an id (in the middle)",
rawLockList: [][]byte{
id1,
id2, epoch2,
epoch1,
id1, epoch1,
id2, epoch2,
},
shouldFail: true,
},
{
name: "got an epoch when want an id (in the end)",
rawLockList: [][]byte{
id1, epoch1,
id2,
id1,
id2, epoch2,
epoch1,
},
shouldFail: true,
},
} {
t.Run(testCase.name, func(t *testing.T) {
require.Equal(t, len(testCase.ids), len(testCase.expEpochs), "not a valid test case")
rawLocks, err := encodeList(testCase.rawLockList)
require.NoError(t, err)
locks, err := decodeLockWithExpEpochList(rawLocks)
if testCase.shouldFail {
require.Error(t, err)
return
}
require.NoError(t, err)
require.Equal(t, len(testCase.ids), len(locks))
for i := range testCase.ids {
require.Equal(t, testCase.ids[i], locks[i].id[:])
require.Equal(t, testCase.expEpochs[i], locks[i].expEpoch[:])
}
data, err := encodeLockWithExpEpochList(locks)
require.NoError(t, err)
require.Equal(t, rawLocks, data)
data, err = encodeLockWithExpEpochList(locks)
require.NoError(t, err)
require.Equal(t, rawLocks, data)
})
}
}