github.com/nilium/gitlab-runner@v12.5.0+incompatible/cache/adapter_test.go (about)

     1  package cache
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  
    10  	"gitlab.com/gitlab-org/gitlab-runner/common"
    11  )
    12  
    13  var defaultTimeout = 1 * time.Hour
    14  
    15  type factorizeTestCase struct {
    16  	adapter          Adapter
    17  	errorOnFactorize error
    18  	expectedError    string
    19  	expectedAdapter  Adapter
    20  }
    21  
    22  func prepareMockedFactoriesMap() func() {
    23  	oldFactories := factories
    24  	factories = &FactoriesMap{}
    25  
    26  	return func() {
    27  		factories = oldFactories
    28  	}
    29  }
    30  
    31  func makeTestFactory(test factorizeTestCase) Factory {
    32  	return func(config *common.CacheConfig, timeout time.Duration, objectName string) (Adapter, error) {
    33  		if test.errorOnFactorize != nil {
    34  			return nil, test.errorOnFactorize
    35  		}
    36  
    37  		return test.adapter, nil
    38  	}
    39  }
    40  
    41  func TestCreateAdapter(t *testing.T) {
    42  	adapterMock := new(MockAdapter)
    43  
    44  	tests := map[string]factorizeTestCase{
    45  		"adapter doesn't exist": {
    46  			adapter:          nil,
    47  			errorOnFactorize: nil,
    48  			expectedAdapter:  nil,
    49  			expectedError:    `cache factory not found: factory for cache adapter \"test\" was not registered`,
    50  		},
    51  		"adapter exists": {
    52  			adapter:          adapterMock,
    53  			errorOnFactorize: nil,
    54  			expectedAdapter:  adapterMock,
    55  			expectedError:    "",
    56  		},
    57  		"adapter errors on factorize": {
    58  			adapter:          adapterMock,
    59  			errorOnFactorize: errors.New("test error"),
    60  			expectedAdapter:  nil,
    61  			expectedError:    `cache adapter could not be initialized: test error`,
    62  		},
    63  	}
    64  
    65  	for name, test := range tests {
    66  		t.Run(name, func(t *testing.T) {
    67  			cleanupFactoriesMap := prepareMockedFactoriesMap()
    68  			defer cleanupFactoriesMap()
    69  
    70  			adapterTypeName := "test"
    71  
    72  			if test.adapter != nil {
    73  				err := factories.Register(adapterTypeName, makeTestFactory(test))
    74  				assert.NoError(t, err)
    75  			}
    76  
    77  			factories.Register("additional-adapter", func(config *common.CacheConfig, timeout time.Duration, objectName string) (Adapter, error) {
    78  				return new(MockAdapter), nil
    79  			})
    80  
    81  			config := &common.CacheConfig{
    82  				Type: adapterTypeName,
    83  			}
    84  
    85  			adapter, err := CreateAdapter(config, defaultTimeout, "key")
    86  
    87  			if test.expectedError == "" {
    88  				assert.NoError(t, err)
    89  			} else {
    90  				assert.Error(t, err)
    91  			}
    92  
    93  			assert.Equal(t, test.expectedAdapter, adapter)
    94  		})
    95  	}
    96  }
    97  
    98  func TestDoubledRegistration(t *testing.T) {
    99  	adapterTypeName := "test"
   100  	fakeFactory := func(config *common.CacheConfig, timeout time.Duration, objectName string) (Adapter, error) {
   101  		return nil, nil
   102  	}
   103  
   104  	f := &FactoriesMap{}
   105  
   106  	err := f.Register(adapterTypeName, fakeFactory)
   107  	assert.NoError(t, err)
   108  	assert.Len(t, f.internal, 1)
   109  
   110  	err = f.Register(adapterTypeName, fakeFactory)
   111  	assert.Error(t, err)
   112  	assert.Len(t, f.internal, 1)
   113  }