cpuset_test.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. /*
  2. Copyright 2017 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package cpuset
  14. import (
  15. "reflect"
  16. "testing"
  17. )
  18. func TestCPUSetBuilder(t *testing.T) {
  19. b := NewBuilder()
  20. elems := []int{1, 2, 3, 4, 5}
  21. for _, elem := range elems {
  22. b.Add(elem)
  23. }
  24. result := b.Result()
  25. for _, elem := range elems {
  26. if !result.Contains(elem) {
  27. t.Fatalf("expected cpuset to contain element %d: [%v]", elem, result)
  28. }
  29. }
  30. if len(elems) != result.Size() {
  31. t.Fatalf("expected cpuset %s to have the same size as %v", result, elems)
  32. }
  33. }
  34. func TestCPUSetSize(t *testing.T) {
  35. testCases := []struct {
  36. cpuset CPUSet
  37. expected int
  38. }{
  39. {NewCPUSet(), 0},
  40. {NewCPUSet(5), 1},
  41. {NewCPUSet(1, 2, 3, 4, 5), 5},
  42. }
  43. for _, c := range testCases {
  44. actual := c.cpuset.Size()
  45. if actual != c.expected {
  46. t.Fatalf("expected: %d, actual: %d, cpuset: [%v]", c.expected, actual, c.cpuset)
  47. }
  48. }
  49. }
  50. func TestCPUSetIsEmpty(t *testing.T) {
  51. testCases := []struct {
  52. cpuset CPUSet
  53. expected bool
  54. }{
  55. {NewCPUSet(), true},
  56. {NewCPUSet(5), false},
  57. {NewCPUSet(1, 2, 3, 4, 5), false},
  58. }
  59. for _, c := range testCases {
  60. actual := c.cpuset.IsEmpty()
  61. if actual != c.expected {
  62. t.Fatalf("expected: %t, IsEmpty() returned: %t, cpuset: [%v]", c.expected, actual, c.cpuset)
  63. }
  64. }
  65. }
  66. func TestCPUSetContains(t *testing.T) {
  67. testCases := []struct {
  68. cpuset CPUSet
  69. mustContain []int
  70. mustNotContain []int
  71. }{
  72. {NewCPUSet(), []int{}, []int{1, 2, 3, 4, 5}},
  73. {NewCPUSet(5), []int{5}, []int{1, 2, 3, 4}},
  74. {NewCPUSet(1, 2, 4, 5), []int{1, 2, 4, 5}, []int{0, 3, 6}},
  75. }
  76. for _, c := range testCases {
  77. for _, elem := range c.mustContain {
  78. if !c.cpuset.Contains(elem) {
  79. t.Fatalf("expected cpuset to contain element %d: [%v]", elem, c.cpuset)
  80. }
  81. }
  82. for _, elem := range c.mustNotContain {
  83. if c.cpuset.Contains(elem) {
  84. t.Fatalf("expected cpuset not to contain element %d: [%v]", elem, c.cpuset)
  85. }
  86. }
  87. }
  88. }
  89. func TestCPUSetEqual(t *testing.T) {
  90. shouldEqual := []struct {
  91. s1 CPUSet
  92. s2 CPUSet
  93. }{
  94. {NewCPUSet(), NewCPUSet()},
  95. {NewCPUSet(5), NewCPUSet(5)},
  96. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  97. }
  98. shouldNotEqual := []struct {
  99. s1 CPUSet
  100. s2 CPUSet
  101. }{
  102. {NewCPUSet(), NewCPUSet(5)},
  103. {NewCPUSet(5), NewCPUSet()},
  104. {NewCPUSet(), NewCPUSet(1, 2, 3, 4, 5)},
  105. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet()},
  106. {NewCPUSet(5), NewCPUSet(1, 2, 3, 4, 5)},
  107. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(5)},
  108. }
  109. for _, c := range shouldEqual {
  110. if !c.s1.Equals(c.s2) {
  111. t.Fatalf("expected cpusets to be equal: s1: [%v], s2: [%v]", c.s1, c.s2)
  112. }
  113. }
  114. for _, c := range shouldNotEqual {
  115. if c.s1.Equals(c.s2) {
  116. t.Fatalf("expected cpusets to not be equal: s1: [%v], s2: [%v]", c.s1, c.s2)
  117. }
  118. }
  119. }
  120. func TestCPUSetIsSubsetOf(t *testing.T) {
  121. shouldBeSubset := []struct {
  122. s1 CPUSet
  123. s2 CPUSet
  124. }{
  125. // A set is a subset of itself
  126. {NewCPUSet(), NewCPUSet()},
  127. {NewCPUSet(5), NewCPUSet(5)},
  128. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  129. // Empty set is a subset of every set
  130. {NewCPUSet(), NewCPUSet(5)},
  131. {NewCPUSet(), NewCPUSet(1, 2, 3, 4, 5)},
  132. {NewCPUSet(5), NewCPUSet(1, 2, 3, 4, 5)},
  133. {NewCPUSet(1, 2, 3), NewCPUSet(1, 2, 3, 4, 5)},
  134. {NewCPUSet(4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  135. {NewCPUSet(2, 3), NewCPUSet(1, 2, 3, 4, 5)},
  136. }
  137. shouldNotBeSubset := []struct {
  138. s1 CPUSet
  139. s2 CPUSet
  140. }{}
  141. for _, c := range shouldBeSubset {
  142. if !c.s1.IsSubsetOf(c.s2) {
  143. t.Fatalf("expected s1 to be a subset of s2: s1: [%v], s2: [%v]", c.s1, c.s2)
  144. }
  145. }
  146. for _, c := range shouldNotBeSubset {
  147. if c.s1.IsSubsetOf(c.s2) {
  148. t.Fatalf("expected s1 to not be a subset of s2: s1: [%v], s2: [%v]", c.s1, c.s2)
  149. }
  150. }
  151. }
  152. func TestCPUSetUnionAll(t *testing.T) {
  153. testCases := []struct {
  154. s1 CPUSet
  155. s2 CPUSet
  156. s3 CPUSet
  157. expected CPUSet
  158. }{
  159. {NewCPUSet(), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  160. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(), NewCPUSet(4), NewCPUSet(1, 2, 3, 4, 5)},
  161. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 5), NewCPUSet(1, 2, 3, 4, 5)},
  162. }
  163. for _, c := range testCases {
  164. s := []CPUSet{}
  165. s = append(s, c.s2)
  166. s = append(s, c.s3)
  167. result := c.s1.UnionAll(s)
  168. if !result.Equals(c.expected) {
  169. t.Fatalf("expected the union of s1 and s2 to be [%v] (got [%v]), s1: [%v], s2: [%v]", c.expected, result, c.s1, c.s2)
  170. }
  171. }
  172. }
  173. func TestCPUSetUnion(t *testing.T) {
  174. testCases := []struct {
  175. s1 CPUSet
  176. s2 CPUSet
  177. expected CPUSet
  178. }{
  179. {NewCPUSet(), NewCPUSet(), NewCPUSet()},
  180. {NewCPUSet(), NewCPUSet(5), NewCPUSet(5)},
  181. {NewCPUSet(5), NewCPUSet(), NewCPUSet(5)},
  182. {NewCPUSet(5), NewCPUSet(5), NewCPUSet(5)},
  183. {NewCPUSet(), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  184. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(), NewCPUSet(1, 2, 3, 4, 5)},
  185. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  186. {NewCPUSet(5), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  187. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(5), NewCPUSet(1, 2, 3, 4, 5)},
  188. {NewCPUSet(1, 2), NewCPUSet(3, 4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  189. {NewCPUSet(1, 2, 3), NewCPUSet(3, 4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  190. }
  191. for _, c := range testCases {
  192. result := c.s1.Union(c.s2)
  193. if !result.Equals(c.expected) {
  194. t.Fatalf("expected the union of s1 and s2 to be [%v] (got [%v]), s1: [%v], s2: [%v]", c.expected, result, c.s1, c.s2)
  195. }
  196. }
  197. }
  198. func TestCPUSetIntersection(t *testing.T) {
  199. testCases := []struct {
  200. s1 CPUSet
  201. s2 CPUSet
  202. expected CPUSet
  203. }{
  204. {NewCPUSet(), NewCPUSet(), NewCPUSet()},
  205. {NewCPUSet(), NewCPUSet(5), NewCPUSet()},
  206. {NewCPUSet(5), NewCPUSet(), NewCPUSet()},
  207. {NewCPUSet(5), NewCPUSet(5), NewCPUSet(5)},
  208. {NewCPUSet(), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet()},
  209. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(), NewCPUSet()},
  210. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5)},
  211. {NewCPUSet(5), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(5)},
  212. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(5), NewCPUSet(5)},
  213. {NewCPUSet(1, 2), NewCPUSet(3, 4, 5), NewCPUSet()},
  214. {NewCPUSet(1, 2, 3), NewCPUSet(3, 4, 5), NewCPUSet(3)},
  215. }
  216. for _, c := range testCases {
  217. result := c.s1.Intersection(c.s2)
  218. if !result.Equals(c.expected) {
  219. t.Fatalf("expected the intersection of s1 and s2 to be [%v] (got [%v]), s1: [%v], s2: [%v]", c.expected, result, c.s1, c.s2)
  220. }
  221. }
  222. }
  223. func TestCPUSetDifference(t *testing.T) {
  224. testCases := []struct {
  225. s1 CPUSet
  226. s2 CPUSet
  227. expected CPUSet
  228. }{
  229. {NewCPUSet(), NewCPUSet(), NewCPUSet()},
  230. {NewCPUSet(), NewCPUSet(5), NewCPUSet()},
  231. {NewCPUSet(5), NewCPUSet(), NewCPUSet(5)},
  232. {NewCPUSet(5), NewCPUSet(5), NewCPUSet()},
  233. {NewCPUSet(), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet()},
  234. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(), NewCPUSet(1, 2, 3, 4, 5)},
  235. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet()},
  236. {NewCPUSet(5), NewCPUSet(1, 2, 3, 4, 5), NewCPUSet()},
  237. {NewCPUSet(1, 2, 3, 4, 5), NewCPUSet(5), NewCPUSet(1, 2, 3, 4)},
  238. {NewCPUSet(1, 2), NewCPUSet(3, 4, 5), NewCPUSet(1, 2)},
  239. {NewCPUSet(1, 2, 3), NewCPUSet(3, 4, 5), NewCPUSet(1, 2)},
  240. }
  241. for _, c := range testCases {
  242. result := c.s1.Difference(c.s2)
  243. if !result.Equals(c.expected) {
  244. t.Fatalf("expected the difference of s1 and s2 to be [%v] (got [%v]), s1: [%v], s2: [%v]", c.expected, result, c.s1, c.s2)
  245. }
  246. }
  247. }
  248. func TestCPUSetToSlice(t *testing.T) {
  249. testCases := []struct {
  250. set CPUSet
  251. expected []int
  252. }{
  253. {NewCPUSet(), []int{}},
  254. {NewCPUSet(5), []int{5}},
  255. {NewCPUSet(1, 2, 3, 4, 5), []int{1, 2, 3, 4, 5}},
  256. }
  257. for _, c := range testCases {
  258. result := c.set.ToSlice()
  259. if !reflect.DeepEqual(result, c.expected) {
  260. t.Fatalf("expected set as slice to be [%v] (got [%v]), s: [%v]", c.expected, result, c.set)
  261. }
  262. }
  263. }
  264. func TestCPUSetString(t *testing.T) {
  265. testCases := []struct {
  266. set CPUSet
  267. expected string
  268. }{
  269. {NewCPUSet(), ""},
  270. {NewCPUSet(5), "5"},
  271. {NewCPUSet(1, 2, 3, 4, 5), "1-5"},
  272. {NewCPUSet(1, 2, 3, 5, 6, 8), "1-3,5-6,8"},
  273. }
  274. for _, c := range testCases {
  275. result := c.set.String()
  276. if result != c.expected {
  277. t.Fatalf("expected set as string to be %s (got \"%s\"), s: [%v]", c.expected, result, c.set)
  278. }
  279. }
  280. }
  281. func TestParse(t *testing.T) {
  282. testCases := []struct {
  283. cpusetString string
  284. expected CPUSet
  285. }{
  286. {"", NewCPUSet()},
  287. {"5", NewCPUSet(5)},
  288. {"1,2,3,4,5", NewCPUSet(1, 2, 3, 4, 5)},
  289. {"1-5", NewCPUSet(1, 2, 3, 4, 5)},
  290. {"1-2,3-5", NewCPUSet(1, 2, 3, 4, 5)},
  291. }
  292. for _, c := range testCases {
  293. result, err := Parse(c.cpusetString)
  294. if err != nil {
  295. t.Fatalf("expected error not to have occurred: %v", err)
  296. }
  297. if !result.Equals(c.expected) {
  298. t.Fatalf("expected string \"%s\" to parse as [%v] (got [%v])", c.cpusetString, c.expected, result)
  299. }
  300. }
  301. }