git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/client/status/v2_test.go (about) 1 package apistatus_test 2 3 import ( 4 "errors" 5 "testing" 6 7 apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status" 8 "github.com/stretchr/testify/require" 9 ) 10 11 func TestToStatusV2(t *testing.T) { 12 type statusConstructor func() apistatus.Status 13 14 for _, testItem := range [...]struct { 15 status any // Status or statusConstructor 16 codeV2 uint64 17 messageV2 string 18 }{ 19 { 20 status: errors.New("some error"), 21 codeV2: 1024, 22 messageV2: "some error", 23 }, 24 { 25 status: 1, 26 codeV2: 0, 27 }, 28 { 29 status: "text", 30 codeV2: 0, 31 }, 32 { 33 status: true, 34 codeV2: 0, 35 }, 36 { 37 status: true, 38 codeV2: 0, 39 }, 40 { 41 status: nil, 42 codeV2: 0, 43 }, 44 { 45 status: (statusConstructor)(func() apistatus.Status { 46 var st apistatus.ServerInternal 47 48 st.SetMessage("internal error message") 49 50 return st 51 }), 52 codeV2: 1024, 53 }, 54 { 55 status: (statusConstructor)(func() apistatus.Status { 56 var st apistatus.WrongMagicNumber 57 58 st.WriteCorrectMagic(322) 59 60 return st 61 }), 62 codeV2: 1025, 63 }, 64 { 65 status: (statusConstructor)(func() apistatus.Status { 66 return new(apistatus.SignatureVerification) 67 }), 68 codeV2: 1026, 69 }, 70 { 71 status: (statusConstructor)(func() apistatus.Status { 72 return new(apistatus.NodeUnderMaintenance) 73 }), 74 codeV2: 1027, 75 }, 76 { 77 status: (statusConstructor)(func() apistatus.Status { 78 return new(apistatus.InvalidArgument) 79 }), 80 codeV2: 1028, 81 }, 82 { 83 status: (statusConstructor)(func() apistatus.Status { 84 return new(apistatus.ObjectLocked) 85 }), 86 codeV2: 2050, 87 }, 88 { 89 status: (statusConstructor)(func() apistatus.Status { 90 return new(apistatus.LockNonRegularObject) 91 }), 92 codeV2: 2051, 93 }, 94 { 95 status: (statusConstructor)(func() apistatus.Status { 96 var st apistatus.ObjectAccessDenied 97 98 st.WriteReason("any reason") 99 100 return st 101 }), 102 codeV2: 2048, 103 }, 104 { 105 status: (statusConstructor)(func() apistatus.Status { 106 return new(apistatus.ObjectNotFound) 107 }), 108 codeV2: 2049, 109 }, 110 { 111 status: (statusConstructor)(func() apistatus.Status { 112 return new(apistatus.ObjectAlreadyRemoved) 113 }), 114 codeV2: 2052, 115 }, 116 { 117 status: (statusConstructor)(func() apistatus.Status { 118 return new(apistatus.ObjectOutOfRange) 119 }), 120 codeV2: 2053, 121 }, 122 { 123 status: (statusConstructor)(func() apistatus.Status { 124 return new(apistatus.ContainerNotFound) 125 }), 126 codeV2: 3072, 127 }, 128 { 129 status: (statusConstructor)(func() apistatus.Status { 130 return new(apistatus.EACLNotFound) 131 }), 132 codeV2: 3073, 133 }, 134 { 135 status: (statusConstructor)(func() apistatus.Status { 136 return new(apistatus.SessionTokenNotFound) 137 }), 138 codeV2: 4096, 139 }, 140 { 141 status: (statusConstructor)(func() apistatus.Status { 142 return new(apistatus.SessionTokenExpired) 143 }), 144 codeV2: 4097, 145 }, 146 { 147 status: (statusConstructor)(func() apistatus.Status { 148 return new(apistatus.APEManagerAccessDenied) 149 }), 150 codeV2: 5120, 151 }, 152 } { 153 var st apistatus.Status 154 155 if cons, ok := testItem.status.(statusConstructor); ok { 156 st = cons() 157 } else { 158 st = testItem.status 159 } 160 161 stv2 := apistatus.ToStatusV2(st) 162 163 // must generate the same status.Status message 164 require.EqualValues(t, testItem.codeV2, stv2.Code()) 165 if len(testItem.messageV2) > 0 { 166 require.Equal(t, testItem.messageV2, stv2.Message()) 167 } 168 169 _, ok := st.(apistatus.StatusV2) 170 if ok { 171 // restore and convert again 172 restored := apistatus.FromStatusV2(stv2) 173 174 res := apistatus.ToStatusV2(restored) 175 176 // must generate the same status.Status message 177 require.Equal(t, stv2, res) 178 } 179 } 180 } 181 182 func TestFromStatusV2(t *testing.T) { 183 type statusConstructor func() apistatus.Status 184 185 for _, testItem := range [...]struct { 186 status any // Status or statusConstructor 187 codeV2 uint64 188 messageV2 string 189 }{ 190 { 191 status: errors.New("some error"), 192 codeV2: 1024, 193 messageV2: "some error", 194 }, 195 { 196 status: 1, 197 codeV2: 0, 198 }, 199 { 200 status: "text", 201 codeV2: 0, 202 }, 203 { 204 status: true, 205 codeV2: 0, 206 }, 207 { 208 status: true, 209 codeV2: 0, 210 }, 211 { 212 status: nil, 213 codeV2: 0, 214 }, 215 { 216 status: (statusConstructor)(func() apistatus.Status { 217 var st apistatus.ServerInternal 218 219 st.SetMessage("internal error message") 220 221 return st 222 }), 223 codeV2: 1024, 224 }, 225 { 226 status: (statusConstructor)(func() apistatus.Status { 227 var st apistatus.WrongMagicNumber 228 229 st.WriteCorrectMagic(322) 230 231 return st 232 }), 233 codeV2: 1025, 234 }, 235 { 236 status: (statusConstructor)(func() apistatus.Status { 237 return new(apistatus.ObjectLocked) 238 }), 239 codeV2: 2050, 240 }, 241 { 242 status: (statusConstructor)(func() apistatus.Status { 243 return new(apistatus.LockNonRegularObject) 244 }), 245 codeV2: 2051, 246 }, 247 { 248 status: (statusConstructor)(func() apistatus.Status { 249 var st apistatus.ObjectAccessDenied 250 251 st.WriteReason("any reason") 252 253 return st 254 }), 255 codeV2: 2048, 256 }, 257 { 258 status: (statusConstructor)(func() apistatus.Status { 259 return new(apistatus.ObjectNotFound) 260 }), 261 codeV2: 2049, 262 }, 263 { 264 status: (statusConstructor)(func() apistatus.Status { 265 return new(apistatus.ObjectAlreadyRemoved) 266 }), 267 codeV2: 2052, 268 }, 269 { 270 status: statusConstructor(func() apistatus.Status { 271 return new(apistatus.ObjectOutOfRange) 272 }), 273 codeV2: 2053, 274 }, 275 { 276 status: (statusConstructor)(func() apistatus.Status { 277 return new(apistatus.ContainerNotFound) 278 }), 279 codeV2: 3072, 280 }, 281 { 282 status: (statusConstructor)(func() apistatus.Status { 283 return new(apistatus.EACLNotFound) 284 }), 285 codeV2: 3073, 286 }, 287 { 288 status: (statusConstructor)(func() apistatus.Status { 289 return new(apistatus.SessionTokenNotFound) 290 }), 291 codeV2: 4096, 292 }, 293 { 294 status: (statusConstructor)(func() apistatus.Status { 295 return new(apistatus.SessionTokenExpired) 296 }), 297 codeV2: 4097, 298 }, 299 { 300 status: (statusConstructor)(func() apistatus.Status { 301 return new(apistatus.APEManagerAccessDenied) 302 }), 303 codeV2: 5120, 304 }, 305 { 306 status: (statusConstructor)(func() apistatus.Status { 307 return new(apistatus.NodeUnderMaintenance) 308 }), 309 codeV2: 1027, 310 }, 311 } { 312 var st apistatus.Status 313 314 if cons, ok := testItem.status.(statusConstructor); ok { 315 st = cons() 316 } else { 317 st = testItem.status 318 } 319 320 stv2 := apistatus.ToStatusV2(st) 321 322 // must generate the same status.Status message 323 require.EqualValues(t, testItem.codeV2, stv2.Code()) 324 if len(testItem.messageV2) > 0 { 325 require.Equal(t, testItem.messageV2, stv2.Message()) 326 } 327 328 _, ok := st.(apistatus.StatusV2) 329 if ok { 330 // restore and convert again 331 restored := apistatus.FromStatusV2(stv2) 332 333 res := apistatus.ToStatusV2(restored) 334 335 // must generate the same status.Status message 336 require.Equal(t, stv2, res) 337 } 338 } 339 }