From 4ee6cb1aea1b1347beba735838dc750108ca1103 Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Thu, 18 Nov 2021 15:11:48 -0500 Subject: [PATCH 01/11] added basic client for routing --- sdk/internal/recording/recording.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/sdk/internal/recording/recording.go b/sdk/internal/recording/recording.go index c5643ae9dfc7..13f006186752 100644 --- a/sdk/internal/recording/recording.go +++ b/sdk/internal/recording/recording.go @@ -655,6 +655,30 @@ func getRootCas(t *testing.T) (*x509.CertPool, error) { return rootCAs, nil } +type customHttpClient struct { + defaultClient *http.Client + options RecordingOptions + t *testing.T +} + +func (c customHttpClient) Do(req *http.Request) (*http.Response, error) { + c.options.ReplaceAuthority(c.t, req) + return c.defaultClient.Do(req) +} + +func GetRoutingHTTPClient(t *testing.T, options *RecordingOptions) (*customHttpClient, error) { + c, err := GetHTTPClient(t) + if err != nil { + return nil, err + } + + return &customHttpClient{ + defaultClient: c, + options: *options, + t: t, + }, nil +} + func GetHTTPClient(t *testing.T) (*http.Client, error) { transport := http.DefaultTransport.(*http.Transport).Clone() From f816743b0f20750623acfa2c0a62b040a50c7276 Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Thu, 18 Nov 2021 15:23:57 -0500 Subject: [PATCH 02/11] using simplifed single client --- sdk/data/aztables/go.mod | 2 ++ sdk/data/aztables/go.sum | 2 -- sdk/data/aztables/proxy_test.go | 10 ++++++---- sdk/internal/recording/recording.go | 3 +++ 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sdk/data/aztables/go.mod b/sdk/data/aztables/go.mod index b6338e702884..d36864776660 100644 --- a/sdk/data/aztables/go.mod +++ b/sdk/data/aztables/go.mod @@ -2,6 +2,8 @@ module github.com/Azure/azure-sdk-for-go/sdk/data/aztables go 1.16 +replace github.com/Azure/azure-sdk-for-go/sdk/internal => ../../internal + require ( github.com/Azure/azure-sdk-for-go/sdk/azcore v0.20.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.12.0 diff --git a/sdk/data/aztables/go.sum b/sdk/data/aztables/go.sum index bb3880362bcf..3d79eabc7e9b 100644 --- a/sdk/data/aztables/go.sum +++ b/sdk/data/aztables/go.sum @@ -2,8 +2,6 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v0.20.0 h1:KQgdWmEOmaJKxaUUZwHAYh12 github.com/Azure/azure-sdk-for-go/sdk/azcore v0.20.0/go.mod h1:ZPW/Z0kLCTdDZaDbYTetxc9Cxl/2lNqxYHYNOF2bti0= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.12.0 h1:VBvHGLJbaY0+c66NZHdS9cgjHVYSH6DDa0XJMyrblsI= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.12.0/go.mod h1:GJzjM4SR9T0KyX5gKCVyz1ytD8FeWeUPCwtFCt1AyfE= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.1 h1:BUYIbDf/mMZ8945v3QkG3OuqGVyS4Iek0AOLwdRAYoc= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.1/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/sdk/data/aztables/proxy_test.go b/sdk/data/aztables/proxy_test.go index 12664686d464..0576606f14df 100644 --- a/sdk/data/aztables/proxy_test.go +++ b/sdk/data/aztables/proxy_test.go @@ -114,13 +114,15 @@ func NewFakeCredential(accountName, accountKey string) *FakeCredential { } func createClientForRecording(t *testing.T, tableName string, serviceURL string, cred SharedKeyCredential) (*Client, error) { - p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) - client, err := recording.GetHTTPClient(t) + // p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) + // client, err := recording.GetHTTPClient(t) + fullClient, err := recording.GetRoutingHTTPClient(t, nil) require.NoError(t, err) options := &ClientOptions{ClientOptions: azcore.ClientOptions{ - PerCallPolicies: []policy.Policy{p}, - Transport: client, + // PerCallPolicies: []policy.Policy{p}, + // Transport: client, + Transport: fullClient, }} if !strings.HasSuffix(serviceURL, "/") && tableName != "" { serviceURL += "/" diff --git a/sdk/internal/recording/recording.go b/sdk/internal/recording/recording.go index 13f006186752..a56cbf3656d9 100644 --- a/sdk/internal/recording/recording.go +++ b/sdk/internal/recording/recording.go @@ -667,6 +667,9 @@ func (c customHttpClient) Do(req *http.Request) (*http.Response, error) { } func GetRoutingHTTPClient(t *testing.T, options *RecordingOptions) (*customHttpClient, error) { + if options == nil { + options = &RecordingOptions{UseHTTPS: true} + } c, err := GetHTTPClient(t) if err != nil { return nil, err From 925ad58c048ab17c4b101f242c10024ece8516de Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Thu, 18 Nov 2021 15:41:10 -0500 Subject: [PATCH 03/11] removing policy code --- sdk/data/aztables/proxy_test.go | 64 ++++----------------------------- 1 file changed, 6 insertions(+), 58 deletions(-) diff --git a/sdk/data/aztables/proxy_test.go b/sdk/data/aztables/proxy_test.go index 0576606f14df..996999801b91 100644 --- a/sdk/data/aztables/proxy_test.go +++ b/sdk/data/aztables/proxy_test.go @@ -7,7 +7,6 @@ import ( "context" "fmt" "hash/fnv" - "net/http" "os" "strings" "testing" @@ -56,47 +55,6 @@ var pathToPackage = "sdk/data/aztables/testdata" const tableNamePrefix = "tableName" -type recordingPolicy struct { - options recording.RecordingOptions - t *testing.T -} - -func (r recordingPolicy) Host() string { - if r.options.UseHTTPS { - return "localhost:5001" - } - return "localhost:5000" -} - -func (r recordingPolicy) Scheme() string { - if r.options.UseHTTPS { - return "https" - } - return "http" -} - -func NewRecordingPolicy(t *testing.T, o *recording.RecordingOptions) policy.Policy { - if o == nil { - o = &recording.RecordingOptions{UseHTTPS: true} - } - p := &recordingPolicy{options: *o, t: t} - return p -} - -func (p *recordingPolicy) Do(req *policy.Request) (resp *http.Response, err error) { - if recording.GetRecordMode() != "live" && !recording.IsLiveOnly(p.t) { - originalURLHost := req.Raw().URL.Host - req.Raw().URL.Scheme = p.Scheme() - req.Raw().URL.Host = p.Host() - req.Raw().Host = p.Host() - - req.Raw().Header.Set(recording.UpstreamURIHeader, fmt.Sprintf("%v://%v", p.Scheme(), originalURLHost)) - req.Raw().Header.Set(recording.ModeHeader, recording.GetRecordMode()) - req.Raw().Header.Set(recording.IDHeader, recording.GetRecordingId(p.t)) - } - return req.Next() -} - type FakeCredential struct { accountName string accountKey string @@ -114,14 +72,10 @@ func NewFakeCredential(accountName, accountKey string) *FakeCredential { } func createClientForRecording(t *testing.T, tableName string, serviceURL string, cred SharedKeyCredential) (*Client, error) { - // p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) - // client, err := recording.GetHTTPClient(t) fullClient, err := recording.GetRoutingHTTPClient(t, nil) require.NoError(t, err) options := &ClientOptions{ClientOptions: azcore.ClientOptions{ - // PerCallPolicies: []policy.Policy{p}, - // Transport: client, Transport: fullClient, }} if !strings.HasSuffix(serviceURL, "/") && tableName != "" { @@ -133,13 +87,11 @@ func createClientForRecording(t *testing.T, tableName string, serviceURL string, } func createClientForRecordingWithNoCredential(t *testing.T, tableName string, serviceURL string) (*Client, error) { - p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) - client, err := recording.GetHTTPClient(t) + fullClient, err := recording.GetRoutingHTTPClient(t, nil) require.NoError(t, err) options := &ClientOptions{ClientOptions: azcore.ClientOptions{ - PerCallPolicies: []policy.Policy{p}, - Transport: client, + Transport: fullClient, }} if !strings.HasSuffix(serviceURL, "/") && tableName != "" { serviceURL += "/" @@ -150,25 +102,21 @@ func createClientForRecordingWithNoCredential(t *testing.T, tableName string, se } func createServiceClientForRecording(t *testing.T, serviceURL string, cred SharedKeyCredential) (*ServiceClient, error) { - p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) - client, err := recording.GetHTTPClient(t) + fullClient, err := recording.GetRoutingHTTPClient(t, nil) require.NoError(t, err) options := &ClientOptions{ClientOptions: azcore.ClientOptions{ - PerCallPolicies: []policy.Policy{p}, - Transport: client, + Transport: fullClient, }} return NewServiceClientWithSharedKey(serviceURL, &cred, options) } func createServiceClientForRecordingWithNoCredential(t *testing.T, serviceURL string) (*ServiceClient, error) { - p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) - client, err := recording.GetHTTPClient(t) + fullClient, err := recording.GetRoutingHTTPClient(t, nil) require.NoError(t, err) options := &ClientOptions{ClientOptions: azcore.ClientOptions{ - PerCallPolicies: []policy.Policy{p}, - Transport: client, + Transport: fullClient, }} return NewServiceClientWithNoCredential(serviceURL, options) } From 1bca973d1c6bbbcba88d76c62d39426532e222f9 Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Thu, 18 Nov 2021 15:49:16 -0500 Subject: [PATCH 04/11] adding test to ensure routing client works same as original client --- sdk/internal/recording/recording_test.go | 32 +++++++++++++++++++ .../TestStartStopRoutingClient.json | 26 +++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 sdk/internal/recording/testdata/recordings/TestStartStopRoutingClient.json diff --git a/sdk/internal/recording/recording_test.go b/sdk/internal/recording/recording_test.go index 750dec35ad29..06afd053f487 100644 --- a/sdk/internal/recording/recording_test.go +++ b/sdk/internal/recording/recording_test.go @@ -433,6 +433,38 @@ func TestStartStop(t *testing.T) { defer jsonFile.Close() } +func TestStartStopRoutingClient(t *testing.T) { + os.Setenv("AZURE_RECORD_MODE", "record") + defer os.Unsetenv("AZURE_RECORD_MODE") + + err := Start(t, packagePath, nil) + require.NoError(t, err) + + client, err := GetRoutingHTTPClient(t, nil) + require.NoError(t, err) + + req, err := http.NewRequest("POST", "https://localhost:5001", nil) + require.NoError(t, err) + + req.Header.Set(UpstreamURIHeader, "https://www.bing.com/") + req.Header.Set(ModeHeader, GetRecordMode()) + req.Header.Set(IDHeader, GetRecordingId(t)) + + resp, err := client.Do(req) + require.NoError(t, err) + require.NotNil(t, resp) + + require.NotNil(t, GetRecordingId(t)) + + err = Stop(t, nil) + require.NoError(t, err) + + // Make sure the file is there + jsonFile, err := os.Open("./testdata/recordings/TestStartStopRoutingClient.json") + require.NoError(t, err) + defer jsonFile.Close() +} + func TestProxyCert(t *testing.T) { _, err := getRootCas(t) require.NoError(t, err) diff --git a/sdk/internal/recording/testdata/recordings/TestStartStopRoutingClient.json b/sdk/internal/recording/testdata/recordings/TestStartStopRoutingClient.json new file mode 100644 index 000000000000..976741b244f9 --- /dev/null +++ b/sdk/internal/recording/testdata/recordings/TestStartStopRoutingClient.json @@ -0,0 +1,26 @@ +{ + "Entries": [ + { + "RequestUri": "https://localhost:5001/", + "RequestMethod": "POST", + "RequestHeaders": { + ":authority": "localhost:5001", + ":method": "POST", + ":path": "/", + ":scheme": "https", + "Accept-Encoding": "gzip", + "Content-Length": "0", + "User-Agent": "Go-http-client/2.0" + }, + "RequestBody": null, + "StatusCode": 404, + "ResponseHeaders": { + "Content-Length": "0", + "Date": "Thu, 18 Nov 2021 20:48:43 GMT", + "Server": "Kestrel" + }, + "ResponseBody": null + } + ], + "Variables": {} +} From 70d7b8660b3dd7e7c56d7fa908117bfa5c894c3d Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Thu, 18 Nov 2021 17:20:41 -0500 Subject: [PATCH 05/11] adding changelog entry and changing struct name --- sdk/internal/CHANGELOG.md | 1 + sdk/internal/recording/recording.go | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/sdk/internal/CHANGELOG.md b/sdk/internal/CHANGELOG.md index 600a6f11db44..3b35627b2db5 100644 --- a/sdk/internal/CHANGELOG.md +++ b/sdk/internal/CHANGELOG.md @@ -3,6 +3,7 @@ ## 0.8.3 (Unreleased) ### Features Added +* Adds `RecordingHTTPClient` to implement `azcore.Transporter` interface and route requests to the test proxy. ### Breaking Changes diff --git a/sdk/internal/recording/recording.go b/sdk/internal/recording/recording.go index a56cbf3656d9..49e83d60fd4f 100644 --- a/sdk/internal/recording/recording.go +++ b/sdk/internal/recording/recording.go @@ -655,18 +655,18 @@ func getRootCas(t *testing.T) (*x509.CertPool, error) { return rootCAs, nil } -type customHttpClient struct { +type RecordingHTTPClient struct { defaultClient *http.Client options RecordingOptions t *testing.T } -func (c customHttpClient) Do(req *http.Request) (*http.Response, error) { +func (c RecordingHTTPClient) Do(req *http.Request) (*http.Response, error) { c.options.ReplaceAuthority(c.t, req) return c.defaultClient.Do(req) } -func GetRoutingHTTPClient(t *testing.T, options *RecordingOptions) (*customHttpClient, error) { +func GetRoutingHTTPClient(t *testing.T, options *RecordingOptions) (*RecordingHTTPClient, error) { if options == nil { options = &RecordingOptions{UseHTTPS: true} } @@ -675,7 +675,7 @@ func GetRoutingHTTPClient(t *testing.T, options *RecordingOptions) (*customHttpC return nil, err } - return &customHttpClient{ + return &RecordingHTTPClient{ defaultClient: c, options: *options, t: t, From 9b22792e3f166bc89f75bec3087363cb22db4888 Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Fri, 19 Nov 2021 09:27:53 -0500 Subject: [PATCH 06/11] undoing tables changes --- sdk/data/aztables/go.mod | 2 - sdk/data/aztables/go.sum | 2 + sdk/data/aztables/proxy_test.go | 66 +++++++++++++++++++++++++++++---- 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/sdk/data/aztables/go.mod b/sdk/data/aztables/go.mod index d36864776660..b6338e702884 100644 --- a/sdk/data/aztables/go.mod +++ b/sdk/data/aztables/go.mod @@ -2,8 +2,6 @@ module github.com/Azure/azure-sdk-for-go/sdk/data/aztables go 1.16 -replace github.com/Azure/azure-sdk-for-go/sdk/internal => ../../internal - require ( github.com/Azure/azure-sdk-for-go/sdk/azcore v0.20.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.12.0 diff --git a/sdk/data/aztables/go.sum b/sdk/data/aztables/go.sum index 3d79eabc7e9b..bb3880362bcf 100644 --- a/sdk/data/aztables/go.sum +++ b/sdk/data/aztables/go.sum @@ -2,6 +2,8 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v0.20.0 h1:KQgdWmEOmaJKxaUUZwHAYh12 github.com/Azure/azure-sdk-for-go/sdk/azcore v0.20.0/go.mod h1:ZPW/Z0kLCTdDZaDbYTetxc9Cxl/2lNqxYHYNOF2bti0= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.12.0 h1:VBvHGLJbaY0+c66NZHdS9cgjHVYSH6DDa0XJMyrblsI= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.12.0/go.mod h1:GJzjM4SR9T0KyX5gKCVyz1ytD8FeWeUPCwtFCt1AyfE= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.1 h1:BUYIbDf/mMZ8945v3QkG3OuqGVyS4Iek0AOLwdRAYoc= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.1/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/sdk/data/aztables/proxy_test.go b/sdk/data/aztables/proxy_test.go index 996999801b91..12664686d464 100644 --- a/sdk/data/aztables/proxy_test.go +++ b/sdk/data/aztables/proxy_test.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "hash/fnv" + "net/http" "os" "strings" "testing" @@ -55,6 +56,47 @@ var pathToPackage = "sdk/data/aztables/testdata" const tableNamePrefix = "tableName" +type recordingPolicy struct { + options recording.RecordingOptions + t *testing.T +} + +func (r recordingPolicy) Host() string { + if r.options.UseHTTPS { + return "localhost:5001" + } + return "localhost:5000" +} + +func (r recordingPolicy) Scheme() string { + if r.options.UseHTTPS { + return "https" + } + return "http" +} + +func NewRecordingPolicy(t *testing.T, o *recording.RecordingOptions) policy.Policy { + if o == nil { + o = &recording.RecordingOptions{UseHTTPS: true} + } + p := &recordingPolicy{options: *o, t: t} + return p +} + +func (p *recordingPolicy) Do(req *policy.Request) (resp *http.Response, err error) { + if recording.GetRecordMode() != "live" && !recording.IsLiveOnly(p.t) { + originalURLHost := req.Raw().URL.Host + req.Raw().URL.Scheme = p.Scheme() + req.Raw().URL.Host = p.Host() + req.Raw().Host = p.Host() + + req.Raw().Header.Set(recording.UpstreamURIHeader, fmt.Sprintf("%v://%v", p.Scheme(), originalURLHost)) + req.Raw().Header.Set(recording.ModeHeader, recording.GetRecordMode()) + req.Raw().Header.Set(recording.IDHeader, recording.GetRecordingId(p.t)) + } + return req.Next() +} + type FakeCredential struct { accountName string accountKey string @@ -72,11 +114,13 @@ func NewFakeCredential(accountName, accountKey string) *FakeCredential { } func createClientForRecording(t *testing.T, tableName string, serviceURL string, cred SharedKeyCredential) (*Client, error) { - fullClient, err := recording.GetRoutingHTTPClient(t, nil) + p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) + client, err := recording.GetHTTPClient(t) require.NoError(t, err) options := &ClientOptions{ClientOptions: azcore.ClientOptions{ - Transport: fullClient, + PerCallPolicies: []policy.Policy{p}, + Transport: client, }} if !strings.HasSuffix(serviceURL, "/") && tableName != "" { serviceURL += "/" @@ -87,11 +131,13 @@ func createClientForRecording(t *testing.T, tableName string, serviceURL string, } func createClientForRecordingWithNoCredential(t *testing.T, tableName string, serviceURL string) (*Client, error) { - fullClient, err := recording.GetRoutingHTTPClient(t, nil) + p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) + client, err := recording.GetHTTPClient(t) require.NoError(t, err) options := &ClientOptions{ClientOptions: azcore.ClientOptions{ - Transport: fullClient, + PerCallPolicies: []policy.Policy{p}, + Transport: client, }} if !strings.HasSuffix(serviceURL, "/") && tableName != "" { serviceURL += "/" @@ -102,21 +148,25 @@ func createClientForRecordingWithNoCredential(t *testing.T, tableName string, se } func createServiceClientForRecording(t *testing.T, serviceURL string, cred SharedKeyCredential) (*ServiceClient, error) { - fullClient, err := recording.GetRoutingHTTPClient(t, nil) + p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) + client, err := recording.GetHTTPClient(t) require.NoError(t, err) options := &ClientOptions{ClientOptions: azcore.ClientOptions{ - Transport: fullClient, + PerCallPolicies: []policy.Policy{p}, + Transport: client, }} return NewServiceClientWithSharedKey(serviceURL, &cred, options) } func createServiceClientForRecordingWithNoCredential(t *testing.T, serviceURL string) (*ServiceClient, error) { - fullClient, err := recording.GetRoutingHTTPClient(t, nil) + p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true}) + client, err := recording.GetHTTPClient(t) require.NoError(t, err) options := &ClientOptions{ClientOptions: azcore.ClientOptions{ - Transport: fullClient, + PerCallPolicies: []policy.Policy{p}, + Transport: client, }} return NewServiceClientWithNoCredential(serviceURL, options) } From 0bbb1452cf2861e4b10d0208026c61251fdbbf61 Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Wed, 24 Nov 2021 11:32:53 -0500 Subject: [PATCH 07/11] improving test, changing name --- sdk/internal/recording/recording.go | 2 +- sdk/internal/recording/recording_test.go | 21 +++++---- sdk/internal/recording/sanitizer_test.go | 14 +++--- .../TestStartStopRecordingClient.json | 44 +++++++++++++++++++ .../TestStartStopRoutingClient.json | 26 ----------- 5 files changed, 65 insertions(+), 42 deletions(-) create mode 100644 sdk/internal/recording/testdata/recordings/TestStartStopRecordingClient.json delete mode 100644 sdk/internal/recording/testdata/recordings/TestStartStopRoutingClient.json diff --git a/sdk/internal/recording/recording.go b/sdk/internal/recording/recording.go index 49e83d60fd4f..02fa828cb579 100644 --- a/sdk/internal/recording/recording.go +++ b/sdk/internal/recording/recording.go @@ -666,7 +666,7 @@ func (c RecordingHTTPClient) Do(req *http.Request) (*http.Response, error) { return c.defaultClient.Do(req) } -func GetRoutingHTTPClient(t *testing.T, options *RecordingOptions) (*RecordingHTTPClient, error) { +func NewRecordingHTTPClient(t *testing.T, options *RecordingOptions) (*RecordingHTTPClient, error) { if options == nil { options = &RecordingOptions{UseHTTPS: true} } diff --git a/sdk/internal/recording/recording_test.go b/sdk/internal/recording/recording_test.go index 06afd053f487..f77bec690e3e 100644 --- a/sdk/internal/recording/recording_test.go +++ b/sdk/internal/recording/recording_test.go @@ -7,6 +7,7 @@ package recording import ( + "encoding/json" "fmt" "io/ioutil" "net/http" @@ -433,23 +434,19 @@ func TestStartStop(t *testing.T) { defer jsonFile.Close() } -func TestStartStopRoutingClient(t *testing.T) { +func TestStartStopRecordingClient(t *testing.T) { os.Setenv("AZURE_RECORD_MODE", "record") defer os.Unsetenv("AZURE_RECORD_MODE") err := Start(t, packagePath, nil) require.NoError(t, err) - client, err := GetRoutingHTTPClient(t, nil) + client, err := NewRecordingHTTPClient(t, nil) require.NoError(t, err) - req, err := http.NewRequest("POST", "https://localhost:5001", nil) + req, err := http.NewRequest("POST", "https://azsdkengsys.azurecr.io/acr/v1/some_registry/_tags", nil) require.NoError(t, err) - req.Header.Set(UpstreamURIHeader, "https://www.bing.com/") - req.Header.Set(ModeHeader, GetRecordMode()) - req.Header.Set(IDHeader, GetRecordingId(t)) - resp, err := client.Do(req) require.NoError(t, err) require.NotNil(t, resp) @@ -460,9 +457,17 @@ func TestStartStopRoutingClient(t *testing.T) { require.NoError(t, err) // Make sure the file is there - jsonFile, err := os.Open("./testdata/recordings/TestStartStopRoutingClient.json") + jsonFile, err := os.Open(fmt.Sprintf("./testdata/recordings/%s.json", t.Name())) require.NoError(t, err) defer jsonFile.Close() + + var data RecordingFileStruct + byteValue, err := ioutil.ReadAll(jsonFile) + require.NoError(t, err) + err = json.Unmarshal(byteValue, &data) + require.NoError(t, err) + require.Equal(t, "https://azsdkengsys.azurecr.io/acr/v1/some_registry/_tags", data.Entries[0].RequestURI) + require.Equal(t, req.URL.String(), "https://localhost:5001/acr/v1/some_registry/_tags") } func TestProxyCert(t *testing.T) { diff --git a/sdk/internal/recording/sanitizer_test.go b/sdk/internal/recording/sanitizer_test.go index d8eef5f9d606..24dd57cce1a3 100644 --- a/sdk/internal/recording/sanitizer_test.go +++ b/sdk/internal/recording/sanitizer_test.go @@ -177,13 +177,13 @@ type RecordingFileStruct struct { } type Entry struct { - RequestURI string `json:"RequestUri"` - RequestMethod string `json:"RequestMethod"` - RequestHeaders map[string]string `json:"RequestHeaders"` - RequestBody string `json:"RequestBody"` - StatusCode int `json:"StatusCode"` - ResponseBody interface{} `json:"ResponseBody"` // This should be a string, but proxy saves as an object when there is no body - ResponseHeaders map[string]string `json:"ResponseHeaders"` + RequestURI string `json:"RequestUri"` + RequestMethod string `json:"RequestMethod"` + RequestHeaders map[string]string `json:"RequestHeaders"` + RequestBody string `json:"RequestBody"` + StatusCode int `json:"StatusCode"` + ResponseBody interface{} `json:"ResponseBody"` // This should be a string, but proxy saves as an object when there is no body + ResponseHeaders map[string]interface{} `json:"ResponseHeaders"` } func (e Entry) ResponseBodyByValue(k string) interface{} { diff --git a/sdk/internal/recording/testdata/recordings/TestStartStopRecordingClient.json b/sdk/internal/recording/testdata/recordings/TestStartStopRecordingClient.json new file mode 100644 index 000000000000..431268dfb1f0 --- /dev/null +++ b/sdk/internal/recording/testdata/recordings/TestStartStopRecordingClient.json @@ -0,0 +1,44 @@ +{ + "Entries": [ + { + "RequestUri": "https://azsdkengsys.azurecr.io/acr/v1/some_registry/_tags", + "RequestMethod": "POST", + "RequestHeaders": { + ":authority": "localhost:5001", + ":method": "POST", + ":path": "/acr/v1/some_registry/_tags", + ":scheme": "https", + "Accept-Encoding": "gzip", + "Content-Length": "0", + "User-Agent": "Go-http-client/2.0" + }, + "RequestBody": null, + "StatusCode": 401, + "ResponseHeaders": { + "Access-Control-Expose-Headers": [ + "Docker-Content-Digest", + "WWW-Authenticate", + "Link", + "X-Ms-Correlation-Request-Id" + ], + "Connection": "keep-alive", + "Content-Length": "217", + "Content-Type": "application/json; charset=utf-8", + "Date": "Wed, 24 Nov 2021 16:32:26 GMT", + "Docker-Distribution-Api-Version": "registry/2.0", + "Server": "openresty", + "Strict-Transport-Security": [ + "max-age=31536000; includeSubDomains", + "max-age=31536000; includeSubDomains" + ], + "WWW-Authenticate": "Bearer realm=\u0022https://azsdkengsys.azurecr.io/oauth2/token\u0022,service=\u0022azsdkengsys.azurecr.io\u0022,scope=\u0022repository:some_registry:metadata_write\u0022", + "X-Content-Type-Options": "nosniff", + "X-Ms-Correlation-Request-Id": "42996656-7be1-4f6d-9c8f-fbcf1a8a950d" + }, + "ResponseBody": [ + "{\u0022errors\u0022:[{\u0022code\u0022:\u0022UNAUTHORIZED\u0022,\u0022message\u0022:\u0022authentication required, visit https://aka.ms/acr/authorization for more information.\u0022,\u0022detail\u0022:[{\u0022Type\u0022:\u0022repository\u0022,\u0022Name\u0022:\u0022some_registry\u0022,\u0022Action\u0022:\u0022metadata_write\u0022}]}]}\n" + ] + } + ], + "Variables": {} +} diff --git a/sdk/internal/recording/testdata/recordings/TestStartStopRoutingClient.json b/sdk/internal/recording/testdata/recordings/TestStartStopRoutingClient.json deleted file mode 100644 index 976741b244f9..000000000000 --- a/sdk/internal/recording/testdata/recordings/TestStartStopRoutingClient.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "Entries": [ - { - "RequestUri": "https://localhost:5001/", - "RequestMethod": "POST", - "RequestHeaders": { - ":authority": "localhost:5001", - ":method": "POST", - ":path": "/", - ":scheme": "https", - "Accept-Encoding": "gzip", - "Content-Length": "0", - "User-Agent": "Go-http-client/2.0" - }, - "RequestBody": null, - "StatusCode": 404, - "ResponseHeaders": { - "Content-Length": "0", - "Date": "Thu, 18 Nov 2021 20:48:43 GMT", - "Server": "Kestrel" - }, - "ResponseBody": null - } - ], - "Variables": {} -} From 1cfa2ea9965aff8ce475146fd561fd67e7de10f4 Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Wed, 24 Nov 2021 14:09:20 -0500 Subject: [PATCH 08/11] updating changelog --- sdk/internal/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/internal/CHANGELOG.md b/sdk/internal/CHANGELOG.md index 3b35627b2db5..a3fd399474f4 100644 --- a/sdk/internal/CHANGELOG.md +++ b/sdk/internal/CHANGELOG.md @@ -3,7 +3,7 @@ ## 0.8.3 (Unreleased) ### Features Added -* Adds `RecordingHTTPClient` to implement `azcore.Transporter` interface and route requests to the test proxy. +* Adds `NewRecordingHTTPClient()` method which returns an `azcore.Transporter` interface that routes requests to the test proxy. ### Breaking Changes From 9e2647c8e1634577540cbf2353a5ded8282f3687 Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Mon, 29 Nov 2021 11:16:35 -0500 Subject: [PATCH 09/11] setting recordMode variable instead of env var --- sdk/internal/recording/recording_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/internal/recording/recording_test.go b/sdk/internal/recording/recording_test.go index ad5b08d9b29f..0fb2727743de 100644 --- a/sdk/internal/recording/recording_test.go +++ b/sdk/internal/recording/recording_test.go @@ -435,9 +435,9 @@ func TestStartStop(t *testing.T) { } func TestStartStopRecordingClient(t *testing.T) { - temp := os.Getenv("AZURE_RECORD_MODE") - os.Setenv("AZURE_RECORD_MODE", "record") - defer os.Setenv("AZURE_RECORD_MODE", temp) + temp := recordMode + recordMode = RecordingMode + defer func() { recordMode = temp }() err := Start(t, packagePath, nil) require.NoError(t, err) From 03990014b3a06966ba6a85e299ad51bfa6ba2dae Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Mon, 29 Nov 2021 11:27:48 -0500 Subject: [PATCH 10/11] adding issue number to changelog entries --- sdk/internal/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/internal/CHANGELOG.md b/sdk/internal/CHANGELOG.md index a3c40cde41ed..3d8fd3d753ed 100644 --- a/sdk/internal/CHANGELOG.md +++ b/sdk/internal/CHANGELOG.md @@ -3,11 +3,11 @@ ## 0.8.3 (Unreleased) ### Features Added -* Adds `NewRecordingHTTPClient()` method which returns an `azcore.Transporter` interface that routes requests to the test proxy. +* Adds `NewRecordingHTTPClient()` method which returns an `azcore.Transporter` interface that routes requests to the test proxy [#16221](https://github.com/Azure/azure-sdk-for-go/pull/16221). * Adds the `SetBodilessMatcher` method [#16256](https://github.com/Azure/azure-sdk-for-go/pull/16256) ### Breaking Changes -* Renames `ResetSanitizers` to `ResetProxy` +* Renames `ResetSanitizers` to `ResetProxy` [#16256](https://github.com/Azure/azure-sdk-for-go/pull/16256) ## 0.8.2 (2021-11-11) From 2e92e7185ef221d54f455a4c536f385c7febfdfd Mon Sep 17 00:00:00 2001 From: seankane-msft Date: Tue, 30 Nov 2021 12:47:44 -0500 Subject: [PATCH 11/11] updating date for release --- sdk/internal/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/internal/CHANGELOG.md b/sdk/internal/CHANGELOG.md index 3d8fd3d753ed..8fdfadeb25f6 100644 --- a/sdk/internal/CHANGELOG.md +++ b/sdk/internal/CHANGELOG.md @@ -1,6 +1,6 @@ # Release History -## 0.8.3 (Unreleased) +## 0.8.3 (2021-11-30) ### Features Added * Adds `NewRecordingHTTPClient()` method which returns an `azcore.Transporter` interface that routes requests to the test proxy [#16221](https://github.com/Azure/azure-sdk-for-go/pull/16221).