Add stable marshal of header filter in acl package

Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
Alex Vanin 2020-08-17 16:02:24 +03:00 committed by Stanislav Bogatyrev
parent e5faf622df
commit 5623ce0124
2 changed files with 122 additions and 0 deletions

92
v2/acl/marshal.go Normal file
View file

@ -0,0 +1,92 @@
package acl
import (
"github.com/nspcc-dev/neofs-api-go/util/proto"
)
const (
FilterHeaderTypeField = 1
FilterMatchTypeField = 2
FilterNameField = 3
FilterValueField = 4
)
func (t *Table) StableMarshal(buf []byte) ([]byte, error) {
panic("not implemented")
}
func (t *Table) StableSize() int {
panic("not implemented")
}
func (r *Record) StableMarshal(buf []byte) ([]byte, error) {
panic("not implemented")
}
func (r *Record) StableSize() int {
panic("not implemented")
}
func (f *HeaderFilter) StableMarshal(buf []byte) ([]byte, error) {
if f == nil {
return []byte{}, nil
}
if buf == nil {
buf = make([]byte, f.StableSize())
}
var (
offset, n int
err error
)
n, err = proto.EnumMarshal(FilterHeaderTypeField, buf, int32(f.hdrType))
if err != nil {
return nil, err
}
offset += n
n, err = proto.EnumMarshal(FilterMatchTypeField, buf[offset:], int32(f.matchType))
if err != nil {
return nil, err
}
offset += n
n, err = proto.StringMarshal(FilterNameField, buf[offset:], f.name)
if err != nil {
return nil, err
}
offset += n
n, err = proto.StringMarshal(FilterValueField, buf[offset:], f.value)
if err != nil {
return nil, err
}
return buf, nil
}
func (f *HeaderFilter) StableSize() (size int) {
if f == nil {
return 0
}
size += proto.EnumSize(FilterHeaderTypeField, int32(f.hdrType))
size += proto.EnumSize(FilterMatchTypeField, int32(f.matchType))
size += proto.StringSize(FilterNameField, f.name)
size += proto.StringSize(FilterValueField, f.value)
return size
}
func (t *HeaderType) StableMarshal(buf []byte) ([]byte, error) {
panic("not implemented")
}
func (t *HeaderType) StableSize() int {
panic("not implemented")
}

30
v2/acl/marshal_test.go Normal file
View file

@ -0,0 +1,30 @@
package acl_test
import (
"testing"
"github.com/nspcc-dev/neofs-api-go/v2/acl"
grpc "github.com/nspcc-dev/neofs-api-go/v2/acl/grpc"
"github.com/stretchr/testify/require"
)
func TestHeaderFilter_StableMarshal(t *testing.T) {
filterFrom := new(acl.HeaderFilter)
transport := new(grpc.EACLRecord_FilterInfo)
t.Run("non empty", func(t *testing.T) {
filterFrom.SetHeaderType(acl.HeaderTypeObject)
filterFrom.SetMatchType(acl.MatchTypeStringEqual)
filterFrom.SetName("Hello")
filterFrom.SetValue("World")
wire, err := filterFrom.StableMarshal(nil)
require.NoError(t, err)
err = transport.Unmarshal(wire)
require.NoError(t, err)
filterTo := acl.HeaderFilterFromGRPCMessage(transport)
require.Equal(t, filterFrom, filterTo)
})
}