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