Skip to content

Commit

Permalink
Merge pull request #8 from mumoshu/localstack-4-dynamodb
Browse files Browse the repository at this point in the history
Use localstack for DynamoDB metrics testing
  • Loading branch information
cw-atkhry authored Sep 24, 2024
2 parents 9df3364 + 0c3a810 commit 5375b64
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 5 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,5 @@ jobs:
# operation error S3: CreateBucket, exceeded maximum number of attempts, 3, https response error StatusCode: 500, RequestID: 346f5995-bbe8-41e2-be03-3a6ab0ad5edd, HostID: s9lzHYrFp76ZVxRcpX9+5cjAnEH2ROuNkd2BHfIa6UkFVdtjf5mKR3/eTPFvsiP/XV/VLi31234=, api error InternalError: exception while calling s3 with unknown operation: Unable to find operation for request to service s3: PUT /
S3_BUCKET: mybucket
S3_KEY: mykey
# This one is for setupDynamoDBTable in main_test
DYNAMODB_TABLE: mytable
25 changes: 25 additions & 0 deletions localstack/dynamodb.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package localstack

import (
"context"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
smithyendpoints "github.com/aws/smithy-go/endpoints"
)

func DynamoDBEndpointResolver() *dynamoDBEndpointResolver {
return &dynamoDBEndpointResolver{
baseResolver: dynamodb.NewDefaultEndpointResolverV2(),
}
}

type dynamoDBEndpointResolver struct {
baseResolver dynamodb.EndpointResolverV2
}

func (r *dynamoDBEndpointResolver) ResolveEndpoint(ctx context.Context, params dynamodb.EndpointParameters) (smithyendpoints.Endpoint, error) {
params.Endpoint = aws.String("http://localhost:4566")

return r.baseResolver.ResolveEndpoint(ctx, params)
}
5 changes: 3 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ type checker struct {
dynamodbTable string
sqsQueueURL string

s3Opts []func(*s3.Options)
s3Opts []func(*s3.Options)
dynamodbOpts []func(*dynamodb.Options)
}

type Option func(*checker)
Expand All @@ -130,7 +131,7 @@ func newChecker(cfg aws.Config, opts ...Option) *checker {
}

c.s3Client = s3.NewFromConfig(cfg, c.s3Opts...)
c.dynamoClient = dynamodb.NewFromConfig(cfg)
c.dynamoClient = dynamodb.NewFromConfig(cfg, c.dynamodbOpts...)
c.sqsClient = sqs.NewFromConfig(cfg)

c.s3Bucket = os.Getenv("S3_BUCKET")
Expand Down
48 changes: 45 additions & 3 deletions main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import (

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
dynamodbtypes "github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
"github.com/aws/aws-sdk-go-v2/service/s3"
s3types "github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/cw-sakamoto/sample/localstack"
Expand All @@ -34,13 +36,16 @@ func TestSigint(t *testing.T) {
require.NoError(t, err)

s3EndpointResolver := localstack.S3EndpointResolver()
dynamodbEndpointResolver := localstack.DynamoDBEndpointResolver()

setupS3BucketAndObject(t, ctx, awsConfig, s3EndpointResolver)
setupDynamoDBTable(t, ctx, awsConfig, dynamodbEndpointResolver)

go func() {
runErr <- Run(ContextWithSignal(ctx, sigs), func(c *checker) {
// Use localstack for S3
// Use localstack for S3 and DynamoDB
c.s3Opts = append(c.s3Opts, s3.WithEndpointResolverV2(s3EndpointResolver))
c.dynamodbOpts = append(c.dynamodbOpts, dynamodb.WithEndpointResolverV2(dynamodbEndpointResolver))
})

cancel()
Expand All @@ -54,13 +59,13 @@ func TestSigint(t *testing.T) {
okLabels = []labels{
{"S3", "GetObject", "Success"},
{"SQS", "ReceiveMessage", "Failure"},
{"DynamoDB", "Scan", "Failure"},
{"DynamoDB", "Scan", "Success"},
}

ngLabels = []labels{
{"S3", "GetObject", "Failure"},
{"SQS", "ReceiveMessage", "Success"},
{"DynamoDB", "Scan", "Success"},
{"DynamoDB", "Scan", "Failure"},
}
)

Expand Down Expand Up @@ -190,6 +195,43 @@ func setupS3BucketAndObject(t *testing.T, ctx context.Context, awsConfig aws.Con
})
}

func setupDynamoDBTable(t *testing.T, ctx context.Context, awsConfig aws.Config, dynamodbEndpointResolver dynamodb.EndpointResolverV2) {
dynamodbClient := dynamodb.NewFromConfig(awsConfig, dynamodb.WithEndpointResolverV2(dynamodbEndpointResolver))

// We assume that DYNAMODB_TABLE is set in the environment variables
// before running the tests.
dynamodbTable := os.Getenv("DYNAMODB_TABLE")

_, err := dynamodbClient.CreateTable(ctx, &dynamodb.CreateTableInput{
TableName: &dynamodbTable,
KeySchema: []dynamodbtypes.KeySchemaElement{
{
AttributeName: aws.String("id"),
KeyType: dynamodbtypes.KeyTypeHash,
},
},
AttributeDefinitions: []dynamodbtypes.AttributeDefinition{
{
AttributeName: aws.String("id"),
AttributeType: dynamodbtypes.ScalarAttributeTypeS,
},
},
ProvisionedThroughput: &dynamodbtypes.ProvisionedThroughput{
ReadCapacityUnits: aws.Int64(1),
WriteCapacityUnits: aws.Int64(1),
},
})
require.NoError(t, err)
t.Cleanup(func() {
_, err = dynamodbClient.DeleteTable(context.Background(), &dynamodb.DeleteTableInput{
TableName: &dynamodbTable,
})
if err != nil {
t.Logf("Error: %v", err)
}
})
}

func httpGetStr(t *testing.T, url string) string {
resp, err := http.Get(url)
if err != nil {
Expand Down

0 comments on commit 5375b64

Please sign in to comment.