gitlab.com/beacon-software/gadget@v0.0.0-20181217202115-54565ea1ed5e/storage/s3_int_test.go (about)

     1  // +build integration
     2  
     3  package storage
     4  
     5  import (
     6  	"fmt"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/aws/aws-sdk-go/aws"
    11  	"github.com/aws/aws-sdk-go/aws/session"
    12  	"github.com/aws/aws-sdk-go/service/s3"
    13  	"github.com/stretchr/testify/assert"
    14  
    15  	"gitlab.com/beacon-software/gadget/generator"
    16  )
    17  
    18  const testBucket = "kasita-integration.test"
    19  
    20  func TestRead(t *testing.T) {
    21  	assert := assert.New(t)
    22  	s3ReaderWriter := NewS3(testBucket, "s3-reader-writer-closer/read.txt")
    23  
    24  	expected := []byte("This is a test file.\n")
    25  	actual, err := s3ReaderWriter.ReadObject()
    26  	assert.NoError(err)
    27  	assert.Equal(expected, actual)
    28  }
    29  
    30  func TestReadError(t *testing.T) {
    31  	assert := assert.New(t)
    32  	s3ReaderWriter := NewS3(testBucket, "s3-reader-writer-closer/read-does-not-exist.txt")
    33  
    34  	actual, err := s3ReaderWriter.ReadObject()
    35  	assert.Error(err)
    36  	assert.Nil(actual)
    37  }
    38  
    39  func TestWrite(t *testing.T) {
    40  	assert := assert.New(t)
    41  	key := fmt.Sprintf("s3-reader-writer-closer/%s/test.txt", generator.String(10))
    42  	s3ReaderWriter := NewS3(testBucket, key)
    43  
    44  	expected := []byte(fmt.Sprintf("This is a test file.\n%s\n", generator.String(40)))
    45  	err := s3ReaderWriter.WriteObject(expected)
    46  	assert.NoError(err)
    47  
    48  	actual, err := s3ReaderWriter.ReadObject()
    49  	assert.NoError(err)
    50  	assert.Equal(expected, actual)
    51  
    52  	list, err := s3ReaderWriter.List("s3-reader-writer-closer", "")
    53  	assert.NoError(err)
    54  	assert.Equal(int64(3), *list.KeyCount)
    55  	keys := make([]string, len(list.Contents))
    56  	for i, res := range list.Contents {
    57  		keys[i] = *res.Key
    58  	}
    59  	assert.Contains(keys, key)
    60  
    61  	PruneAlpha(testBucket, key, 0)
    62  }
    63  
    64  func TestPrune(t *testing.T) {
    65  	assert := assert.New(t)
    66  
    67  	prefix := "PruneAlpha"
    68  	numFiles := 5
    69  
    70  	input := &s3.ListObjectsV2Input{
    71  		Bucket: aws.String(testBucket),
    72  		Prefix: aws.String(prefix),
    73  	}
    74  	svc := s3.New(session.New())
    75  
    76  	var lastUploadedFilename string
    77  	for i := 0; i < numFiles; i++ {
    78  		lastUploadedFilename = fmt.Sprintf("%s/%d", prefix, int32(time.Now().Unix())+int32(i))
    79  		s3 := NewS3(testBucket, lastUploadedFilename)
    80  		err := s3.WriteObject([]byte(generator.String(100)))
    81  		assert.NoError(err)
    82  	}
    83  
    84  	objects, err := svc.ListObjectsV2(input)
    85  
    86  	assert.Equal(numFiles, len(objects.Contents))
    87  	assert.NoError(err)
    88  
    89  	PruneAlpha(testBucket, prefix, numFiles-2)
    90  
    91  	objects, err = svc.ListObjectsV2(input)
    92  	assert.Equal(numFiles-2, len(objects.Contents))
    93  
    94  	var objectKeys = map[string]bool{}
    95  	for _, value := range objects.Contents {
    96  		objectKeys[*value.Key] = true
    97  	}
    98  	assert.True(objectKeys[lastUploadedFilename])
    99  	assert.NoError(err)
   100  
   101  	PruneAlpha(testBucket, prefix, 0)
   102  
   103  	PruneAlpha("foo", "bar", numFiles)
   104  }