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  }