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 }