1// +build go1.13 2 3// Copyright (c) Microsoft Corporation. All rights reserved. 4// Licensed under the MIT License. 5 6package azcore 7 8import ( 9 "bytes" 10 "context" 11 "io/ioutil" 12 "net/http" 13 "reflect" 14 "testing" 15 16 "github.com/Azure/azure-sdk-for-go/sdk/internal/mock" 17) 18 19func TestProgressReporting(t *testing.T) { 20 const contentSize = 4096 21 content := make([]byte, contentSize) 22 for i := 0; i < contentSize; i++ { 23 content[i] = byte(i % 255) 24 } 25 body := bytes.NewReader(content) 26 srv, close := mock.NewServer() 27 defer close() 28 srv.SetResponse(mock.WithBody(content)) 29 pl := NewPipeline(srv) 30 req, err := NewRequest(context.Background(), http.MethodGet, srv.URL()) 31 if err != nil { 32 t.Fatalf("unexpected error: %v", err) 33 } 34 req.SkipBodyDownload() 35 var bytesSent int64 36 reqRpt := NewRequestBodyProgress(NopCloser(body), func(bytesTransferred int64) { 37 bytesSent = bytesTransferred 38 }) 39 if err := req.SetBody(reqRpt, "application/octet-stream"); err != nil { 40 t.Fatal(err) 41 } 42 resp, err := pl.Do(req) 43 if err != nil { 44 t.Fatalf("unexpected error: %v", err) 45 } 46 var bytesReceived int64 47 respRpt := NewResponseBodyProgress(resp.Body, func(bytesTransferred int64) { 48 bytesReceived = bytesTransferred 49 }) 50 defer respRpt.Close() 51 b, err := ioutil.ReadAll(respRpt) 52 if err != nil { 53 t.Fatalf("unexpected error: %v", err) 54 } 55 if bytesSent != contentSize { 56 t.Fatalf("wrong bytes sent: %d", bytesSent) 57 } 58 if bytesReceived != contentSize { 59 t.Fatalf("wrong bytes received: %d", bytesReceived) 60 } 61 if !reflect.DeepEqual(content, b) { 62 t.Fatal("request and response bodies don't match") 63 } 64} 65