github.com/verrazzano/verrazzano@v1.7.1/tools/oam-converter/pkg/resources/gateway/gateway_test.go (about) 1 // Copyright (c) 2023, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package gateway 5 6 import ( 7 "crypto/rand" 8 "fmt" 9 "github.com/stretchr/testify/assert" 10 vzapi "github.com/verrazzano/verrazzano/application-operator/apis/oam/v1alpha1" 11 "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/types" 12 istio "istio.io/api/networking/v1beta1" 13 vsapi "istio.io/client-go/pkg/apis/networking/v1beta1" 14 k8net "k8s.io/api/networking/v1" 15 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 16 k8scheme "k8s.io/client-go/kubernetes/scheme" 17 "math/big" 18 "sigs.k8s.io/controller-runtime/pkg/client/fake" 19 "testing" 20 ) 21 22 func TestBuildCertificateSecretName(t *testing.T) { 23 trait := &vzapi.IngressTrait{ 24 ObjectMeta: metav1.ObjectMeta{ 25 Name: "my-trait", 26 }, 27 } 28 appNamespace := getRandomString() 29 30 expectedSecretName := fmt.Sprintf("%s-%s-cert-secret", appNamespace, trait.Name) 31 32 result := buildCertificateSecretName(trait, appNamespace) 33 34 assert.Equal(t, expectedSecretName, result, "Incorrect certificate secret name") 35 } 36 37 // Helper function to generate a random string 38 func getRandomString() string { 39 const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 40 b := make([]byte, 10) 41 max := big.NewInt(int64(len(charset))) 42 for i := range b { 43 n, err := rand.Int(rand.Reader, max) 44 if err != nil { 45 46 return "" 47 } 48 b[i] = charset[n.Int64()] 49 } 50 return string(b) 51 } 52 53 func TestBuildCertificateName(t *testing.T) { 54 55 trait := &vzapi.IngressTrait{ 56 ObjectMeta: metav1.ObjectMeta{ 57 Name: "my-trait", 58 }, 59 } 60 appNamespace := getRandomString() 61 62 expectedSecretName := fmt.Sprintf("%s-%s-cert", appNamespace, trait.Name) 63 64 result := buildCertificateName(trait, appNamespace) 65 66 assert.Equal(t, expectedSecretName, result, "Incorrect certificate name") 67 } 68 69 func TestBuildLegacyCertificateName(t *testing.T) { 70 71 trait := &vzapi.IngressTrait{ 72 ObjectMeta: metav1.ObjectMeta{ 73 Name: "my-trait", 74 }, 75 } 76 appNamespace := getRandomString() 77 78 expected := fmt.Sprintf("%s-%s-cert", appNamespace, trait.Name) 79 80 appName := "my-app" 81 result := buildLegacyCertificateName(trait, appNamespace, appName) 82 83 assert.Equal(t, expected, result, "Incorrect legacy certificate name") 84 } 85 86 func TestBuildLegacyCertificateSecretName(t *testing.T) { 87 trait := &vzapi.IngressTrait{ 88 ObjectMeta: metav1.ObjectMeta{ 89 Name: "my-trait", 90 }, 91 } 92 93 appName := "my-app" 94 95 appNamespace := getRandomString() 96 97 expected := fmt.Sprintf("%s-%s-cert-secret", appNamespace, trait.Name) 98 99 result := buildLegacyCertificateSecretName(trait, appNamespace, appName) 100 101 assert.Equal(t, expected, result, "Incorrect legacy certificate secret name") 102 } 103 104 func TestValidateConfiguredSecret(t *testing.T) { 105 trait := &vzapi.IngressTrait{ 106 Spec: vzapi.IngressTraitSpec{ 107 TLS: vzapi.IngressSecurity{ 108 SecretName: "my-secret", 109 }, 110 }, 111 } 112 113 expected := "my-secret" 114 result := validateConfiguredSecret(trait) 115 116 assert.Equal(t, expected, result, "Incorrect configured secret") 117 } 118 119 func TestBuildGatewayName(t *testing.T) { 120 appNamespace := "my-namespace" 121 122 expected := "my-namespace-my-namespace-gw" 123 result, err := BuildGatewayName(appNamespace) 124 125 assert.NoError(t, err, "Error was not expected") 126 assert.Equal(t, expected, result, "Incorrect gateway name") 127 } 128 129 func TestFormatGatewayServerPortName(t *testing.T) { 130 traitName := "my-trait" 131 132 expected := "https-my-trait" 133 result := formatGatewayServerPortName(traitName) 134 135 assert.Equal(t, expected, result, "Incorrect gateway server port name") 136 } 137 func TestCreateGatewayCertificate(t *testing.T) { 138 trait := &vzapi.IngressTrait{ 139 ObjectMeta: metav1.ObjectMeta{ 140 Name: "my-trait", 141 Namespace: "my-namespace", 142 }, 143 } 144 145 hostsForTrait := []string{"example.com"} 146 147 appNamespace := getRandomString() 148 149 expectedSecretName := fmt.Sprintf("%s-%s-cert-secret", appNamespace, trait.Name) 150 151 secretName := createGatewayCertificate(trait, hostsForTrait, appNamespace) 152 153 // Check the certificate name and secret name returned by the function 154 assert.Equal(t, expectedSecretName, secretName, "Incorrect secret name") 155 156 } 157 158 func TestUpdateGatewayServersList(t *testing.T) { 159 // Create a sample server 160 server1 := &istio.Server{ 161 Name: "server1", 162 Port: &istio.Port{Name: "https"}, 163 } 164 165 // Create another sample server with a different name 166 server2 := &istio.Server{ 167 Name: "server1", 168 Port: &istio.Port{Name: "http"}, 169 } 170 171 // Create an empty server list 172 var servers []*istio.Server 173 174 // Call the function with the empty server list and the first server 175 servers = updateGatewayServersList(servers, server1) 176 177 // The server list should now have only one server 178 assert.Len(t, servers, 1, "Unexpected number of servers") 179 assert.Equal(t, server1, servers[0], "Unexpected server in the list") 180 181 // Call the function again with the same server list and a different server 182 servers = updateGatewayServersList(servers, server2) 183 184 // The server list should still have only one server with the updated details 185 assert.Len(t, servers, 1, "Unexpected number of servers") 186 assert.Equal(t, server2, servers[0], "Unexpected server in the list") 187 188 // Call the function with an empty server list and a new server 189 servers = updateGatewayServersList(nil, server1) 190 191 // The server list should now have the new server 192 assert.Len(t, servers, 1, "Unexpected number of servers") 193 assert.Equal(t, server1, servers[0], "Unexpected server in the list") 194 195 // Call the function with a server list containing an unnamed server 196 server3 := &istio.Server{ 197 Port: &istio.Port{Name: "https"}, 198 } 199 servers = updateGatewayServersList([]*istio.Server{server3}, server1) 200 201 // The server list should now have the updated server with a name 202 assert.Len(t, servers, 1, "Unexpected number of servers") 203 assert.Equal(t, server1, servers[0], "Unexpected server in the list") 204 } 205 206 func TestCreateGatewayResource(t *testing.T) { 207 conversionComponent := &types.ConversionComponents{ 208 AppName: "hello-helidon", 209 AppNamespace: "my-namespace", 210 IngressTrait: &vzapi.IngressTrait{ 211 ObjectMeta: metav1.ObjectMeta{ 212 Namespace: "my-namespace", 213 }, 214 }, 215 } 216 // Create a sample list of conversion components 217 conversionComponents := []*types.ConversionComponents{ 218 219 conversionComponent, 220 } 221 ingress := k8net.Ingress{ 222 ObjectMeta: metav1.ObjectMeta{ 223 Name: "verrazzano-ingress", 224 Namespace: "verrazzano-system", 225 Annotations: map[string]string{ 226 "external-dns.alpha.kubernetes.io/target": "test.nip.io", 227 }, 228 }, 229 } 230 cli := fake.NewClientBuilder().WithScheme(k8scheme.Scheme).WithObjects(&ingress).Build() 231 // Call the function with the sample conversion components 232 gateway, _, err := CreateGatewayResource(cli, conversionComponents) 233 234 // Check if the function returns an error (if any) 235 assert.NoError(t, err, "Unexpected error returned") 236 237 // Check if the gateway object is not nil 238 assert.NotNil(t, gateway, "Gateway object is nil") 239 240 } 241 242 func TestCreateListGateway(t *testing.T) { 243 // Create a sample Gateway object 244 gateway := &vsapi.Gateway{} 245 246 // Call the function with the sample Gateway 247 gatewayData, err := CreateListGateway(gateway) 248 249 // Check if the function returns an error (if any) 250 assert.NoError(t, err, "Unexpected error returned") 251 252 // Check if the gatewayData map is not nil 253 assert.NotNil(t, gatewayData, "gatewayData map is nil") 254 255 // Check if the "apiVersion" field is set to "v1" 256 assert.Equal(t, "v1", gatewayData["apiVersion"], "Unexpected apiVersion") 257 258 // Check if the "items" field is an array containing the sample Gateway 259 gatewayItems, ok := gatewayData["items"].([]*vsapi.Gateway) 260 assert.True(t, ok, "items is not an array of Gateway") 261 assert.Len(t, gatewayItems, 1, "Unexpected number of items in the array") 262 assert.Equal(t, gateway, gatewayItems[0], "Unexpected Gateway in the items array") 263 264 // Check if the "kind" field is set to "List" 265 assert.Equal(t, "List", gatewayData["kind"], "Unexpected kind") 266 267 }