github.com/hernad/nomad@v1.6.112/drivers/shared/capabilities/set_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package capabilities 5 6 import ( 7 "testing" 8 9 "github.com/hernad/nomad/ci" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestSet_Empty(t *testing.T) { 14 ci.Parallel(t) 15 16 t.Run("nil", func(t *testing.T) { 17 result := New(nil).Empty() 18 require.True(t, result) 19 }) 20 21 t.Run("empty", func(t *testing.T) { 22 result := New([]string{}).Empty() 23 require.True(t, result) 24 }) 25 26 t.Run("full", func(t *testing.T) { 27 result := New([]string{"chown", "sys_time"}).Empty() 28 require.False(t, result) 29 }) 30 } 31 32 func TestSet_New(t *testing.T) { 33 ci.Parallel(t) 34 35 t.Run("duplicates", func(t *testing.T) { 36 result := New([]string{"chown", "sys_time", "chown"}) 37 require.Equal(t, "chown, sys_time", result.String()) 38 }) 39 40 t.Run("empty string", func(t *testing.T) { 41 result := New([]string{""}) 42 require.True(t, result.Empty()) 43 }) 44 45 t.Run("all", func(t *testing.T) { 46 result := New([]string{"all"}) 47 exp := len(Supported().Slice(false)) 48 require.Len(t, result.Slice(false), exp) 49 }) 50 } 51 52 func TestSet_Slice(t *testing.T) { 53 ci.Parallel(t) 54 55 exp := []string{"chown", "net_raw", "sys_time"} 56 57 t.Run("lower case", func(t *testing.T) { 58 s := New([]string{"net_raw", "chown", "sys_time"}) 59 require.Equal(t, exp, s.Slice(false)) 60 }) 61 62 t.Run("upper case", func(t *testing.T) { 63 s := New([]string{"NET_RAW", "CHOWN", "SYS_TIME"}) 64 require.Equal(t, exp, s.Slice(false)) 65 }) 66 67 t.Run("prefix", func(t *testing.T) { 68 s := New([]string{"CAP_net_raw", "sys_TIME", "cap_chown"}) 69 require.Equal(t, exp, s.Slice(false)) 70 }) 71 } 72 73 func TestSet_String(t *testing.T) { 74 ci.Parallel(t) 75 76 t.Run("empty", func(t *testing.T) { 77 result := New(nil).String() 78 require.Equal(t, "", result) 79 }) 80 81 t.Run("full", func(t *testing.T) { 82 exp := "chown, net_raw, sys_time" 83 in := []string{"net_raw", "CAP_CHOWN", "cap_sys_time"} 84 result := New(in).String() 85 require.Equal(t, exp, result) 86 }) 87 } 88 89 func TestSet_Add(t *testing.T) { 90 ci.Parallel(t) 91 92 t.Run("add one", func(t *testing.T) { 93 s := New([]string{"chown", "net_raw"}) 94 require.Equal(t, "chown, net_raw", s.String()) 95 96 s.Add("CAP_SYS_TIME") 97 require.Equal(t, "chown, net_raw, sys_time", s.String()) 98 99 s.Add("AF_NET") 100 require.Equal(t, "af_net, chown, net_raw, sys_time", s.String()) 101 }) 102 103 t.Run("add empty string", func(t *testing.T) { 104 s := New([]string{"chown"}) 105 s.Add("") 106 require.Equal(t, "chown", s.String()) 107 }) 108 109 t.Run("add all", func(t *testing.T) { 110 s := New([]string{"chown", "net_raw"}) 111 require.Equal(t, "chown, net_raw", s.String()) 112 113 exp := len(Supported().Slice(false)) 114 s.Add("all") 115 require.Len(t, s.Slice(false), exp) 116 }) 117 118 } 119 120 func TestSet_Remove(t *testing.T) { 121 ci.Parallel(t) 122 123 t.Run("remove one", func(t *testing.T) { 124 s := New([]string{"af_net", "chown", "net_raw", "seteuid", "sys_time"}) 125 s.Remove([]string{"CAP_NET_RAW"}) 126 require.Equal(t, "af_net, chown, seteuid, sys_time", s.String()) 127 }) 128 129 t.Run("remove couple", func(t *testing.T) { 130 s := New([]string{"af_net", "chown", "net_raw", "seteuid", "sys_time"}) 131 s.Remove([]string{"CAP_NET_RAW", "af_net"}) 132 require.Equal(t, "chown, seteuid, sys_time", s.String()) 133 }) 134 135 t.Run("remove all", func(t *testing.T) { 136 s := New([]string{"af_net", "chown", "net_raw", "seteuid", "sys_time"}) 137 s.Remove([]string{"all"}) 138 require.True(t, s.Empty()) 139 require.Equal(t, "", s.String()) 140 }) 141 } 142 143 func TestSet_Difference(t *testing.T) { 144 ci.Parallel(t) 145 146 t.Run("a is empty", func(t *testing.T) { 147 a := New(nil) 148 b := New([]string{"chown", "af_net"}) 149 result := a.Difference(b) 150 require.Equal(t, "af_net, chown", result.String()) 151 }) 152 153 t.Run("b is empty", func(t *testing.T) { 154 a := New([]string{"chown", "af_net"}) 155 b := New(nil) 156 result := a.Difference(b) 157 require.True(t, result.Empty()) 158 }) 159 160 t.Run("a diff b", func(t *testing.T) { 161 a := New([]string{"A", "b", "C", "d", "e", "f"}) 162 b := New([]string{"B", "x", "Y", "a"}) 163 result := a.Difference(b) 164 require.Equal(t, "x, y", result.String()) 165 }) 166 } 167 168 func TestSet_Intersect(t *testing.T) { 169 ci.Parallel(t) 170 171 t.Run("empty", func(t *testing.T) { 172 a := New(nil) 173 b := New([]string{"a", "b"}) 174 175 result := a.Intersect(b) 176 require.True(t, result.Empty()) 177 178 result2 := b.Intersect(a) 179 require.True(t, result2.Empty()) 180 }) 181 182 t.Run("intersect", func(t *testing.T) { 183 a := New([]string{"A", "b", "C", "d", "e", "f", "G"}) 184 b := New([]string{"Z", "B", "E", "f", "y"}) 185 186 result := a.Intersect(b) 187 require.Equal(t, "b, e, f", result.String()) 188 189 result2 := b.Intersect(a) 190 require.Equal(t, "b, e, f", result2.String()) 191 }) 192 } 193 194 func TestSet_Union(t *testing.T) { 195 ci.Parallel(t) 196 197 t.Run("empty", func(t *testing.T) { 198 a := New(nil) 199 b := New([]string{"a", "b"}) 200 201 result := a.Union(b) 202 require.Equal(t, "a, b", result.String()) 203 204 result2 := b.Union(a) 205 require.Equal(t, "a, b", result2.String()) 206 }) 207 208 t.Run("union", func(t *testing.T) { 209 a := New([]string{"A", "b", "C", "d", "e", "f", "G"}) 210 b := New([]string{"Z", "B", "E", "f", "y"}) 211 212 result := a.Union(b) 213 require.Equal(t, "a, b, c, d, e, f, g, y, z", result.String()) 214 215 result2 := b.Union(a) 216 require.Equal(t, "a, b, c, d, e, f, g, y, z", result2.String()) 217 }) 218 }