106 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
package v1alpha1_test
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto/tls"
 | 
						|
	"crypto/x509"
 | 
						|
	"net/http"
 | 
						|
	"os"
 | 
						|
	"path/filepath"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1"
 | 
						|
	"github.com/actions/actions-runner-controller/github/actions/testserver"
 | 
						|
	"github.com/stretchr/testify/assert"
 | 
						|
	"github.com/stretchr/testify/require"
 | 
						|
	v1 "k8s.io/api/core/v1"
 | 
						|
)
 | 
						|
 | 
						|
func TestGitHubServerTLSConfig_ToCertPool(t *testing.T) {
 | 
						|
	t.Run("returns an error if CertificateFrom not specified", func(t *testing.T) {
 | 
						|
		c := &v1alpha1.GitHubServerTLSConfig{
 | 
						|
			CertificateFrom: nil,
 | 
						|
		}
 | 
						|
 | 
						|
		pool, err := c.ToCertPool(nil)
 | 
						|
		assert.Nil(t, pool)
 | 
						|
 | 
						|
		require.Error(t, err)
 | 
						|
		assert.Equal(t, err.Error(), "certificateFrom not specified")
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("returns an error if CertificateFrom.ConfigMapKeyRef not specified", func(t *testing.T) {
 | 
						|
		c := &v1alpha1.GitHubServerTLSConfig{
 | 
						|
			CertificateFrom: &v1alpha1.TLSCertificateSource{},
 | 
						|
		}
 | 
						|
 | 
						|
		pool, err := c.ToCertPool(nil)
 | 
						|
		assert.Nil(t, pool)
 | 
						|
 | 
						|
		require.Error(t, err)
 | 
						|
		assert.Equal(t, err.Error(), "configMapKeyRef not specified")
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("returns a valid cert pool with correct configuration", func(t *testing.T) {
 | 
						|
		c := &v1alpha1.GitHubServerTLSConfig{
 | 
						|
			CertificateFrom: &v1alpha1.TLSCertificateSource{
 | 
						|
				ConfigMapKeyRef: &v1.ConfigMapKeySelector{
 | 
						|
					LocalObjectReference: v1.LocalObjectReference{
 | 
						|
						Name: "name",
 | 
						|
					},
 | 
						|
					Key: "key",
 | 
						|
				},
 | 
						|
			},
 | 
						|
		}
 | 
						|
 | 
						|
		certsFolder := filepath.Join(
 | 
						|
			"../../../",
 | 
						|
			"github",
 | 
						|
			"actions",
 | 
						|
			"testdata",
 | 
						|
		)
 | 
						|
 | 
						|
		fetcher := func(name, key string) ([]byte, error) {
 | 
						|
			cert, err := os.ReadFile(filepath.Join(certsFolder, "rootCA.crt"))
 | 
						|
			require.NoError(t, err)
 | 
						|
 | 
						|
			pool := x509.NewCertPool()
 | 
						|
			ok := pool.AppendCertsFromPEM(cert)
 | 
						|
			assert.True(t, ok)
 | 
						|
 | 
						|
			return cert, nil
 | 
						|
		}
 | 
						|
 | 
						|
		pool, err := c.ToCertPool(fetcher)
 | 
						|
		require.NoError(t, err)
 | 
						|
		require.NotNil(t, pool)
 | 
						|
 | 
						|
		// can be used to communicate with a server
 | 
						|
		serverSuccessfullyCalled := false
 | 
						|
		server := testserver.NewUnstarted(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | 
						|
			serverSuccessfullyCalled = true
 | 
						|
			w.WriteHeader(http.StatusOK)
 | 
						|
		}))
 | 
						|
 | 
						|
		cert, err := tls.LoadX509KeyPair(
 | 
						|
			filepath.Join(certsFolder, "server.crt"),
 | 
						|
			filepath.Join(certsFolder, "server.key"),
 | 
						|
		)
 | 
						|
		require.NoError(t, err)
 | 
						|
 | 
						|
		server.TLS = &tls.Config{Certificates: []tls.Certificate{cert}}
 | 
						|
		server.StartTLS()
 | 
						|
 | 
						|
		client := &http.Client{
 | 
						|
			Transport: &http.Transport{
 | 
						|
				TLSClientConfig: &tls.Config{
 | 
						|
					RootCAs: pool,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		}
 | 
						|
 | 
						|
		_, err = client.Get(server.URL)
 | 
						|
		assert.NoError(t, err)
 | 
						|
		assert.True(t, serverSuccessfullyCalled)
 | 
						|
	})
 | 
						|
}
 |