github.com/darmach/terratest@v0.34.8-0.20210517103231-80931f95e3ff/modules/aws/s3_test.go (about) 1 // Integration tests that validate S3-related code in AWS. 2 package aws 3 4 import ( 5 "fmt" 6 "math/rand" 7 "strconv" 8 "strings" 9 "testing" 10 11 "github.com/aws/aws-sdk-go/aws" 12 "github.com/aws/aws-sdk-go/service/s3" 13 "github.com/aws/aws-sdk-go/service/s3/s3manager" 14 "github.com/gruntwork-io/terratest/modules/logger" 15 "github.com/gruntwork-io/terratest/modules/random" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestCreateAndDestroyS3Bucket(t *testing.T) { 20 t.Parallel() 21 22 region := GetRandomStableRegion(t, nil, nil) 23 id := random.UniqueId() 24 logger.Logf(t, "Random values selected. Region = %s, Id = %s\n", region, id) 25 26 s3BucketName := "gruntwork-terratest-" + strings.ToLower(id) 27 28 CreateS3Bucket(t, region, s3BucketName) 29 DeleteS3Bucket(t, region, s3BucketName) 30 } 31 32 func TestAssertS3BucketExistsNoFalseNegative(t *testing.T) { 33 t.Parallel() 34 35 region := GetRandomStableRegion(t, nil, nil) 36 s3BucketName := "gruntwork-terratest-" + strings.ToLower(random.UniqueId()) 37 logger.Logf(t, "Random values selected. Region = %s, s3BucketName = %s\n", region, s3BucketName) 38 39 CreateS3Bucket(t, region, s3BucketName) 40 defer DeleteS3Bucket(t, region, s3BucketName) 41 42 AssertS3BucketExists(t, region, s3BucketName) 43 } 44 45 func TestAssertS3BucketExistsNoFalsePositive(t *testing.T) { 46 t.Parallel() 47 48 region := GetRandomStableRegion(t, nil, nil) 49 s3BucketName := "gruntwork-terratest-" + strings.ToLower(random.UniqueId()) 50 logger.Logf(t, "Random values selected. Region = %s, s3BucketName = %s\n", region, s3BucketName) 51 52 // We elect not to create the S3 bucket to confirm that our function correctly reports it doesn't exist. 53 //aws.CreateS3Bucket(region, s3BucketName) 54 55 err := AssertS3BucketExistsE(t, region, s3BucketName) 56 if err == nil { 57 t.Fatalf("Function claimed that S3 Bucket '%s' exists, but in fact it does not.", s3BucketName) 58 } 59 } 60 61 func TestAssertS3BucketVersioningEnabled(t *testing.T) { 62 t.Parallel() 63 64 region := GetRandomStableRegion(t, nil, nil) 65 s3BucketName := "gruntwork-terratest-" + strings.ToLower(random.UniqueId()) 66 logger.Logf(t, "Random values selected. Region = %s, s3BucketName = %s\n", region, s3BucketName) 67 68 CreateS3Bucket(t, region, s3BucketName) 69 defer DeleteS3Bucket(t, region, s3BucketName) 70 PutS3BucketVersioning(t, region, s3BucketName) 71 72 AssertS3BucketVersioningExists(t, region, s3BucketName) 73 } 74 75 func TestEmptyS3Bucket(t *testing.T) { 76 t.Parallel() 77 78 // region := GetRandomStableRegion(t, nil, nil) 79 region := "us-east-1" 80 id := random.UniqueId() 81 logger.Logf(t, "Random values selected. Region = %s, Id = %s\n", region, id) 82 83 s3BucketName := "gruntwork-terratest-" + strings.ToLower(id) 84 85 CreateS3Bucket(t, region, s3BucketName) 86 defer DeleteS3Bucket(t, region, s3BucketName) 87 88 s3Client, err := NewS3ClientE(t, region) 89 if err != nil { 90 t.Fatal(err) 91 } 92 93 testEmptyBucket(t, s3Client, region, s3BucketName) 94 } 95 96 func TestEmptyS3BucketVersioned(t *testing.T) { 97 t.Parallel() 98 99 region := GetRandomStableRegion(t, nil, nil) 100 101 id := random.UniqueId() 102 logger.Logf(t, "Random values selected. Region = %s, Id = %s\n", region, id) 103 104 s3BucketName := "gruntwork-terratest-" + strings.ToLower(id) 105 106 CreateS3Bucket(t, region, s3BucketName) 107 defer DeleteS3Bucket(t, region, s3BucketName) 108 109 s3Client, err := NewS3ClientE(t, region) 110 if err != nil { 111 t.Fatal(err) 112 } 113 114 versionInput := &s3.PutBucketVersioningInput{ 115 Bucket: aws.String(s3BucketName), 116 VersioningConfiguration: &s3.VersioningConfiguration{ 117 MFADelete: aws.String("Disabled"), 118 Status: aws.String("Enabled"), 119 }, 120 } 121 122 _, err = s3Client.PutBucketVersioning(versionInput) 123 if err != nil { 124 t.Fatal(err) 125 } 126 127 testEmptyBucket(t, s3Client, region, s3BucketName) 128 } 129 130 func TestAssertS3BucketPolicyExists(t *testing.T) { 131 t.Parallel() 132 133 region := GetRandomStableRegion(t, nil, nil) 134 135 id := random.UniqueId() 136 logger.Logf(t, "Random values selected. Region = %s, Id = %s\n", region, id) 137 138 s3BucketName := "gruntwork-terratest-" + strings.ToLower(id) 139 exampleBucketPolicy := fmt.Sprintf(`{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":["*"]},"Action":"s3:Get*","Resource":"arn:aws:s3:::%s/*","Condition":{"Bool":{"aws:SecureTransport":"false"}}}]}`, s3BucketName) 140 141 CreateS3Bucket(t, region, s3BucketName) 142 defer DeleteS3Bucket(t, region, s3BucketName) 143 PutS3BucketPolicy(t, region, s3BucketName, exampleBucketPolicy) 144 145 AssertS3BucketPolicyExists(t, region, s3BucketName) 146 147 } 148 149 func testEmptyBucket(t *testing.T, s3Client *s3.S3, region string, s3BucketName string) { 150 expectedFileCount := rand.Intn(10000) 151 logger.Logf(t, "Uploading %s files to bucket %s", strconv.Itoa(expectedFileCount), s3BucketName) 152 153 deleted := 0 154 155 // Upload expectedFileCount files 156 for i := 1; i <= expectedFileCount; i++ { 157 key := fmt.Sprintf("test-%s", strconv.Itoa(i)) 158 body := strings.NewReader("This is the body") 159 160 params := &s3manager.UploadInput{ 161 Bucket: aws.String(s3BucketName), 162 Key: &key, 163 Body: body, 164 } 165 166 uploader := NewS3Uploader(t, region) 167 168 _, err := uploader.Upload(params) 169 if err != nil { 170 t.Fatal(err) 171 } 172 173 // Delete the first 10 files to be able to test if all files, including delete markers are deleted 174 if i < 10 { 175 _, err := s3Client.DeleteObject(&s3.DeleteObjectInput{ 176 Bucket: aws.String(s3BucketName), 177 Key: aws.String(key), 178 }) 179 if err != nil { 180 t.Fatal(err) 181 } 182 deleted++ 183 } 184 185 if i != 0 && i%100 == 0 { 186 logger.Logf(t, "Uploaded %s files to bucket %s successfully", strconv.Itoa(i), s3BucketName) 187 } 188 } 189 190 logger.Logf(t, "Uploaded %s files to bucket %s successfully", strconv.Itoa(expectedFileCount), s3BucketName) 191 192 // verify bucket contains 1 file now 193 listObjectsParams := &s3.ListObjectsV2Input{ 194 Bucket: aws.String(s3BucketName), 195 } 196 197 logger.Logf(t, "Verifying %s files were uploaded to bucket %s", strconv.Itoa(expectedFileCount), s3BucketName) 198 actualCount := 0 199 for { 200 bucketObjects, err := s3Client.ListObjectsV2(listObjectsParams) 201 if err != nil { 202 t.Fatal(err) 203 } 204 205 pageLength := len((*bucketObjects).Contents) 206 actualCount += pageLength 207 208 if !*bucketObjects.IsTruncated { 209 break 210 } 211 212 listObjectsParams.ContinuationToken = bucketObjects.NextContinuationToken 213 } 214 215 require.Equal(t, expectedFileCount-deleted, actualCount) 216 217 //empty bucket 218 logger.Logf(t, "Emptying bucket %s", s3BucketName) 219 EmptyS3Bucket(t, region, s3BucketName) 220 221 // verify the bucket is empty 222 bucketObjects, err := s3Client.ListObjectsV2(listObjectsParams) 223 if err != nil { 224 t.Fatal(err) 225 } 226 require.Equal(t, 0, len((*bucketObjects).Contents)) 227 }