github.com/aavshr/aws-sdk-go@v1.41.3/service/s3/cust_integ_object_checksum_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  package s3_test
     5  
     6  import (
     7  	"bytes"
     8  	"crypto/md5"
     9  	"encoding/base64"
    10  	"fmt"
    11  	"io"
    12  	"testing"
    13  
    14  	"github.com/aavshr/aws-sdk-go/aws"
    15  	"github.com/aavshr/aws-sdk-go/service/s3"
    16  )
    17  
    18  func base64Sum(content []byte) string {
    19  	sum := md5.Sum(content)
    20  	return base64.StdEncoding.EncodeToString(sum[:])
    21  }
    22  
    23  func SkipTestContentMD5Validate(t *testing.T) {
    24  	body := []byte("really cool body content")
    25  
    26  	cases := []struct {
    27  		Name     string
    28  		Body     []byte
    29  		Sum64    string
    30  		RangeGet []int64
    31  	}{
    32  		{
    33  			Body:  body,
    34  			Sum64: base64Sum(body),
    35  			Name:  "contentMD5validation.pop",
    36  		},
    37  		{
    38  			Body:  []byte{},
    39  			Sum64: base64Sum([]byte{}),
    40  			Name:  "contentMD5validation.empty",
    41  		},
    42  		{
    43  			Body:     body,
    44  			Sum64:    base64Sum(body),
    45  			RangeGet: []int64{0, 9},
    46  			Name:     "contentMD5validation.range",
    47  		},
    48  	}
    49  
    50  	for i, c := range cases {
    51  		keyName := aws.String(c.Name)
    52  		req, _ := s3Svc.PutObjectRequest(&s3.PutObjectInput{
    53  			Bucket: &integMetadata.Buckets.Source.Name,
    54  			Key:    keyName,
    55  			Body:   bytes.NewReader(c.Body),
    56  		})
    57  
    58  		req.Build()
    59  		if e, a := c.Sum64, req.HTTPRequest.Header.Get("Content-Md5"); e != a {
    60  			t.Errorf("%d, expect %v sum, got %v", i, e, a)
    61  		}
    62  
    63  		if err := req.Send(); err != nil {
    64  			t.Fatalf("%d, expect no error, got %v", i, err)
    65  		}
    66  
    67  		getObjIn := &s3.GetObjectInput{
    68  			Bucket: &integMetadata.Buckets.Source.Name,
    69  			Key:    keyName,
    70  		}
    71  
    72  		expectBody := c.Body
    73  		if c.RangeGet != nil {
    74  			getObjIn.Range = aws.String(fmt.Sprintf("bytes=%d-%d", c.RangeGet[0], c.RangeGet[1]-1))
    75  			expectBody = c.Body[c.RangeGet[0]:c.RangeGet[1]]
    76  		}
    77  
    78  		getReq, getOut := s3Svc.GetObjectRequest(getObjIn)
    79  
    80  		getReq.Build()
    81  		if e, a := "append-md5", getReq.HTTPRequest.Header.Get("X-Amz-Te"); e != a {
    82  			t.Errorf("%d, expect %v encoding, got %v", i, e, a)
    83  		}
    84  		if err := getReq.Send(); err != nil {
    85  			t.Fatalf("%d, expect no error, got %v", i, err)
    86  		}
    87  		defer getOut.Body.Close()
    88  
    89  		if e, a := "append-md5", getReq.HTTPResponse.Header.Get("X-Amz-Transfer-Encoding"); e != a {
    90  			t.Fatalf("%d, expect response tx encoding header %v, got %v", i, e, a)
    91  		}
    92  
    93  		var readBody bytes.Buffer
    94  		_, err := io.Copy(&readBody, getOut.Body)
    95  		if err != nil {
    96  			t.Fatalf("%d, expect no error, got %v", i, err)
    97  		}
    98  
    99  		if e, a := expectBody, readBody.Bytes(); !bytes.Equal(e, a) {
   100  			t.Errorf("%d, expect %v body, got %v", i, e, a)
   101  		}
   102  	}
   103  }