From 4c530cd5970d3bb7e424bd07e2dcf69ab3e9431d Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Thu, 18 Apr 2024 11:17:38 -0400 Subject: [PATCH] Add test for #36975. --- internal/conns/apiretry_test.go | 46 ++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/internal/conns/apiretry_test.go b/internal/conns/apiretry_test.go index fec1d6b10f93..b484f16631ff 100644 --- a/internal/conns/apiretry_test.go +++ b/internal/conns/apiretry_test.go @@ -5,10 +5,15 @@ package conns import ( "errors" + "net/http" "testing" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/retry" + awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" + appconfigtypes "github.com/aws/aws-sdk-go-v2/service/appconfig/types" + smithy "github.com/aws/smithy-go" + smithyhttp "github.com/aws/smithy-go/transport/http" "github.com/hashicorp/terraform-provider-aws/internal/errs" ) @@ -24,18 +29,57 @@ func TestAddIsErrorRetryables(t *testing.T) { testCases := []struct { name string err error + f retry.IsErrorRetryableFunc expected bool }{ { name: "no error", + f: f, }, { name: "non-retryable", err: errors.New(`this is not retryable`), + f: f, }, { name: "retryable", err: errors.New(`this is testing`), + f: f, + expected: true, + }, + { + // https://github.com/hashicorp/terraform-provider-aws/issues/36975. + name: "appconfig ConflictException", + err: &smithy.OperationError{ + ServiceID: "AppConfig", + OperationName: "StartDeployment", + Err: &awshttp.ResponseError{ + ResponseError: &smithyhttp.ResponseError{ + Response: &smithyhttp.Response{ + Response: &http.Response{ + StatusCode: 409, + }, + }, + Err: &appconfigtypes.ConflictException{ + Message: aws.String("Deployment number 1 already exists"), + }, + }, + RequestID: "43e844da-818b-458e-aae2-553960ccc4d6", + }, + }, + f: func(err error) aws.Ternary { + if err != nil { + var oe *smithy.OperationError + if errors.As(err, &oe) { + if oe.OperationName == "StartDeployment" { + if errs.IsA[*appconfigtypes.ConflictException](err) { + return aws.TrueTernary + } + } + } + } + return aws.UnknownTernary + }, expected: true, }, } @@ -45,7 +89,7 @@ func TestAddIsErrorRetryables(t *testing.T) { t.Run(testCase.name, func(t *testing.T) { t.Parallel() - got := AddIsErrorRetryables(retry.NewStandard(), retry.IsErrorRetryableFunc(f)).IsErrorRetryable(testCase.err) + got := AddIsErrorRetryables(retry.NewStandard(), retry.IsErrorRetryableFunc(testCase.f)).IsErrorRetryable(testCase.err) if got, want := got, testCase.expected; got != want { t.Errorf("IsErrorRetryable(%q) = %v, want %v", testCase.err, got, want) }