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  }