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