github.com/koderover/helm@v2.17.0+incompatible/pkg/tiller/kind_sorter_test.go (about) 1 /* 2 Copyright The Helm Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package tiller 18 19 import ( 20 "bytes" 21 "testing" 22 23 util "k8s.io/helm/pkg/releaseutil" 24 ) 25 26 func TestKindSorter(t *testing.T) { 27 manifests := []Manifest{ 28 { 29 Name: "i", 30 Head: &util.SimpleHead{Kind: "ClusterRole"}, 31 }, 32 { 33 Name: "I", 34 Head: &util.SimpleHead{Kind: "ClusterRoleList"}, 35 }, 36 { 37 Name: "j", 38 Head: &util.SimpleHead{Kind: "ClusterRoleBinding"}, 39 }, 40 { 41 Name: "J", 42 Head: &util.SimpleHead{Kind: "ClusterRoleBindingList"}, 43 }, 44 { 45 Name: "e", 46 Head: &util.SimpleHead{Kind: "ConfigMap"}, 47 }, 48 { 49 Name: "u", 50 Head: &util.SimpleHead{Kind: "CronJob"}, 51 }, 52 { 53 Name: "2", 54 Head: &util.SimpleHead{Kind: "CustomResourceDefinition"}, 55 }, 56 { 57 Name: "n", 58 Head: &util.SimpleHead{Kind: "DaemonSet"}, 59 }, 60 { 61 Name: "r", 62 Head: &util.SimpleHead{Kind: "Deployment"}, 63 }, 64 { 65 Name: "!", 66 Head: &util.SimpleHead{Kind: "HonkyTonkSet"}, 67 }, 68 { 69 Name: "v", 70 Head: &util.SimpleHead{Kind: "Ingress"}, 71 }, 72 { 73 Name: "t", 74 Head: &util.SimpleHead{Kind: "Job"}, 75 }, 76 { 77 Name: "c", 78 Head: &util.SimpleHead{Kind: "LimitRange"}, 79 }, 80 { 81 Name: "a", 82 Head: &util.SimpleHead{Kind: "Namespace"}, 83 }, 84 { 85 Name: "f", 86 Head: &util.SimpleHead{Kind: "PersistentVolume"}, 87 }, 88 { 89 Name: "g", 90 Head: &util.SimpleHead{Kind: "PersistentVolumeClaim"}, 91 }, 92 { 93 Name: "o", 94 Head: &util.SimpleHead{Kind: "Pod"}, 95 }, 96 { 97 Name: "3", 98 Head: &util.SimpleHead{Kind: "PodSecurityPolicy"}, 99 }, 100 { 101 Name: "q", 102 Head: &util.SimpleHead{Kind: "ReplicaSet"}, 103 }, 104 { 105 Name: "p", 106 Head: &util.SimpleHead{Kind: "ReplicationController"}, 107 }, 108 { 109 Name: "b", 110 Head: &util.SimpleHead{Kind: "ResourceQuota"}, 111 }, 112 { 113 Name: "k", 114 Head: &util.SimpleHead{Kind: "Role"}, 115 }, 116 { 117 Name: "K", 118 Head: &util.SimpleHead{Kind: "RoleList"}, 119 }, 120 { 121 Name: "l", 122 Head: &util.SimpleHead{Kind: "RoleBinding"}, 123 }, 124 { 125 Name: "L", 126 Head: &util.SimpleHead{Kind: "RoleBindingList"}, 127 }, 128 { 129 Name: "d", 130 Head: &util.SimpleHead{Kind: "Secret"}, 131 }, 132 { 133 Name: "m", 134 Head: &util.SimpleHead{Kind: "Service"}, 135 }, 136 { 137 Name: "h", 138 Head: &util.SimpleHead{Kind: "ServiceAccount"}, 139 }, 140 { 141 Name: "s", 142 Head: &util.SimpleHead{Kind: "StatefulSet"}, 143 }, 144 { 145 Name: "1", 146 Head: &util.SimpleHead{Kind: "StorageClass"}, 147 }, 148 { 149 Name: "w", 150 Head: &util.SimpleHead{Kind: "APIService"}, 151 }, 152 { 153 Name: "z", 154 Head: &util.SimpleHead{Kind: "PodDisruptionBudget"}, 155 }, 156 { 157 Name: "x", 158 Head: &util.SimpleHead{Kind: "HorizontalPodAutoscaler"}, 159 }, 160 { 161 Name: "B", 162 Head: &util.SimpleHead{Kind: "NetworkPolicy"}, 163 }, 164 } 165 166 for _, test := range []struct { 167 description string 168 order SortOrder 169 expected string 170 }{ 171 {"install", InstallOrder, "aBbc3zde1fgh2iIjJkKlLmnopqrxstuvw!"}, 172 {"uninstall", UninstallOrder, "wvmutsxrqponLlKkJjIi2hgf1edz3cbBa!"}, 173 } { 174 var buf bytes.Buffer 175 t.Run(test.description, func(t *testing.T) { 176 if got, want := len(test.expected), len(manifests); got != want { 177 t.Fatalf("Expected %d names in order, got %d", want, got) 178 } 179 defer buf.Reset() 180 for _, r := range sortByKind(manifests, test.order) { 181 buf.WriteString(r.Name) 182 } 183 if got := buf.String(); got != test.expected { 184 t.Errorf("Expected %q, got %q", test.expected, got) 185 } 186 }) 187 } 188 } 189 190 // TestKindSorterSubSort verifies manifests of same kind are also sorted alphanumeric 191 func TestKindSorterSubSort(t *testing.T) { 192 manifests := []Manifest{ 193 { 194 Name: "a", 195 Head: &util.SimpleHead{Kind: "ClusterRole"}, 196 }, 197 { 198 Name: "A", 199 Head: &util.SimpleHead{Kind: "ClusterRole"}, 200 }, 201 { 202 Name: "0", 203 Head: &util.SimpleHead{Kind: "ConfigMap"}, 204 }, 205 { 206 Name: "1", 207 Head: &util.SimpleHead{Kind: "ConfigMap"}, 208 }, 209 { 210 Name: "z", 211 Head: &util.SimpleHead{Kind: "ClusterRoleBinding"}, 212 }, 213 { 214 Name: "!", 215 Head: &util.SimpleHead{Kind: "ClusterRoleBinding"}, 216 }, 217 { 218 Name: "u2", 219 Head: &util.SimpleHead{Kind: "Unknown"}, 220 }, 221 { 222 Name: "u1", 223 Head: &util.SimpleHead{Kind: "Unknown"}, 224 }, 225 { 226 Name: "t3", 227 Head: &util.SimpleHead{Kind: "Unknown2"}, 228 }, 229 } 230 for _, test := range []struct { 231 description string 232 order SortOrder 233 expected string 234 }{ 235 // expectation is sorted by kind (unknown is last) and then sub sorted alphabetically within each group 236 {"cm,clusterRole,clusterRoleBinding,Unknown,Unknown2", InstallOrder, "01Aa!zu1u2t3"}, 237 } { 238 var buf bytes.Buffer 239 t.Run(test.description, func(t *testing.T) { 240 defer buf.Reset() 241 for _, r := range sortByKind(manifests, test.order) { 242 buf.WriteString(r.Name) 243 } 244 if got := buf.String(); got != test.expected { 245 t.Errorf("Expected %q, got %q", test.expected, got) 246 } 247 }) 248 } 249 } 250 251 func TestKindSorterNamespaceAgainstUnknown(t *testing.T) { 252 unknown := Manifest{ 253 Name: "a", 254 Head: &util.SimpleHead{Kind: "Unknown"}, 255 } 256 namespace := Manifest{ 257 Name: "b", 258 Head: &util.SimpleHead{Kind: "Namespace"}, 259 } 260 261 manifests := []Manifest{unknown, namespace} 262 sortByKind(manifests, InstallOrder) 263 264 expectedOrder := []Manifest{namespace, unknown} 265 for i, manifest := range manifests { 266 if expectedOrder[i].Name != manifest.Name { 267 t.Errorf("Expected %s, got %s", expectedOrder[i].Name, manifest.Name) 268 } 269 } 270 }