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  }