github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/lib/cpuset/cpuset_test.go (about) 1 package cpuset 2 3 import ( 4 "testing" 5 6 "github.com/hashicorp/nomad/ci" 7 "github.com/stretchr/testify/require" 8 ) 9 10 func TestCPUSet_Size(t *testing.T) { 11 ci.Parallel(t) 12 13 set := New(0, 1, 2, 3) 14 require.Equal(t, 4, set.Size()) 15 require.Equal(t, 0, New().Size()) 16 } 17 18 func TestCPUSet_ToSlice(t *testing.T) { 19 ci.Parallel(t) 20 21 cases := []struct { 22 desc string 23 in CPUSet 24 out []uint16 25 }{ 26 { 27 "empty cpuset", 28 New(), 29 []uint16{}, 30 }, 31 { 32 "in order", 33 New(0, 1, 2, 3, 4, 5, 6, 7), 34 []uint16{0, 1, 2, 3, 4, 5, 6, 7}, 35 }, 36 { 37 "out of order", 38 New(3, 1, 2, 0), 39 []uint16{0, 1, 2, 3}, 40 }, 41 } 42 43 for _, c := range cases { 44 require.Exactly(t, c.out, c.in.ToSlice(), c.desc) 45 } 46 } 47 48 func TestCPUSet_Equal(t *testing.T) { 49 ci.Parallel(t) 50 51 cases := []struct { 52 a CPUSet 53 b CPUSet 54 shouldEqual bool 55 }{ 56 {New(), New(), true}, 57 {New(5), New(5), true}, 58 {New(1, 2, 3, 4, 5), New(1, 2, 3, 4, 5), true}, 59 60 {New(), New(5), false}, 61 {New(5), New(), false}, 62 {New(), New(1, 2, 3, 4, 5), false}, 63 {New(1, 2, 3, 4, 5), New(), false}, 64 {New(5), New(1, 2, 3, 4, 5), false}, 65 {New(1, 2, 3, 4, 5), New(5), false}, 66 } 67 68 for _, c := range cases { 69 require.Equal(t, c.shouldEqual, c.a.Equal(c.b)) 70 } 71 } 72 73 func TestCPUSet_Union(t *testing.T) { 74 ci.Parallel(t) 75 76 cases := []struct { 77 a CPUSet 78 b CPUSet 79 expected CPUSet 80 }{ 81 {New(), New(), New()}, 82 83 {New(), New(0), New(0)}, 84 {New(0), New(), New(0)}, 85 {New(0), New(0), New(0)}, 86 87 {New(), New(0, 1, 2, 3), New(0, 1, 2, 3)}, 88 {New(0, 1), New(0, 1, 2, 3), New(0, 1, 2, 3)}, 89 {New(2, 3), New(4, 5), New(2, 3, 4, 5)}, 90 {New(3, 4), New(0, 1, 2, 3), New(0, 1, 2, 3, 4)}, 91 } 92 93 for _, c := range cases { 94 require.Exactly(t, c.expected.ToSlice(), c.a.Union(c.b).ToSlice()) 95 } 96 } 97 98 func TestCPUSet_Difference(t *testing.T) { 99 ci.Parallel(t) 100 101 cases := []struct { 102 a CPUSet 103 b CPUSet 104 expected CPUSet 105 }{ 106 {New(), New(), New()}, 107 108 {New(), New(0), New()}, 109 {New(0), New(), New(0)}, 110 {New(0), New(0), New()}, 111 112 {New(0, 1), New(0, 1, 2, 3), New()}, 113 {New(2, 3), New(4, 5), New(2, 3)}, 114 {New(3, 4), New(0, 1, 2, 3), New(4)}, 115 } 116 117 for _, c := range cases { 118 require.Exactly(t, c.expected.ToSlice(), c.a.Difference(c.b).ToSlice()) 119 } 120 } 121 122 func TestCPUSet_IsSubsetOf(t *testing.T) { 123 ci.Parallel(t) 124 125 cases := []struct { 126 a CPUSet 127 b CPUSet 128 isSubset bool 129 }{ 130 {New(0), New(0), true}, 131 {New(), New(0), true}, 132 {New(0), New(), false}, 133 {New(1, 2), New(0, 1, 2, 3), true}, 134 {New(2, 1), New(0, 1, 2, 3), true}, 135 {New(3, 4), New(0, 1, 2, 3), false}, 136 } 137 138 for _, c := range cases { 139 require.Equal(t, c.isSubset, c.a.IsSubsetOf(c.b)) 140 } 141 } 142 143 func TestCPUSet_IsSupersetOf(t *testing.T) { 144 ci.Parallel(t) 145 146 cases := []struct { 147 a CPUSet 148 b CPUSet 149 isSuperset bool 150 }{ 151 {New(0), New(0), true}, 152 {New(0), New(), true}, 153 {New(), New(0), false}, 154 {New(0, 1, 2, 3), New(0), true}, 155 {New(0, 1, 2, 3), New(2, 3), true}, 156 {New(0, 1, 2, 3), New(2, 3, 4), false}, 157 } 158 159 for _, c := range cases { 160 require.Equal(t, c.isSuperset, c.a.IsSupersetOf(c.b)) 161 } 162 } 163 164 func TestCPUSet_ContainsAny(t *testing.T) { 165 ci.Parallel(t) 166 167 cases := []struct { 168 a CPUSet 169 b CPUSet 170 containsAny bool 171 }{ 172 {New(0), New(0), true}, 173 {New(0), New(), false}, 174 {New(), New(0), false}, 175 {New(0, 1, 2, 3), New(0), true}, 176 {New(0, 1, 2, 3), New(2, 3), true}, 177 {New(0, 1, 2, 3), New(2, 3, 4), true}, 178 } 179 180 for _, c := range cases { 181 require.Equal(t, c.containsAny, c.a.ContainsAny(c.b)) 182 } 183 } 184 185 func TestParse(t *testing.T) { 186 ci.Parallel(t) 187 188 cases := []struct { 189 cpuset string 190 expected CPUSet 191 }{ 192 {"", New()}, 193 {"\n", New()}, 194 {"1", New(1)}, 195 {"1\n", New(1)}, 196 {"0,1,2,3", New(0, 1, 2, 3)}, 197 {"0-3", New(0, 1, 2, 3)}, 198 {"0,2-3,5", New(0, 2, 3, 5)}, 199 } 200 201 for _, c := range cases { 202 result, err := Parse(c.cpuset) 203 require.NoError(t, err) 204 require.True(t, result.Equal(c.expected)) 205 } 206 } 207 208 func TestCPUSet_String(t *testing.T) { 209 ci.Parallel(t) 210 211 cases := []struct { 212 cpuset CPUSet 213 expected string 214 }{ 215 {New(), ""}, 216 {New(0, 1, 2, 3), "0-3"}, 217 {New(1, 3), "1,3"}, 218 {New(0, 2, 3, 5), "0,2-3,5"}, 219 } 220 221 for _, c := range cases { 222 require.Equal(t, c.expected, c.cpuset.String()) 223 } 224 } 225 226 func TestCPUSet_Copy(t *testing.T) { 227 ci.Parallel(t) 228 229 original := New(1, 2, 3, 4, 5) 230 copied := original.Copy() 231 require.True(t, original.Equal(copied)) 232 233 delete(copied.cpus, 3) 234 require.False(t, original.Equal(copied)) 235 require.True(t, original.Equal(New(1, 2, 3, 4, 5))) 236 require.True(t, copied.Equal(New(1, 2, 4, 5))) 237 }