github.com/cilium/cilium@v1.16.2/pkg/labels/arraylist_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package labels 5 6 import ( 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestLabelArrayListEquals(t *testing.T) { 13 list1 := LabelArrayList{ 14 { 15 NewLabel("env", "devel", LabelSourceAny), 16 NewLabel("user", "bob", LabelSourceContainer), 17 }, 18 { 19 NewLabel("foo", "bar", LabelSourceAny), 20 }, 21 } 22 list2 := LabelArrayList{ 23 { 24 NewLabel("env", "devel", LabelSourceAny), 25 NewLabel("user", "bob", LabelSourceContainer), 26 }, 27 { 28 NewLabel("foo", "bar", LabelSourceAny), 29 }, 30 } 31 list3 := LabelArrayList{ 32 { 33 NewLabel("foo", "bar", LabelSourceAny), 34 }, 35 { 36 NewLabel("env", "devel", LabelSourceAny), 37 NewLabel("user", "bob", LabelSourceContainer), 38 }, 39 } 40 list4 := LabelArrayList{ 41 { 42 NewLabel("env", "devel", LabelSourceAny), 43 NewLabel("user", "bob", LabelSourceContainer), 44 }, 45 } 46 list5 := LabelArrayList(nil) 47 list6 := LabelArrayList{} 48 49 require.Equal(t, true, list1.Equals(list1)) 50 require.Equal(t, true, list1.Equals(list2)) 51 require.Equal(t, false, list1.Equals(list3)) 52 require.Equal(t, false, list1.Equals(list4)) 53 require.Equal(t, false, list1.Equals(list5)) 54 require.Equal(t, false, list1.Equals(list6)) 55 56 require.Equal(t, true, list2.Equals(list1)) 57 require.Equal(t, true, list2.Equals(list2)) 58 require.Equal(t, false, list2.Equals(list3)) 59 require.Equal(t, false, list2.Equals(list4)) 60 require.Equal(t, false, list2.Equals(list5)) 61 require.Equal(t, false, list2.Equals(list6)) 62 63 require.Equal(t, false, list3.Equals(list1)) 64 require.Equal(t, false, list3.Equals(list2)) 65 require.Equal(t, true, list3.Equals(list3)) 66 require.Equal(t, false, list3.Equals(list4)) 67 require.Equal(t, false, list3.Equals(list5)) 68 require.Equal(t, false, list3.Equals(list6)) 69 70 require.Equal(t, false, list4.Equals(list1)) 71 require.Equal(t, false, list4.Equals(list2)) 72 require.Equal(t, false, list4.Equals(list3)) 73 require.Equal(t, true, list4.Equals(list4)) 74 require.Equal(t, false, list4.Equals(list5)) 75 require.Equal(t, false, list4.Equals(list6)) 76 77 require.Equal(t, false, list5.Equals(list1)) 78 require.Equal(t, false, list5.Equals(list2)) 79 require.Equal(t, false, list5.Equals(list3)) 80 require.Equal(t, false, list5.Equals(list4)) 81 require.Equal(t, true, list5.Equals(list5)) 82 require.Equal(t, true, list5.Equals(list6)) 83 84 require.Equal(t, false, list6.Equals(list1)) 85 require.Equal(t, false, list6.Equals(list2)) 86 require.Equal(t, false, list6.Equals(list3)) 87 require.Equal(t, false, list6.Equals(list4)) 88 require.Equal(t, true, list6.Equals(list5)) 89 require.Equal(t, true, list6.Equals(list6)) 90 } 91 92 func TestLabelArrayListSort(t *testing.T) { 93 require.EqualValues(t, LabelArrayList(nil), LabelArrayList(nil).Sort()) 94 require.EqualValues(t, LabelArrayList{}, LabelArrayList{}.Sort()) 95 96 list1 := LabelArrayList{ 97 { 98 NewLabel("env", "devel", LabelSourceAny), 99 NewLabel("user", "bob", LabelSourceContainer), 100 }, 101 { 102 NewLabel("aaa", "", LabelSourceReserved), 103 }, 104 { 105 NewLabel("env", "devel", LabelSourceAny), 106 NewLabel("user", "bob", LabelSourceContainer), 107 NewLabel("xyz", "", LabelSourceAny), 108 }, 109 { 110 NewLabel("env", "devel", LabelSourceAny), 111 }, 112 nil, 113 { 114 NewLabel("foo", "bar", LabelSourceAny), 115 }, 116 } 117 expected1 := LabelArrayList{ 118 nil, 119 { 120 NewLabel("aaa", "", LabelSourceReserved), 121 }, 122 { 123 NewLabel("env", "devel", LabelSourceAny), 124 }, 125 { 126 NewLabel("env", "devel", LabelSourceAny), 127 NewLabel("user", "bob", LabelSourceContainer), 128 }, 129 { 130 NewLabel("env", "devel", LabelSourceAny), 131 NewLabel("user", "bob", LabelSourceContainer), 132 NewLabel("xyz", "", LabelSourceAny), 133 }, 134 { 135 NewLabel("foo", "bar", LabelSourceAny), 136 }, 137 } 138 139 require.EqualValues(t, expected1, list1.Sort()) 140 141 list2 := LabelArrayList{ 142 { 143 NewLabel("aaa", "", LabelSourceReserved), 144 }, 145 { 146 NewLabel("env", "devel", LabelSourceAny), 147 }, 148 { 149 NewLabel("aaa", "", LabelSourceAny), 150 }, 151 } 152 expected2 := LabelArrayList{ 153 { 154 NewLabel("aaa", "", LabelSourceAny), 155 }, 156 { 157 NewLabel("aaa", "", LabelSourceReserved), 158 }, 159 { 160 NewLabel("env", "devel", LabelSourceAny), 161 }, 162 } 163 require.EqualValues(t, expected2, list2.Sort()) 164 } 165 166 func TestLabelArrayListMergeSorted(t *testing.T) { 167 list1 := LabelArrayList{ 168 { 169 NewLabel("env", "devel", LabelSourceAny), 170 NewLabel("user", "bob", LabelSourceContainer), 171 }, 172 { 173 NewLabel("foo", "bar", LabelSourceAny), 174 }, 175 } 176 list2 := LabelArrayList{ 177 { 178 NewLabel("env", "devel", LabelSourceAny), 179 NewLabel("user", "bob", LabelSourceContainer), 180 }, 181 { 182 NewLabel("foo", "bar", LabelSourceAny), 183 }, 184 } 185 list3 := LabelArrayList{ 186 { 187 NewLabel("foo", "bar", LabelSourceAny), 188 }, 189 { 190 NewLabel("env", "devel", LabelSourceAny), 191 NewLabel("user", "bob", LabelSourceContainer), 192 }, 193 } 194 list4 := LabelArrayList{ 195 { 196 NewLabel("env", "devel", LabelSourceAny), 197 NewLabel("user", "bob", LabelSourceContainer), 198 }, 199 } 200 list5 := LabelArrayList(nil) 201 list6 := LabelArrayList{} 202 list7 := LabelArrayList{ 203 { 204 NewLabel("env", "prod", LabelSourceAny), 205 NewLabel("user", "alice", LabelSourceContainer), 206 }, 207 } 208 209 expected1 := LabelArrayList{ 210 { 211 NewLabel("env", "devel", LabelSourceAny), 212 NewLabel("user", "bob", LabelSourceContainer), 213 }, 214 { 215 NewLabel("foo", "bar", LabelSourceAny), 216 }, 217 } 218 219 cases := []struct { 220 name string 221 a, b LabelArrayList 222 expected LabelArrayList 223 }{ 224 {name: "same list", a: list1, b: list1, expected: expected1}, 225 {name: "equal lists", a: list1, b: list2, expected: expected1}, 226 {name: "unsorted equal lists", a: list1, b: list3, expected: expected1}, 227 {name: "list b contained in list a", a: list1, b: list4, expected: expected1}, 228 {name: "list a contained in list b", a: list4, b: list1, expected: expected1}, 229 {name: "nil label arrays", a: list1, b: list5, expected: list1}, 230 {name: "empty label array lists", a: list1, b: list6, expected: list1}, 231 {name: "two different lists", a: list1, b: list7, expected: LabelArrayList{ 232 { 233 NewLabel("env", "devel", LabelSourceAny), 234 NewLabel("user", "bob", LabelSourceContainer), 235 }, 236 { 237 NewLabel("env", "prod", LabelSourceAny), 238 NewLabel("user", "alice", LabelSourceContainer), 239 }, 240 { 241 NewLabel("foo", "bar", LabelSourceAny), 242 }, 243 }}, 244 } 245 246 for _, tc := range cases { 247 // Copy to avoid polluting lists for the next cases. 248 a := tc.a.DeepCopy() 249 b := tc.b.DeepCopy() 250 a.Merge(b...) 251 require.EqualValues(t, tc.expected, a, tc.name) 252 require.EqualValues(t, a.Sort(), a, tc.name+" returned unsorted result") 253 254 a = tc.a.DeepCopy().Sort() 255 b = tc.b.DeepCopy().Sort() 256 a.MergeSorted(b) 257 require.EqualValues(t, tc.expected, a, tc.name+" MergeSorted") 258 require.EqualValues(t, a.Sort(), a, tc.name+" MergeSorted returned unsorted result") 259 } 260 }