git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/container/acl/util_test.go (about)

     1  package acl
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestBits(t *testing.T) {
    11  	num := uint32(0b10110)
    12  
    13  	require.False(t, isBitSet(num, 0))
    14  	require.True(t, isBitSet(num, 1))
    15  	require.True(t, isBitSet(num, 2))
    16  	require.False(t, isBitSet(num, 3))
    17  	require.True(t, isBitSet(num, 4))
    18  	require.False(t, isBitSet(num, 5))
    19  
    20  	setBit(&num, 3)
    21  	require.EqualValues(t, 0b11110, num)
    22  
    23  	setBit(&num, 6)
    24  	require.EqualValues(t, 0b1011110, num)
    25  }
    26  
    27  func TestOpBits(t *testing.T) {
    28  	num := uint32(0b_1001_0101_1100_0011_0110_0111_1000_1111)
    29  
    30  	require.Panics(t, func() { isOpBitSet(num, opZero, 0) })
    31  	require.Panics(t, func() { isOpBitSet(num, opLast, 0) })
    32  
    33  	cpNum := num
    34  
    35  	require.Panics(t, func() { setOpBit(&num, opZero, 0) })
    36  	require.EqualValues(t, cpNum, num)
    37  	require.Panics(t, func() { setOpBit(&num, opLast, 0) })
    38  	require.EqualValues(t, cpNum, num)
    39  
    40  	for _, tc := range []struct {
    41  		op   Op
    42  		set  [4]bool   // is bit set (left-to-right)
    43  		bits [4]uint32 // result of setting i-th bit (left-to-right) to zero num
    44  	}{
    45  		{
    46  			op:  OpObjectHash,
    47  			set: [4]bool{false, true, false, true},
    48  			bits: [4]uint32{
    49  				0b_0000_1000_0000_0000_0000_0000_0000_0000,
    50  				0b_0000_0100_0000_0000_0000_0000_0000_0000,
    51  				0b_0000_0010_0000_0000_0000_0000_0000_0000,
    52  				0b_0000_0001_0000_0000_0000_0000_0000_0000,
    53  			},
    54  		},
    55  		{
    56  			op:  OpObjectRange,
    57  			set: [4]bool{true, true, false, false},
    58  			bits: [4]uint32{
    59  				0b_0000_0000_1000_0000_0000_0000_0000_0000,
    60  				0b_0000_0000_0100_0000_0000_0000_0000_0000,
    61  				0b_0000_0000_0010_0000_0000_0000_0000_0000,
    62  				0b_0000_0000_0001_0000_0000_0000_0000_0000,
    63  			},
    64  		},
    65  		{
    66  			op:  OpObjectSearch,
    67  			set: [4]bool{false, false, true, true},
    68  			bits: [4]uint32{
    69  				0b_0000_0000_0000_1000_0000_0000_0000_0000,
    70  				0b_0000_0000_0000_0100_0000_0000_0000_0000,
    71  				0b_0000_0000_0000_0010_0000_0000_0000_0000,
    72  				0b_0000_0000_0000_0001_0000_0000_0000_0000,
    73  			},
    74  		},
    75  		{
    76  			op:  OpObjectDelete,
    77  			set: [4]bool{false, true, true, false},
    78  			bits: [4]uint32{
    79  				0b_0000_0000_0000_0000_1000_0000_0000_0000,
    80  				0b_0000_0000_0000_0000_0100_0000_0000_0000,
    81  				0b_0000_0000_0000_0000_0010_0000_0000_0000,
    82  				0b_0000_0000_0000_0000_0001_0000_0000_0000,
    83  			},
    84  		},
    85  		{
    86  			op:  OpObjectPut,
    87  			set: [4]bool{false, true, true, true},
    88  			bits: [4]uint32{
    89  				0b_0000_0000_0000_0000_0000_1000_0000_0000,
    90  				0b_0000_0000_0000_0000_0000_0100_0000_0000,
    91  				0b_0000_0000_0000_0000_0000_0010_0000_0000,
    92  				0b_0000_0000_0000_0000_0000_0001_0000_0000,
    93  			},
    94  		},
    95  		{
    96  			op:  OpObjectHead,
    97  			set: [4]bool{true, false, false, false},
    98  			bits: [4]uint32{
    99  				0b_0000_0000_0000_0000_0000_0000_1000_0000,
   100  				0b_0000_0000_0000_0000_0000_0000_0100_0000,
   101  				0b_0000_0000_0000_0000_0000_0000_0010_0000,
   102  				0b_0000_0000_0000_0000_0000_0000_0001_0000,
   103  			},
   104  		},
   105  		{
   106  			op:  OpObjectGet,
   107  			set: [4]bool{true, true, true, true},
   108  			bits: [4]uint32{
   109  				0b_0000_0000_0000_0000_0000_0000_0000_1000,
   110  				0b_0000_0000_0000_0000_0000_0000_0000_0100,
   111  				0b_0000_0000_0000_0000_0000_0000_0000_0010,
   112  				0b_0000_0000_0000_0000_0000_0000_0000_0001,
   113  			},
   114  		},
   115  	} {
   116  		for i := range tc.set {
   117  			require.EqualValues(t, tc.set[i], isOpBitSet(num, tc.op, uint8(len(tc.set)-1-i)),
   118  				fmt.Sprintf("op %s, left bit #%d", tc.op, i),
   119  			)
   120  		}
   121  
   122  		for i := range tc.bits {
   123  			num := uint32(0)
   124  
   125  			setOpBit(&num, tc.op, uint8(len(tc.bits)-1-i))
   126  
   127  			require.EqualValues(t, tc.bits[i], num)
   128  		}
   129  	}
   130  }