git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/eacl/filter_test.go (about)

     1  package eacl
     2  
     3  import (
     4  	"strconv"
     5  	"testing"
     6  
     7  	v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func newObjectFilter(match Match, key, val string) *Filter {
    12  	return &Filter{
    13  		from: HeaderFromObject,
    14  		key: filterKey{
    15  			str: key,
    16  		},
    17  		matcher: match,
    18  		value:   staticStringer(val),
    19  	}
    20  }
    21  
    22  func TestFilter(t *testing.T) {
    23  	filter := newObjectFilter(MatchStringEqual, "some name", "200")
    24  
    25  	v2 := filter.ToV2()
    26  	require.NotNil(t, v2)
    27  	require.Equal(t, v2acl.HeaderTypeObject, v2.GetHeaderType())
    28  	require.EqualValues(t, v2acl.MatchTypeStringEqual, v2.GetMatchType())
    29  	require.Equal(t, filter.Key(), v2.GetKey())
    30  	require.Equal(t, filter.Value(), v2.GetValue())
    31  
    32  	newFilter := NewFilterFromV2(v2)
    33  	require.Equal(t, filter, newFilter)
    34  
    35  	t.Run("from nil v2 filter", func(t *testing.T) {
    36  		require.Equal(t, new(Filter), NewFilterFromV2(nil))
    37  	})
    38  }
    39  
    40  func TestFilterEncoding(t *testing.T) {
    41  	f := newObjectFilter(MatchStringEqual, "key", "value")
    42  
    43  	t.Run("binary", func(t *testing.T) {
    44  		data, err := f.Marshal()
    45  		require.NoError(t, err)
    46  
    47  		f2 := NewFilter()
    48  		require.NoError(t, f2.Unmarshal(data))
    49  
    50  		require.Equal(t, f, f2)
    51  	})
    52  
    53  	t.Run("json", func(t *testing.T) {
    54  		data, err := f.MarshalJSON()
    55  		require.NoError(t, err)
    56  
    57  		d2 := NewFilter()
    58  		require.NoError(t, d2.UnmarshalJSON(data))
    59  
    60  		require.Equal(t, f, d2)
    61  	})
    62  }
    63  
    64  func TestFilter_ToV2(t *testing.T) {
    65  	t.Run("nil", func(t *testing.T) {
    66  		var x *Filter
    67  
    68  		require.Nil(t, x.ToV2())
    69  	})
    70  
    71  	t.Run("default values", func(t *testing.T) {
    72  		filter := NewFilter()
    73  
    74  		// check initial values
    75  		require.Empty(t, filter.Key())
    76  		require.Empty(t, filter.Value())
    77  		require.Equal(t, HeaderTypeUnknown, filter.From())
    78  		require.Equal(t, MatchUnknown, filter.Matcher())
    79  
    80  		// convert to v2 message
    81  		filterV2 := filter.ToV2()
    82  
    83  		require.Empty(t, filterV2.GetKey())
    84  		require.Empty(t, filterV2.GetValue())
    85  		require.Equal(t, v2acl.HeaderTypeUnknown, filterV2.GetHeaderType())
    86  		require.Equal(t, v2acl.MatchTypeUnknown, filterV2.GetMatchType())
    87  	})
    88  
    89  	t.Run("reserved types", func(t *testing.T) {
    90  		r := NewRecord()
    91  		for i := filterKeyType(1); i < fKeyObjLast; i++ {
    92  			r.addObjectReservedFilter(MatchStringEqual, i, staticStringer(strconv.FormatUint(uint64(i), 16)))
    93  		}
    94  
    95  		for i := range r.filters {
    96  			fv2 := r.filters[i].ToV2()
    97  			actual := NewFilterFromV2(fv2)
    98  			require.Equal(t, actual, &r.filters[i])
    99  		}
   100  	})
   101  }