github.com/argoproj/argo-events@v1.9.1/common/util_test.go (about) 1 /* 2 Copyright 2018 BlackRock, Inc. 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 common 18 19 import ( 20 "net/http" 21 "strings" 22 "testing" 23 24 apicommon "github.com/argoproj/argo-events/pkg/apis/common" 25 "github.com/stretchr/testify/assert" 26 corev1 "k8s.io/api/core/v1" 27 ) 28 29 type fakeHttpWriter struct { 30 header int 31 payload []byte 32 } 33 34 func (f *fakeHttpWriter) Header() http.Header { 35 return http.Header{} 36 } 37 38 func (f *fakeHttpWriter) Write(body []byte) (int, error) { 39 f.payload = body 40 return len(body), nil 41 } 42 43 func (f *fakeHttpWriter) WriteHeader(status int) { 44 f.header = status 45 } 46 47 func TestHTTPMethods(t *testing.T) { 48 f := &fakeHttpWriter{} 49 SendSuccessResponse(f, "hello") 50 assert.Equal(t, "hello", string(f.payload)) 51 assert.Equal(t, http.StatusOK, f.header) 52 53 SendErrorResponse(f, "failure") 54 assert.Equal(t, "failure", string(f.payload)) 55 assert.Equal(t, http.StatusBadRequest, f.header) 56 } 57 58 func TestFormatEndpoint(t *testing.T) { 59 assert.Equal(t, "/hello", FormatEndpoint("hello")) 60 } 61 62 func TestFormattedURL(t *testing.T) { 63 assert.Equal(t, "test-url/fake", FormattedURL("test-url", "fake")) 64 } 65 66 type statusVal int 67 type foo struct { 68 Name string 69 Ye int 70 SS *corev1.SecretKeySelector 71 CM01 *corev1.ConfigMapKeySelector 72 } 73 74 type haha struct { 75 Nani string 76 S *corev1.SecretKeySelector 77 C *corev1.ConfigMapKeySelector 78 } 79 80 type bar struct { 81 Status statusVal 82 FSlice []foo 83 Lili *string 84 Hss string 85 Dd int 86 dd int 87 M1 map[string]haha 88 M2 map[string]*haha 89 ABC *corev1.SecretKeySelector 90 ABCD *corev1.SecretKeySelector 91 EFG corev1.SecretKeySelector 92 hello *corev1.SecretKeySelector 93 94 CM01 *corev1.ConfigMapKeySelector 95 } 96 97 var ( 98 testXObj = bar{ 99 dd: 3, 100 Status: 5, 101 FSlice: []foo{ 102 { 103 Name: "asdb", 104 Ye: 23, 105 SS: &corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "s01"}, Key: "key1"}, 106 CM01: &corev1.ConfigMapKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "c01"}, Key: "ckey1"}, 107 }, 108 { 109 Name: "sss", 110 SS: &corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "s02"}, Key: "key2"}, 111 CM01: &corev1.ConfigMapKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "c02"}, Key: "ckey2"}, 112 }, 113 }, 114 M1: map[string]haha{ 115 "a": { 116 Nani: "nani333", 117 S: &corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "s03"}, Key: "key3"}, 118 C: &corev1.ConfigMapKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "c03"}, Key: "ckey3"}, 119 }, 120 "b": {Nani: "nani444"}, 121 "c": { 122 Nani: "nani555", 123 S: &corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "s04"}, Key: "key4"}, 124 C: &corev1.ConfigMapKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "c04"}, Key: "ckey4"}, 125 }, 126 }, 127 M2: map[string]*haha{ 128 "a": { 129 Nani: "nani333", 130 S: &corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "s05"}, Key: "key5"}, 131 C: &corev1.ConfigMapKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "c05"}, Key: "ckey5"}, 132 }, 133 "b": {Nani: "nani444"}, 134 "c": { 135 Nani: "nani555", 136 S: &corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "s06"}, Key: "key6"}, 137 C: &corev1.ConfigMapKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "c06"}, Key: "ckey6"}, 138 }, 139 }, 140 ABC: &corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "s06"}, Key: "key7"}, // same name 141 EFG: corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "s08"}, Key: "key8"}, // does not count 142 hello: &corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "s09"}, Key: "key9"}, // does not count 143 CM01: &corev1.ConfigMapKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: "c06"}, Key: "ckey7"}, // same name 144 } 145 ) 146 147 func TestFindTypeValues(t *testing.T) { 148 t.Run("test find secretKeySelectors", func(t *testing.T) { 149 values := findTypeValues(testXObj, SecretKeySelectorType) 150 assert.Equal(t, len(values), 7) 151 values = findTypeValues(&testXObj, SecretKeySelectorType) 152 assert.Equal(t, len(values), 7) 153 }) 154 155 t.Run("test find configMapKeySelectors", func(t *testing.T) { 156 values := findTypeValues(testXObj, ConfigMapKeySelectorType) 157 assert.Equal(t, len(values), 7) 158 values = findTypeValues(&testXObj, ConfigMapKeySelectorType) 159 assert.Equal(t, len(values), 7) 160 }) 161 } 162 163 func TestVolumesFromSecretsOrConfigMaps(t *testing.T) { 164 t.Run("test secret volumes", func(t *testing.T) { 165 vols, mounts := VolumesFromSecretsOrConfigMaps(SecretKeySelectorType, &testXObj) 166 assert.Equal(t, len(vols), 6) 167 assert.Equal(t, len(mounts), 6) 168 }) 169 170 t.Run("test configmap volumes", func(t *testing.T) { 171 vols, mounts := VolumesFromSecretsOrConfigMaps(ConfigMapKeySelectorType, &testXObj) 172 assert.Equal(t, len(vols), 6) 173 assert.Equal(t, len(mounts), 6) 174 }) 175 } 176 177 func fakeTLSConfig(t *testing.T, insecureSkipVerify bool) *apicommon.TLSConfig { 178 t.Helper() 179 if insecureSkipVerify == true { 180 return &apicommon.TLSConfig{ 181 InsecureSkipVerify: true, 182 } 183 } else { 184 return &apicommon.TLSConfig{ 185 CACertSecret: &corev1.SecretKeySelector{ 186 Key: "fake-key1", 187 LocalObjectReference: corev1.LocalObjectReference{ 188 Name: "fake-name1", 189 }, 190 }, 191 ClientCertSecret: &corev1.SecretKeySelector{ 192 Key: "fake-key2", 193 LocalObjectReference: corev1.LocalObjectReference{ 194 Name: "fake-name2", 195 }, 196 }, 197 ClientKeySecret: &corev1.SecretKeySelector{ 198 Key: "fake-key3", 199 LocalObjectReference: corev1.LocalObjectReference{ 200 Name: "fake-name3", 201 }, 202 }, 203 } 204 } 205 } 206 207 func TestGetTLSConfig(t *testing.T) { 208 t.Run("test empty", func(t *testing.T) { 209 c := &apicommon.TLSConfig{} 210 _, err := GetTLSConfig(c) 211 assert.NotNil(t, err) 212 assert.True(t, strings.Contains(err.Error(), "neither of caCertSecret, clientCertSecret and clientKeySecret is configured")) 213 }) 214 215 t.Run("test clientKeySecret is set, clientCertSecret is empty", func(t *testing.T) { 216 c := fakeTLSConfig(t, false) 217 c.CACertSecret = nil 218 c.ClientCertSecret = nil 219 _, err := GetTLSConfig(c) 220 assert.NotNil(t, err) 221 assert.True(t, strings.Contains(err.Error(), "both of clientCertSecret and clientKeySecret need to be configured")) 222 }) 223 224 t.Run("test only caCertSecret is set", func(t *testing.T) { 225 c := fakeTLSConfig(t, false) 226 c.ClientCertSecret = nil 227 c.ClientKeySecret = nil 228 _, err := GetTLSConfig(c) 229 assert.NotNil(t, err) 230 assert.True(t, strings.Contains(err.Error(), "failed to read ca cert file")) 231 }) 232 233 t.Run("test clientCertSecret and clientKeySecret are set", func(t *testing.T) { 234 c := fakeTLSConfig(t, false) 235 c.CACertSecret = nil 236 _, err := GetTLSConfig(c) 237 assert.NotNil(t, err) 238 assert.True(t, strings.Contains(err.Error(), "failed to load client cert key pair")) 239 }) 240 241 t.Run("test all of 3 are set", func(t *testing.T) { 242 c := fakeTLSConfig(t, false) 243 _, err := GetTLSConfig(c) 244 assert.NotNil(t, err) 245 assert.True(t, strings.Contains(err.Error(), "failed to read ca cert file")) 246 }) 247 } 248 249 func TestElementsMatch(t *testing.T) { 250 assert.True(t, ElementsMatch(nil, nil)) 251 assert.True(t, ElementsMatch([]string{"hello"}, []string{"hello"})) 252 assert.True(t, ElementsMatch([]string{"hello", "world"}, []string{"hello", "world"})) 253 assert.True(t, ElementsMatch([]string{}, []string{})) 254 255 assert.False(t, ElementsMatch([]string{"hello"}, nil)) 256 assert.False(t, ElementsMatch([]string{"hello"}, []string{})) 257 assert.False(t, ElementsMatch([]string{}, []string{"hello"})) 258 assert.False(t, ElementsMatch([]string{"hello"}, []string{"hello", "world"})) 259 assert.False(t, ElementsMatch([]string{"hello", "world"}, []string{"hello"})) 260 assert.False(t, ElementsMatch([]string{"hello", "world"}, []string{"hello", "moon"})) 261 assert.True(t, ElementsMatch([]string{"hello", "world"}, []string{"world", "hello"})) 262 assert.True(t, ElementsMatch([]string{"hello", "world", "hello"}, []string{"hello", "hello", "world", "world"})) 263 assert.True(t, ElementsMatch([]string{"world", "hello"}, []string{"hello", "hello", "world", "world"})) 264 assert.True(t, ElementsMatch([]string{"hello", "hello", "world", "world"}, []string{"world", "hello"})) 265 assert.False(t, ElementsMatch([]string{"hello"}, []string{"*", "hello"})) 266 assert.False(t, ElementsMatch([]string{"hello", "*"}, []string{"hello"})) 267 assert.False(t, ElementsMatch([]string{"*", "hello", "*"}, []string{"hello"})) 268 assert.False(t, ElementsMatch([]string{"hello"}, []string{"world", "world"})) 269 assert.False(t, ElementsMatch([]string{"hello", "hello"}, []string{"world", "world"})) 270 } 271 272 func TestSliceContains(t *testing.T) { 273 assert.True(t, SliceContains([]string{"hello", "*"}, "*")) 274 assert.True(t, SliceContains([]string{"*", "world"}, "*")) 275 assert.True(t, SliceContains([]string{"*", "world"}, "world")) 276 assert.True(t, SliceContains([]string{"*", "hello", "*"}, "*")) 277 assert.False(t, SliceContains([]string{"hello", "world"}, "*")) 278 }