Skip to content

Commit 9f7b083

Browse files
tadeleshchlowellAlancere
authored
add start/stop recording proxy and remove useless policy (Azure#22968)
* add start/stop recording proxy and remove useless policy * update version * update ci config * fix * resolve comment and update recording * disable location sanitizer to avoid lro playback fail * Update CHANGELOG.md * Update sdk/resourcemanager/internal/testutil/recording.go Co-authored-by: Charles Lowell <[email protected]> * remove skip --------- Co-authored-by: Charles Lowell <[email protected]> Co-authored-by: Alancere <[email protected]>
1 parent cd497f0 commit 9f7b083

File tree

13 files changed

+74
-127
lines changed

13 files changed

+74
-127
lines changed

sdk/resourcemanager/internal/CHANGELOG.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
# Release History
22

3-
## 2.0.1 (Unreleased)
3+
## 3.0.0 (2024-05-31)
44

55
### Features Added
6+
* Add `StartProxy` to help start and stop build-in test proxy for each module's test.
67

78
### Breaking Changes
8-
9-
### Bugs Fixed
9+
* Remove `NewRecordingPolicy`, use `GetCredAndClientOptions` directly.
1010

1111
### Other Changes
1212
* Updated dependencies.
1313

1414
## 2.0.0 (2023-11-16)
1515

1616
### Breaking Changes
17-
* Removed `testutil.GetEnv`, use `github.com/Azure/azure-sdk-for-go/sdk/internal/recording.GetEnvVariable` instead.
17+
* Remove `testutil.GetEnv`, use `github.com/Azure/azure-sdk-for-go/sdk/internal/recording.GetEnvVariable` instead.
1818
* Remove `testutil.GenerateAlphaNumericID`, use `github.com/Azure/azure-sdk-for-go/sdk/internal/recording.GenerateAlphaNumericID` instead.
1919

2020
### Other Changes

sdk/resourcemanager/internal/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "go",
44
"TagPrefix": "go/resourcemanager/internal",
5-
"Tag": "go/resourcemanager/internal_227105d301"
5+
"Tag": "go/resourcemanager/internal_94fa3b908d"
66
}

sdk/resourcemanager/internal/ci.resourcemanager.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ extends:
2727
parameters:
2828
IncludeRelease: true
2929
ServiceDirectory: resourcemanager/internal
30+
UsePipelineProxy: false

sdk/resourcemanager/internal/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.18
55
require (
66
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1
77
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2
8-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.7.0
8+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0
99
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0
1010
github.com/stretchr/testify v1.9.0
1111
)

sdk/resourcemanager/internal/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqb
22
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo=
33
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU=
44
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU=
5-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.7.0 h1:rTfKOCZGy5ViVrlA74ZPE99a+SgoEE2K/yg3RyW9dFA=
6-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.7.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg=
5+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo=
6+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg=
77
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o=
88
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM=
99
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE=

sdk/resourcemanager/internal/testutil/credential.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,14 @@ func (c *FakeCredential) GetToken(ctx context.Context, opts policy.TokenRequestO
3333
// In the record mode, the credential will be a DefaultAzureCredential which combines several common credentials.
3434
// In the playback mode, the credential will be a fake credential which will bypass truly authorization.
3535
func GetCredAndClientOptions(t *testing.T) (azcore.TokenCredential, *arm.ClientOptions) {
36-
p := NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: true})
37-
client, err := recording.GetHTTPClient(t)
36+
transport, err := recording.NewRecordingHTTPClient(t, nil)
3837
if err != nil {
39-
t.Fatalf("Failed to create recording client: %v", err)
38+
t.Fatalf("Failed to create recording transport: %v", err)
4039
}
4140

4241
options := &arm.ClientOptions{
4342
ClientOptions: policy.ClientOptions{
44-
PerCallPolicies: []policy.Policy{p},
45-
Transport: client,
43+
Transport: transport,
4644
},
4745
}
4846

sdk/resourcemanager/internal/testutil/credential_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func (r *testBody) Seek(offset int64, whence int) (int64, error) {
3535
}
3636

3737
func TestGetCredAndClientOptions(t *testing.T) {
38-
testEndpoint := "http://test"
38+
testEndpoint := "https://test"
3939
cred, options := GetCredAndClientOptions(t)
4040
pl, err := armruntime.NewPipeline("testmodule", "v0.1.0", cred, runtime.PipelineOptions{}, options)
4141
require.NoError(t, err)
@@ -50,4 +50,5 @@ func TestGetCredAndClientOptions(t *testing.T) {
5050
require.Equal(t, "Bearer FakeToken", resp.Request.Header.Get("Authorization"))
5151
}
5252
require.Equal(t, testEndpoint, resp.Request.URL.String())
53+
5354
}

sdk/resourcemanager/internal/testutil/helper_test.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package testutil
88

