File: zt_policy_request_id_test.go

package info (click to toggle)
golang-github-azure-azure-storage-blob-go 0.15.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 2,084 kB
  • sloc: makefile: 3
file content (106 lines) | stat: -rw-r--r-- 3,703 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package azblob

import (
	"context"
	"errors"
	"net/http"
	"net/url"

	"github.com/Azure/azure-pipeline-go/pipeline"
	chk "gopkg.in/check.v1"
)

type requestIDTestScenario int

const (
	// Testing scenarios for echoing Client Request ID
	clientRequestIDMissing             requestIDTestScenario = 1
	errorFromNextPolicy                requestIDTestScenario = 2
	clientRequestIDMatch               requestIDTestScenario = 3
	clientRequestIDNoMatch             requestIDTestScenario = 4
	errorMessageClientRequestIDNoMatch                       = "client Request ID from request and response does not match"
	errorMessageFromNextPolicy                               = "error is not nil"
)

type clientRequestIDPolicy struct {
	matchID  string
	scenario requestIDTestScenario
}

func (p clientRequestIDPolicy) Do(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {
	var header http.Header = make(map[string][]string)
	var err error

	// Set headers and errors according to each scenario
	switch p.scenario {
	case clientRequestIDMissing:
	case errorFromNextPolicy:
		err = errors.New(errorMessageFromNextPolicy)
	case clientRequestIDMatch:
		header.Add(xMsClientRequestID, request.Header.Get(xMsClientRequestID))
	case clientRequestIDNoMatch:
		header.Add(xMsClientRequestID, "fake-client-request-id")
	default:
		header.Add(xMsClientRequestID, newUUID().String())
	}

	response := http.Response{Header: header}

	return pipeline.NewHTTPResponse(&response), err
}

func (s *aztestsSuite) TestEchoClientRequestIDMissing(c *chk.C) {
	factory := NewUniqueRequestIDPolicyFactory()

	// Scenario 1: Client Request ID is missing
	policy := factory.New(clientRequestIDPolicy{scenario: clientRequestIDMissing}, nil)
	request, _ := pipeline.NewRequest("GET", url.URL{}, nil)
	resp, err := policy.Do(context.Background(), request)

	c.Assert(err, chk.IsNil)
	c.Assert(resp, chk.NotNil)
	c.Assert(resp.Response().Header.Get(xMsClientRequestID), chk.Equals, "")
}

func (s *aztestsSuite) TestEchoClientRequestIDErrorFromNextPolicy(c *chk.C) {
	factory := NewUniqueRequestIDPolicyFactory()

	// Scenario 2: Do method returns an error
	policy := factory.New(clientRequestIDPolicy{scenario: errorFromNextPolicy}, nil)
	request, _ := pipeline.NewRequest("GET", url.URL{}, nil)
	resp, err := policy.Do(context.Background(), request)

	c.Assert(err, chk.NotNil)
	c.Assert(err.Error(), chk.Equals, errorMessageFromNextPolicy)
	c.Assert(resp, chk.NotNil)
}

func (s *aztestsSuite) TestEchoClientRequestIDMatch(c *chk.C) {
	factory := NewUniqueRequestIDPolicyFactory()

	// Scenario 3: Client Request ID matches
	matchRequestID := newUUID().String()
	policy := factory.New(clientRequestIDPolicy{matchID: matchRequestID, scenario: clientRequestIDMatch}, nil)
	request, _ := pipeline.NewRequest("GET", url.URL{}, nil)
	request.Header.Set(xMsClientRequestID, matchRequestID)
	resp, err := policy.Do(context.Background(), request)

	c.Assert(err, chk.IsNil)
	c.Assert(resp, chk.NotNil)
	c.Assert(resp.Response().Header.Get(xMsClientRequestID), chk.Equals, request.Header.Get(xMsClientRequestID))
}

func (s *aztestsSuite) TestEchoClientRequestIDNoMatch(c *chk.C) {
	factory := NewUniqueRequestIDPolicyFactory()

	// Scenario 4: Client Request ID does not match
	matchRequestID := newUUID().String()
	policy := factory.New(clientRequestIDPolicy{matchID: matchRequestID, scenario: clientRequestIDNoMatch}, nil)
	request, _ := pipeline.NewRequest("GET", url.URL{}, nil)
	request.Header.Set(xMsClientRequestID, matchRequestID)
	resp, err := policy.Do(context.Background(), request)

	c.Assert(err, chk.NotNil)
	c.Assert(err.Error(), chk.Equals, errorMessageClientRequestIDNoMatch)
	c.Assert(resp, chk.NotNil)
}