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  }