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

     1  package eacl_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
     7  	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  var (
    12  	eqV2Actions = map[eacl.Action]v2acl.Action{
    13  		eacl.ActionUnknown: v2acl.ActionUnknown,
    14  		eacl.ActionAllow:   v2acl.ActionAllow,
    15  		eacl.ActionDeny:    v2acl.ActionDeny,
    16  	}
    17  
    18  	eqV2Operations = map[eacl.Operation]v2acl.Operation{
    19  		eacl.OperationUnknown:   v2acl.OperationUnknown,
    20  		eacl.OperationGet:       v2acl.OperationGet,
    21  		eacl.OperationHead:      v2acl.OperationHead,
    22  		eacl.OperationPut:       v2acl.OperationPut,
    23  		eacl.OperationDelete:    v2acl.OperationDelete,
    24  		eacl.OperationSearch:    v2acl.OperationSearch,
    25  		eacl.OperationRange:     v2acl.OperationRange,
    26  		eacl.OperationRangeHash: v2acl.OperationRangeHash,
    27  	}
    28  
    29  	eqV2Roles = map[eacl.Role]v2acl.Role{
    30  		eacl.RoleUnknown: v2acl.RoleUnknown,
    31  		eacl.RoleUser:    v2acl.RoleUser,
    32  		eacl.RoleSystem:  v2acl.RoleSystem,
    33  		eacl.RoleOthers:  v2acl.RoleOthers,
    34  	}
    35  
    36  	eqV2Matches = map[eacl.Match]v2acl.MatchType{
    37  		eacl.MatchUnknown:        v2acl.MatchTypeUnknown,
    38  		eacl.MatchStringEqual:    v2acl.MatchTypeStringEqual,
    39  		eacl.MatchStringNotEqual: v2acl.MatchTypeStringNotEqual,
    40  	}
    41  
    42  	eqV2HeaderTypes = map[eacl.FilterHeaderType]v2acl.HeaderType{
    43  		eacl.HeaderTypeUnknown: v2acl.HeaderTypeUnknown,
    44  		eacl.HeaderFromRequest: v2acl.HeaderTypeRequest,
    45  		eacl.HeaderFromObject:  v2acl.HeaderTypeObject,
    46  		eacl.HeaderFromService: v2acl.HeaderTypeService,
    47  	}
    48  )
    49  
    50  func TestAction(t *testing.T) {
    51  	t.Run("known actions", func(t *testing.T) {
    52  		for i := eacl.ActionUnknown; i <= eacl.ActionDeny; i++ {
    53  			require.Equal(t, eqV2Actions[i], i.ToV2())
    54  			require.Equal(t, eacl.ActionFromV2(i.ToV2()), i)
    55  		}
    56  	})
    57  
    58  	t.Run("unknown actions", func(t *testing.T) {
    59  		require.Equal(t, (eacl.ActionDeny + 1).ToV2(), v2acl.ActionUnknown)
    60  		require.Equal(t, eacl.ActionFromV2(v2acl.ActionDeny+1), eacl.ActionUnknown)
    61  	})
    62  }
    63  
    64  func TestOperation(t *testing.T) {
    65  	t.Run("known operations", func(t *testing.T) {
    66  		for i := eacl.OperationUnknown; i <= eacl.OperationRangeHash; i++ {
    67  			require.Equal(t, eqV2Operations[i], i.ToV2())
    68  			require.Equal(t, eacl.OperationFromV2(i.ToV2()), i)
    69  		}
    70  	})
    71  
    72  	t.Run("unknown operations", func(t *testing.T) {
    73  		require.Equal(t, (eacl.OperationRangeHash + 1).ToV2(), v2acl.OperationUnknown)
    74  		require.Equal(t, eacl.OperationFromV2(v2acl.OperationRangeHash+1), eacl.OperationUnknown)
    75  	})
    76  }
    77  
    78  func TestRole(t *testing.T) {
    79  	t.Run("known roles", func(t *testing.T) {
    80  		for i := eacl.RoleUnknown; i <= eacl.RoleOthers; i++ {
    81  			require.Equal(t, eqV2Roles[i], i.ToV2())
    82  			require.Equal(t, eacl.RoleFromV2(i.ToV2()), i)
    83  		}
    84  	})
    85  
    86  	t.Run("unknown roles", func(t *testing.T) {
    87  		require.Equal(t, (eacl.RoleOthers + 1).ToV2(), v2acl.RoleUnknown)
    88  		require.Equal(t, eacl.RoleFromV2(v2acl.RoleOthers+1), eacl.RoleUnknown)
    89  	})
    90  }
    91  
    92  func TestMatch(t *testing.T) {
    93  	t.Run("known matches", func(t *testing.T) {
    94  		for i := eacl.MatchUnknown; i <= eacl.MatchStringNotEqual; i++ {
    95  			require.Equal(t, eqV2Matches[i], i.ToV2())
    96  			require.Equal(t, eacl.MatchFromV2(i.ToV2()), i)
    97  		}
    98  	})
    99  
   100  	t.Run("unknown matches", func(t *testing.T) {
   101  		require.Equal(t, (eacl.MatchStringNotEqual + 1).ToV2(), v2acl.MatchTypeUnknown)
   102  		require.Equal(t, eacl.MatchFromV2(v2acl.MatchTypeStringNotEqual+1), eacl.MatchUnknown)
   103  	})
   104  }
   105  
   106  func TestFilterHeaderType(t *testing.T) {
   107  	t.Run("known header types", func(t *testing.T) {
   108  		for i := eacl.HeaderTypeUnknown; i <= eacl.HeaderFromService; i++ {
   109  			require.Equal(t, eqV2HeaderTypes[i], i.ToV2())
   110  			require.Equal(t, eacl.FilterHeaderTypeFromV2(i.ToV2()), i)
   111  		}
   112  	})
   113  
   114  	t.Run("unknown header types", func(t *testing.T) {
   115  		require.Equal(t, (eacl.HeaderFromService + 1).ToV2(), v2acl.HeaderTypeUnknown)
   116  		require.Equal(t, eacl.FilterHeaderTypeFromV2(v2acl.HeaderTypeService+1), eacl.HeaderTypeUnknown)
   117  	})
   118  }
   119  
   120  type enumIface interface {
   121  	FromString(string) bool
   122  	String() string
   123  }
   124  
   125  type enumStringItem struct {
   126  	val enumIface
   127  	str string
   128  }
   129  
   130  func testEnumStrings(t *testing.T, e enumIface, items []enumStringItem) {
   131  	for _, item := range items {
   132  		require.Equal(t, item.str, item.val.String())
   133  
   134  		s := item.val.String()
   135  
   136  		require.True(t, e.FromString(s), s)
   137  
   138  		require.EqualValues(t, item.val, e, item.val)
   139  	}
   140  
   141  	// incorrect strings
   142  	for _, str := range []string{
   143  		"some string",
   144  		"UNSPECIFIED",
   145  	} {
   146  		require.False(t, e.FromString(str))
   147  	}
   148  }
   149  
   150  func TestAction_String(t *testing.T) {
   151  	toPtr := func(v eacl.Action) *eacl.Action {
   152  		return &v
   153  	}
   154  
   155  	testEnumStrings(t, new(eacl.Action), []enumStringItem{
   156  		{val: toPtr(eacl.ActionAllow), str: "ALLOW"},
   157  		{val: toPtr(eacl.ActionDeny), str: "DENY"},
   158  		{val: toPtr(eacl.ActionUnknown), str: "ACTION_UNSPECIFIED"},
   159  	})
   160  }
   161  
   162  func TestRole_String(t *testing.T) {
   163  	toPtr := func(v eacl.Role) *eacl.Role {
   164  		return &v
   165  	}
   166  
   167  	testEnumStrings(t, new(eacl.Role), []enumStringItem{
   168  		{val: toPtr(eacl.RoleUser), str: "USER"},
   169  		{val: toPtr(eacl.RoleSystem), str: "SYSTEM"},
   170  		{val: toPtr(eacl.RoleOthers), str: "OTHERS"},
   171  		{val: toPtr(eacl.RoleUnknown), str: "ROLE_UNSPECIFIED"},
   172  	})
   173  }
   174  
   175  func TestOperation_String(t *testing.T) {
   176  	toPtr := func(v eacl.Operation) *eacl.Operation {
   177  		return &v
   178  	}
   179  
   180  	testEnumStrings(t, new(eacl.Operation), []enumStringItem{
   181  		{val: toPtr(eacl.OperationGet), str: "GET"},
   182  		{val: toPtr(eacl.OperationPut), str: "PUT"},
   183  		{val: toPtr(eacl.OperationHead), str: "HEAD"},
   184  		{val: toPtr(eacl.OperationDelete), str: "DELETE"},
   185  		{val: toPtr(eacl.OperationSearch), str: "SEARCH"},
   186  		{val: toPtr(eacl.OperationRange), str: "GETRANGE"},
   187  		{val: toPtr(eacl.OperationRangeHash), str: "GETRANGEHASH"},
   188  		{val: toPtr(eacl.OperationUnknown), str: "OPERATION_UNSPECIFIED"},
   189  	})
   190  }
   191  
   192  func TestMatch_String(t *testing.T) {
   193  	toPtr := func(v eacl.Match) *eacl.Match {
   194  		return &v
   195  	}
   196  
   197  	testEnumStrings(t, new(eacl.Match), []enumStringItem{
   198  		{val: toPtr(eacl.MatchStringEqual), str: "STRING_EQUAL"},
   199  		{val: toPtr(eacl.MatchStringNotEqual), str: "STRING_NOT_EQUAL"},
   200  		{val: toPtr(eacl.MatchUnknown), str: "MATCH_TYPE_UNSPECIFIED"},
   201  	})
   202  }
   203  
   204  func TestFilterHeaderType_String(t *testing.T) {
   205  	toPtr := func(v eacl.FilterHeaderType) *eacl.FilterHeaderType {
   206  		return &v
   207  	}
   208  
   209  	testEnumStrings(t, new(eacl.FilterHeaderType), []enumStringItem{
   210  		{val: toPtr(eacl.HeaderFromRequest), str: "REQUEST"},
   211  		{val: toPtr(eacl.HeaderFromObject), str: "OBJECT"},
   212  		{val: toPtr(eacl.HeaderTypeUnknown), str: "HEADER_UNSPECIFIED"},
   213  	})
   214  }