github.com/alloyci/alloy-runner@v1.0.1-0.20180222164613-925503ccafd6/shells/cache_test.go (about)

     1  package shells
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/minio/minio-go/pkg/credentials"
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"gitlab.com/gitlab-org/gitlab-runner/common"
    11  )
    12  
    13  func defaultS3CacheFactory() *common.CacheConfig {
    14  	return &common.CacheConfig{
    15  		Type:           "s3",
    16  		ServerAddress:  "server.com",
    17  		AccessKey:      "access",
    18  		SecretKey:      "key",
    19  		BucketName:     "test",
    20  		BucketLocation: "location",
    21  	}
    22  }
    23  
    24  func iamS3CacheFactory(t *testing.T) (*common.CacheConfig, *mockFakeIAMCredentialsProvider) {
    25  	cacheConfig := defaultS3CacheFactory()
    26  	cacheConfig.ServerAddress = ""
    27  	cacheConfig.AccessKey = ""
    28  	cacheConfig.SecretKey = ""
    29  
    30  	iamProvider := &mockFakeIAMCredentialsProvider{}
    31  	iamFactory = func() *credentials.Credentials {
    32  		return credentials.New(iamProvider)
    33  	}
    34  
    35  	return cacheConfig, iamProvider
    36  }
    37  
    38  func defaults3CacheBuild(cacheConfig *common.CacheConfig) *common.Build {
    39  	return &common.Build{
    40  		JobResponse: common.JobResponse{
    41  			JobInfo: common.JobInfo{
    42  				ProjectID: 10,
    43  			},
    44  			RunnerInfo: common.RunnerInfo{
    45  				Timeout: 3600,
    46  			},
    47  		},
    48  		Runner: &common.RunnerConfig{
    49  			RunnerCredentials: common.RunnerCredentials{
    50  				Token: "longtoken",
    51  			},
    52  			RunnerSettings: common.RunnerSettings{
    53  				Cache: cacheConfig,
    54  			},
    55  		},
    56  	}
    57  }
    58  
    59  func TestS3CacheUploadURL(t *testing.T) {
    60  	s3Cache := defaultS3CacheFactory()
    61  	s3Cache.Insecure = false
    62  	s3CacheBuild := defaults3CacheBuild(s3Cache)
    63  	url := getCacheUploadURL(s3CacheBuild, "key")
    64  	require.NotNil(t, url)
    65  	assert.Equal(t, s3Cache.ServerAddress, url.Host)
    66  	assert.Regexp(t, "^https://", url)
    67  	assert.Contains(t, url.String(), "X-Amz-Credential=access%2F")
    68  }
    69  
    70  func TestS3CacheUploadURLForIamCredentials(t *testing.T) {
    71  	s3Cache, iamProvider := iamS3CacheFactory(t)
    72  
    73  	fakeValue := credentials.Value{
    74  		AccessKeyID:     "access-from-iam",
    75  		SecretAccessKey: "secret-from-iam",
    76  	}
    77  	iamProvider.On("Retrieve").Return(fakeValue, nil).Once()
    78  	iamProvider.On("IsExpired").Return(false)
    79  	defer iamProvider.AssertExpectations(t)
    80  
    81  	s3Cache.Insecure = false
    82  	s3CacheBuild := defaults3CacheBuild(s3Cache)
    83  	url := getCacheUploadURL(s3CacheBuild, "key")
    84  	require.NotNil(t, url)
    85  	assert.Equal(t, "test.s3.amazonaws.com", url.Host)
    86  	assert.Regexp(t, "^https://", url)
    87  	assert.Contains(t, url.String(), "X-Amz-Credential=access-from-iam%2F")
    88  }
    89  
    90  func TestS3CacheUploadInsecureURL(t *testing.T) {
    91  	s3Cache := defaultS3CacheFactory()
    92  	s3Cache.Insecure = true
    93  	s3CacheBuild := defaults3CacheBuild(s3Cache)
    94  	url := getCacheUploadURL(s3CacheBuild, "key")
    95  	require.NotNil(t, url)
    96  	assert.Equal(t, s3Cache.ServerAddress, url.Host)
    97  	assert.Regexp(t, "^http://", url)
    98  }
    99  
   100  func TestS3CacheDownloadURL(t *testing.T) {
   101  	s3Cache := defaultS3CacheFactory()
   102  	s3Cache.Insecure = false
   103  	s3CacheBuild := defaults3CacheBuild(s3Cache)
   104  	url := getCacheDownloadURL(s3CacheBuild, "key")
   105  	require.NotNil(t, url)
   106  	assert.Equal(t, s3Cache.ServerAddress, url.Host)
   107  	assert.Regexp(t, "^https://", url)
   108  }
   109  
   110  func TestS3CacheDownloadInsecureURL(t *testing.T) {
   111  	s3Cache := defaultS3CacheFactory()
   112  	s3Cache.Insecure = true
   113  	s3CacheBuild := defaults3CacheBuild(s3Cache)
   114  	url := getCacheDownloadURL(s3CacheBuild, "key")
   115  	require.NotNil(t, url)
   116  	assert.Equal(t, s3Cache.ServerAddress, url.Host)
   117  	assert.Regexp(t, "^http://", url)
   118  }
   119  
   120  func TestGetCacheObjectNameWhenKeyIsEmptyResultIsAlsoEmpty(t *testing.T) {
   121  	s3Cache := defaultS3CacheFactory()
   122  	s3CacheBuild := defaults3CacheBuild(s3Cache)
   123  	url := getCacheObjectName(s3CacheBuild, s3Cache, "")
   124  	require.Empty(t, url)
   125  }
   126  
   127  func TestGetCacheObjectName(t *testing.T) {
   128  	s3Cache := defaultS3CacheFactory()
   129  	s3CacheBuild := defaults3CacheBuild(s3Cache)
   130  	url := getCacheObjectName(s3CacheBuild, s3Cache, "key")
   131  	require.Equal(t, "runner/longtoke/project/10/key", url)
   132  }
   133  
   134  func TestGetCacheObjectNameWhenPathIsSetThenUrlContainsIt(t *testing.T) {
   135  	s3Cache := defaultS3CacheFactory()
   136  	s3Cache.Path = "whatever"
   137  	s3CacheBuild := defaults3CacheBuild(s3Cache)
   138  	url := getCacheObjectName(s3CacheBuild, s3Cache, "key")
   139  	require.Equal(t, "whatever/runner/longtoke/project/10/key", url)
   140  }
   141  
   142  func TestGetCacheObjectNameWhenPathHasMultipleSegmentIsSetThenUrlContainsIt(t *testing.T) {
   143  	s3Cache := defaultS3CacheFactory()
   144  	s3Cache.Path = "some/other/path/goes/here"
   145  	s3CacheBuild := defaults3CacheBuild(s3Cache)
   146  	url := getCacheObjectName(s3CacheBuild, s3Cache, "key")
   147  	require.Equal(t, "some/other/path/goes/here/runner/longtoke/project/10/key", url)
   148  }
   149  
   150  func TestGetCacheObjectNameWhenPathIsNotSetThenUrlDoesNotContainIt(t *testing.T) {
   151  	s3Cache := defaultS3CacheFactory()
   152  	s3Cache.Path = ""
   153  	s3CacheBuild := defaults3CacheBuild(s3Cache)
   154  	url := getCacheObjectName(s3CacheBuild, s3Cache, "key")
   155  	require.Equal(t, "runner/longtoke/project/10/key", url)
   156  }
   157  
   158  func TestGetCacheObjectNameWhenSharedFlagIsFalseThenRunnerSegmentExistsInTheUrl(t *testing.T) {
   159  	s3Cache := defaultS3CacheFactory()
   160  	s3Cache.Shared = false
   161  	s3CacheBuild := defaults3CacheBuild(s3Cache)
   162  	url := getCacheObjectName(s3CacheBuild, s3Cache, "key")
   163  	require.Equal(t, "runner/longtoke/project/10/key", url)
   164  }
   165  
   166  func TestGetCacheObjectNameWhenSharedFlagIsFalseThenRunnerSegmentShouldNotBePresent(t *testing.T) {
   167  	s3Cache := defaultS3CacheFactory()
   168  	s3Cache.Shared = true
   169  	s3CacheBuild := defaults3CacheBuild(s3Cache)
   170  	url := getCacheObjectName(s3CacheBuild, s3Cache, "key")
   171  	require.Equal(t, "project/10/key", url)
   172  }