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  }