customizations_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package dynamodb_test
  2. import (
  3. "bytes"
  4. "io/ioutil"
  5. "net/http"
  6. "os"
  7. "testing"
  8. "github.com/aws/aws-sdk-go/aws"
  9. "github.com/aws/aws-sdk-go/aws/awserr"
  10. "github.com/aws/aws-sdk-go/aws/request"
  11. "github.com/aws/aws-sdk-go/internal/test/unit"
  12. "github.com/aws/aws-sdk-go/service/dynamodb"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. var _ = unit.Imported
  16. var db *dynamodb.DynamoDB
  17. func TestMain(m *testing.M) {
  18. db = dynamodb.New(&aws.Config{
  19. MaxRetries: aws.Int(2),
  20. })
  21. db.Handlers.Send.Clear() // mock sending
  22. os.Exit(m.Run())
  23. }
  24. func mockCRCResponse(svc *dynamodb.DynamoDB, status int, body, crc string) (req *request.Request) {
  25. header := http.Header{}
  26. header.Set("x-amz-crc32", crc)
  27. req, _ = svc.ListTablesRequest(nil)
  28. req.Handlers.Send.PushBack(func(*request.Request) {
  29. req.HTTPResponse = &http.Response{
  30. StatusCode: status,
  31. Body: ioutil.NopCloser(bytes.NewReader([]byte(body))),
  32. Header: header,
  33. }
  34. })
  35. req.Send()
  36. return
  37. }
  38. func TestCustomRetryRules(t *testing.T) {
  39. d := dynamodb.New(&aws.Config{MaxRetries: aws.Int(-1)})
  40. assert.Equal(t, d.MaxRetries(), uint(10))
  41. }
  42. func TestValidateCRC32NoHeaderSkip(t *testing.T) {
  43. req := mockCRCResponse(db, 200, "{}", "")
  44. assert.NoError(t, req.Error)
  45. }
  46. func TestValidateCRC32InvalidHeaderSkip(t *testing.T) {
  47. req := mockCRCResponse(db, 200, "{}", "ABC")
  48. assert.NoError(t, req.Error)
  49. }
  50. func TestValidateCRC32AlreadyErrorSkip(t *testing.T) {
  51. req := mockCRCResponse(db, 400, "{}", "1234")
  52. assert.Error(t, req.Error)
  53. assert.NotEqual(t, "CRC32CheckFailed", req.Error.(awserr.Error).Code())
  54. }
  55. func TestValidateCRC32IsValid(t *testing.T) {
  56. req := mockCRCResponse(db, 200, `{"TableNames":["A"]}`, "3090163698")
  57. assert.NoError(t, req.Error)
  58. // CRC check does not affect output parsing
  59. out := req.Data.(*dynamodb.ListTablesOutput)
  60. assert.Equal(t, "A", *out.TableNames[0])
  61. }
  62. func TestValidateCRC32DoesNotMatch(t *testing.T) {
  63. req := mockCRCResponse(db, 200, "{}", "1234")
  64. assert.Error(t, req.Error)
  65. assert.Equal(t, "CRC32CheckFailed", req.Error.(awserr.Error).Code())
  66. assert.Equal(t, 2, int(req.RetryCount))
  67. }
  68. func TestValidateCRC32DoesNotMatchNoComputeChecksum(t *testing.T) {
  69. svc := dynamodb.New(&aws.Config{
  70. MaxRetries: aws.Int(2),
  71. DisableComputeChecksums: aws.Bool(true),
  72. })
  73. svc.Handlers.Send.Clear() // mock sending
  74. req := mockCRCResponse(svc, 200, `{"TableNames":["A"]}`, "1234")
  75. assert.NoError(t, req.Error)
  76. assert.Equal(t, 0, int(req.RetryCount))
  77. // CRC check disabled. Does not affect output parsing
  78. out := req.Data.(*dynamodb.ListTablesOutput)
  79. assert.Equal(t, "A", *out.TableNames[0])
  80. }