99
import (
1010
"context"
11-
"strings"
1211
"testing"
1312

1413
"github.com/Azure/azure-sdk-for-go/sdk/internal/recording"
@@ -18,30 +17,19 @@ import (
1817
"github.com/stretchr/testify/require"
1918
)
2019

21-
const (
22-
pathToPackage = "sdk/resourcemanager/internal/testdata"
23-
)
24-
2520
func TestCreateDeleteResourceGroup(t *testing.T) {
26-
if recording.GetRecordMode() == recording.PlaybackMode {
27-
t.Skip("https://github.com/Azure/azure-sdk-for-go/issues/22869")
28-
}
2921
ctx := context.Background()
3022
cred, options := GetCredAndClientOptions(t)
3123
subscriptionID := recording.GetEnvVariable("AZURE_SUBSCRIPTION_ID", "00000000-0000-0000-0000-000000000000")
3224
stop := StartRecording(t, pathToPackage)
3325
defer stop()
3426
resourceGroup, _, err := CreateResourceGroup(ctx, subscriptionID, cred, options, "eastus")
3527
require.NoError(t, err)
36-
require.True(t, strings.HasPrefix(*resourceGroup.Name, "go-sdk-test-"))
3728
_, err = DeleteResourceGroup(ctx, subscriptionID, cred, options, *resourceGroup.Name)
3829
require.NoError(t, err)
3930
}
4031

4132
func TestCreateDeployment(t *testing.T) {
42-
if recording.GetRecordMode() == recording.PlaybackMode {
43-
t.Skip("https://github.com/Azure/azure-sdk-for-go/issues/22869")
44-
}
4533
ctx := context.Background()
4634
cred, options := GetCredAndClientOptions(t)
4735
subscriptionID := recording.GetEnvVariable("AZURE_SUBSCRIPTION_ID", "00000000-0000-0000-0000-000000000000")

sdk/resourcemanager/internal/testutil/recording.go

Lines changed: 32 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -8,95 +8,51 @@ package testutil
88

99
import (
1010
"fmt"
11-
"net/http"
12-
"strconv"
1311
"testing"
1412

15-
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
1613
"github.com/Azure/azure-sdk-for-go/sdk/internal/recording"
1714
)
1815

19-
const recordingRandomSeedVariableName = "recordingRandomSeed"
20-
21-
var (
22-
recordingSeed int64
23-
)
24-
25-
type recordingPolicy struct {
26-
options recording.RecordingOptions
27-
t *testing.T
28-
}
29-
30-
// Host of the test proxy.
31-
func (r *recordingPolicy) Host() string {
32-
if r.options.UseHTTPS {
33-
return "localhost:5001"
34-
}
35-
return "localhost:5000"
36-
}
37-
38-
// Scheme of the test proxy.
39-
func (r *recordingPolicy) Scheme() string {
40-
if r.options.UseHTTPS {
41-
return "https"
42-
}
43-
return "http"
44-
}
45-
46-
// NewRecordingPolicy will create a recording policy which can be used in pipeline.
47-
// The policy will change the destination of the request to the proxy server and add required header for the recording test.
48-
func NewRecordingPolicy(t *testing.T, o *recording.RecordingOptions) policy.Policy {
49-
if o == nil {
50-
o = &recording.RecordingOptions{UseHTTPS: true}
51-
}
52-
p := &recordingPolicy{options: *o, t: t}
53-
return p
54-
}
55-
56-
// Do with recording mode.
57-
// When handling live request, the policy will do nothing.
58-
// Otherwise, the policy will replace the URL of the request with the test proxy endpoint.
59-
// After request, the policy will change back to the original URL for the request to prevent wrong polling URL for LRO.
60-
func (r *recordingPolicy) Do(req *policy.Request) (resp *http.Response, err error) {
61-
if recording.GetRecordMode() != "live" && !recording.IsLiveOnly(r.t) {
62-
oriSchema := req.Raw().URL.Scheme
63-
oriHost := req.Raw().URL.Host
64-
req.Raw().URL.Scheme = r.Scheme()
65-
req.Raw().URL.Host = r.Host()
66-
req.Raw().Host = r.Host()
16+
// StartProxy starts the test proxy with the path to store test recording file.
17+
// It should be used in the module test preparation stage only once.
18+
// It will return a delegate function to stop test proxy.
19+
func StartProxy(pathToPackage string) func() {
20+
if recording.GetRecordMode() == recording.PlaybackMode || recording.GetRecordMode() == recording.RecordingMode {
21+
proxy, err := recording.StartTestProxy(pathToPackage, nil)
22+
if err != nil {
23+
panic(fmt.Sprintf("Failed to start recording proxy: %v", err))
24+
}
6725

68-
// replace request target to use test proxy
69-
req.Raw().Header.Set(recording.UpstreamURIHeader, fmt.Sprintf("%v://%v", oriSchema, oriHost))
70-
req.Raw().Header.Set(recording.ModeHeader, recording.GetRecordMode())
71-
req.Raw().Header.Set(recording.IDHeader, recording.GetRecordingId(r.t))
26+
// sanitizer for any uuid string, e.g., subscriptionID
27+
err = recording.AddGeneralRegexSanitizer("00000000-0000-0000-0000-000000000000", `[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}`, proxy.Options)
28+
if err != nil {
29+
panic(fmt.Sprintf("Failed to add uuid sanitizer: %v", err))
30+
}
31+
// consolidate resource group name for recording and playback
32+
err = recording.AddGeneralRegexSanitizer(recording.SanitizedValue, `go-sdk-test-\d+`, proxy.Options)
33+
if err != nil {
34+
panic(fmt.Sprintf("Failed to add resource group name sanitizer: %v", err))
35+
}
36+
// disable location header sanitizer
37+
err = recording.RemoveRegisteredSanitizers([]string{"AZSDK2003", "AZSDK2030"}, proxy.Options)
38+
if err != nil {
39+
panic(fmt.Sprintf("Failed to remove location header sanitizer: %v", err))
40+
}
7241

73-
resp, err = req.Next()
74-
// for any lro operation, need to change back to the original target to prevent
75-
if resp != nil {
76-
resp.Request.URL.Scheme = oriSchema
77-
resp.Request.URL.Host = oriHost
42+
return func() {
43+
err := recording.StopTestProxy(proxy)
44+
if err != nil {
45+
panic(fmt.Sprintf("Failed to stop recording proxy: %v", err))
46+
}
7847
}
79-
return resp, err
80-
} else {
81-
return req.Next()
8248
}
49+
return func() {}
8350
}
8451

8552
// StartRecording starts the recording with the path to store recording file.
8653
// It will return a delegate function to stop recording.
8754
func StartRecording(t *testing.T, pathToPackage string) func() {
88-
option := &recording.RecordingOptions{UseHTTPS: true}
89-
// sanitizer for any uuid string, e.g., subscriptionID
90-
err := recording.AddGeneralRegexSanitizer("00000000-0000-0000-0000-000000000000", `[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}`, option)
91-
if err != nil {
92-
t.Fatalf("Failed to add uuid sanitizer: %v", err)
93-
}
94-
// consolidate resource group name for recording and playback
95-
err = recording.AddGeneralRegexSanitizer("go-sdk-test-rg", `go-sdk-test-\d+`, option)
96-
if err != nil {
97-
t.Fatalf("Failed to add resource group name sanitizer: %v", err)
98-
}
99-
err = recording.Start(t, pathToPackage, option)
55+
err := recording.Start(t, pathToPackage, nil)
10056
if err != nil {
10157
t.Fatalf("Failed to start recording: %v", err)
10258
}
@@ -105,7 +61,7 @@ func StartRecording(t *testing.T, pathToPackage string) func() {
10561

10662
// StopRecording stops the recording.
10763
func StopRecording(t *testing.T) {
108-
err := recording.Stop(t, &recording.RecordingOptions{Variables: map[string]interface{}{recordingRandomSeedVariableName: strconv.FormatInt(recordingSeed, 10)}})
64+
err := recording.Stop(t, nil)
10965
if err != nil {
11066
t.Fatalf("Failed to stop recording: %v", err)
11167
}

sdk/resourcemanager/internal/testutil/recording_test.go

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,9 @@
77
package testutil
88

99
import (
10-
"context"
11-
"net/http"
12-
"strings"
1310
"testing"
14-
15-
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
16-
"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime"
17-
"github.com/Azure/azure-sdk-for-go/sdk/internal/recording"
18-
"github.com/stretchr/testify/require"
1911
)
2012

21-
func TestRecordingPolicy(t *testing.T) {
22-
testEndpoint := "http://test"
23-
pl := runtime.NewPipeline("testmodule", "v0.1.0", runtime.PipelineOptions{}, &policy.ClientOptions{PerCallPolicies: []policy.Policy{NewRecordingPolicy(t, &recording.RecordingOptions{UseHTTPS: false})}})
24-
req, err := runtime.NewRequest(context.Background(), http.MethodGet, testEndpoint)
25-
require.NoError(t, err)
26-
err = req.SetBody(&testBody{body: strings.NewReader("test")}, "text/plain")
27-
require.NoError(t, err)
28-
resp, err := pl.Do(req)
29-
require.NoError(t, err)
30-
require.Equal(t, http.StatusBadRequest, resp.StatusCode)
31-
require.Equal(t, testEndpoint, resp.Request.URL.String())
32-
}
33-
3413
func TestStartStopRecording(t *testing.T) {
3514
stop := StartRecording(t, pathToPackage)
3615
defer stop()

0 commit comments

Comments
 (0)