github.com/Jeffail/benthos/v3@v3.65.0/lib/test/integration/cache/s3_test.go (about)

     1  package cache
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/Jeffail/benthos/v3/internal/integration"
    10  	"github.com/aws/aws-sdk-go/aws"
    11  	"github.com/aws/aws-sdk-go/aws/credentials"
    12  	"github.com/aws/aws-sdk-go/aws/session"
    13  	"github.com/aws/aws-sdk-go/service/s3"
    14  	"github.com/ory/dockertest/v3"
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func createBucket(ctx context.Context, s3Port, bucket string) error {
    20  	endpoint := fmt.Sprintf("http://localhost:%v", s3Port)
    21  
    22  	client := s3.New(session.Must(session.NewSession(&aws.Config{
    23  		S3ForcePathStyle: aws.Bool(true),
    24  		Credentials:      credentials.NewStaticCredentials("xxxxx", "xxxxx", "xxxxx"),
    25  		Endpoint:         aws.String(endpoint),
    26  		Region:           aws.String("eu-west-1"),
    27  	})))
    28  	_, err := client.CreateBucket(&s3.CreateBucketInput{
    29  		Bucket: &bucket,
    30  	})
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	return client.WaitUntilBucketExistsWithContext(ctx, &s3.HeadBucketInput{
    36  		Bucket: &bucket,
    37  	})
    38  }
    39  
    40  var _ = registerIntegrationTest("s3", func(t *testing.T) {
    41  	t.Parallel()
    42  
    43  	pool, err := dockertest.NewPool("")
    44  	require.NoError(t, err)
    45  
    46  	pool.MaxWait = time.Second * 30
    47  
    48  	resource, err := pool.RunWithOptions(&dockertest.RunOptions{
    49  		Repository:   "localstack/localstack",
    50  		ExposedPorts: []string{"4566/tcp"},
    51  		Env:          []string{"SERVICES=s3"},
    52  	})
    53  	require.NoError(t, err)
    54  	t.Cleanup(func() {
    55  		assert.NoError(t, pool.Purge(resource))
    56  	})
    57  
    58  	servicePort := resource.GetPort("4566/tcp")
    59  
    60  	resource.Expire(900)
    61  	require.NoError(t, pool.Retry(func() error {
    62  		return createBucket(context.Background(), servicePort, "probe-bucket")
    63  	}))
    64  
    65  	template := `
    66  cache_resources:
    67    - label: testcache
    68      aws_s3:
    69        endpoint: http://localhost:$PORT
    70        region: eu-west-1
    71        force_path_style_urls: true
    72        bucket: $ID
    73        credentials:
    74          id: xxxxx
    75          secret: xxxxx
    76          token: xxxxx
    77  `
    78  	suite := integration.CacheTests(
    79  		integration.CacheTestOpenClose(),
    80  		integration.CacheTestMissingKey(),
    81  		integration.CacheTestDoubleAdd(),
    82  		integration.CacheTestDelete(),
    83  		integration.CacheTestGetAndSet(1),
    84  	)
    85  	suite.Run(
    86  		t, template,
    87  		integration.CacheTestOptPort(servicePort),
    88  		integration.CacheTestOptPreTest(func(t testing.TB, ctx context.Context, testID string, vars *integration.CacheTestConfigVars) {
    89  			require.NoError(t, createBucket(ctx, servicePort, testID))
    90  		}),
    91  	)
    92  })