...
1 package http
2
3 import (
4 "bytes"
5 "context"
6 "io"
7 "strings"
8 "testing"
9
10 smithyio "github.com/aws/smithy-go/io"
11 "github.com/aws/smithy-go/middleware"
12 )
13
14 func TestChecksumMiddleware(t *testing.T) {
15 cases := map[string]struct {
16 payload io.Reader
17 expectedPayloadLength int64
18 expectedMD5Checksum string
19 expectError string
20 }{
21 "empty body": {
22 payload: smithyio.ReadSeekNopCloser{
23 ReadSeeker: bytes.NewReader([]byte(``)),
24 },
25 expectedPayloadLength: 0,
26 expectedMD5Checksum: "1B2M2Y8AsgTpgAmY7PhCfg==",
27 },
28 "standard req body": {
29 payload: smithyio.ReadSeekNopCloser{
30 ReadSeeker: bytes.NewReader([]byte(`abc`)),
31 },
32 expectedPayloadLength: 3,
33 expectedMD5Checksum: "kAFQmDzST7DWlj99KOF/cg==",
34 },
35 "nil body": {},
36 "unseekable payload": {
37 payload: bytes.NewBuffer([]byte(`xyz`)),
38 expectError: "unseekable stream is not supported",
39 },
40 }
41
42 for name, c := range cases {
43 t.Run(name, func(t *testing.T) {
44 var err error
45 req := NewStackRequest().(*Request)
46
47 req, err = req.SetStream(c.payload)
48 if err != nil {
49 t.Fatalf("error setting request stream")
50 }
51 m := contentMD5Checksum{}
52 _, _, err = m.HandleBuild(context.Background(),
53 middleware.BuildInput{Request: req},
54 nopBuildHandler,
55 )
56
57 if len(c.expectError) != 0 {
58 if err == nil {
59 t.Fatalf("expect error, got none")
60 }
61 if e, a := c.expectError, err.Error(); !strings.Contains(a, e) {
62 t.Fatalf("expect error to contain %q, got %v", e, a)
63 }
64 return
65 } else if err != nil {
66 t.Fatalf("expect no error, got %v", err)
67 }
68
69 if e, a := c.expectedMD5Checksum, req.Header.Get(contentMD5Header); e != a {
70 t.Errorf("expect md5 checksum : %v, got %v", e, a)
71 }
72
73 size, ok, err := req.StreamLength()
74 if err != nil {
75 t.Fatalf("error fetching request stream length")
76 }
77 if !ok {
78 t.Fatalf("request stream is not seekable")
79 }
80 if e, a := c.expectedPayloadLength, size; e != a {
81 t.Fatalf("expected request stream content length to be %v, got length %v", e, a)
82 }
83 })
84 }
85 }
86
View as plain text