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 }