github.com/secure-build/gitlab-runner@v12.5.0+incompatible/helpers/tls/ca_chain/resolver_chain_test.go (about)

     1  package ca_chain
     2  
     3  import (
     4  	"crypto/x509"
     5  	"errors"
     6  	"math/big"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  type resolverMockFactory func(t *testing.T) (resolver, func())
    13  
    14  func newResolverMock(inputCerts []*x509.Certificate, returnCerts []*x509.Certificate, returnErr error) resolverMockFactory {
    15  	return func(t *testing.T) (resolver, func()) {
    16  		mock := new(mockResolver)
    17  		cleanup := func() {
    18  			mock.AssertExpectations(t)
    19  		}
    20  
    21  		mock.
    22  			On("Resolve", inputCerts).
    23  			Return(returnCerts, returnErr).
    24  			Once()
    25  
    26  		return mock, cleanup
    27  	}
    28  }
    29  
    30  func TestChainResolver_Resolve(t *testing.T) {
    31  	testError := errors.New("test error")
    32  
    33  	certs := []*x509.Certificate{{SerialNumber: big.NewInt(1)}}
    34  	urlCerts := []*x509.Certificate{{SerialNumber: big.NewInt(2)}}
    35  	verifyCerts := []*x509.Certificate{{SerialNumber: big.NewInt(3)}}
    36  
    37  	noopMock := func(t *testing.T) (resolver, func()) { return nil, func() {} }
    38  
    39  	tests := map[string]struct {
    40  		urlResolver    resolverMockFactory
    41  		verifyResolver resolverMockFactory
    42  		expectedError  string
    43  		expectedCerts  []*x509.Certificate
    44  	}{
    45  		"error on urlResolver": {
    46  			urlResolver:    newResolverMock(certs, nil, testError),
    47  			verifyResolver: noopMock,
    48  			expectedError:  "error while resolving certificates chain with URL: test error",
    49  			expectedCerts:  nil,
    50  		},
    51  		"error on verifyResolver": {
    52  			urlResolver:    newResolverMock(certs, urlCerts, nil),
    53  			verifyResolver: newResolverMock(urlCerts, nil, testError),
    54  			expectedError:  "error while resolving certificates chain with verification: test error",
    55  			expectedCerts:  nil,
    56  		},
    57  		"certificates resolved properly": {
    58  			urlResolver:    newResolverMock(certs, urlCerts, nil),
    59  			verifyResolver: newResolverMock(urlCerts, verifyCerts, nil),
    60  			expectedError:  "",
    61  			expectedCerts:  verifyCerts,
    62  		},
    63  	}
    64  
    65  	for tn, tc := range tests {
    66  		t.Run(tn, func(t *testing.T) {
    67  			urlResolver, cleanupURLResolver := tc.urlResolver(t)
    68  			defer cleanupURLResolver()
    69  
    70  			verifyResolver, cleanupVerifyResolver := tc.verifyResolver(t)
    71  			defer cleanupVerifyResolver()
    72  
    73  			r := newChainResolver(urlResolver, verifyResolver)
    74  			newCerts, err := r.Resolve(certs)
    75  
    76  			if tc.expectedError != "" {
    77  				assert.EqualError(t, err, tc.expectedError)
    78  			} else {
    79  				assert.NoError(t, err)
    80  			}
    81  
    82  			assert.Equal(t, tc.expectedCerts, newCerts)
    83  		})
    84  	}
    85  }