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 }