Skip to content

Commit 2679c6b

Browse files
Adding tests for FilterBlobs and fixing encoding issue (#19742)
* Adding tests for FilterBlobs and fixing encoding issue * Adding changes to generated files * Updating CHANGELOG.md * fix tests * Updating length checks in tests * Adding sleep to test * Adding sleep for pageblob * updating pageblob test
1 parent 00a8837 commit 2679c6b

File tree

6 files changed

+102
-73
lines changed

6 files changed

+102
-73
lines changed

sdk/storage/azblob/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
### Breaking Changes
88

99
### Bugs Fixed
10+
* Fixed encoding issues seen in FilterBlobs. Fixes [#17421](https://github.com/Azure/azure-sdk-for-go/issues/17421).
1011

1112
### Other Changes
1213

sdk/storage/azblob/appendblob/client_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"context"
1212
"crypto/md5"
1313
"encoding/binary"
14+
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service"
1415
"hash/crc64"
1516
"io"
1617
"math/rand"
@@ -1501,6 +1502,7 @@ func (s *AppendBlobUnrecordedTestsSuite) TestCreateAppendBlobWithTags() {
15011502
createResp, err := abClient.Create(context.Background(), &createAppendBlobOptions)
15021503
_require.Nil(err)
15031504
_require.NotNil(createResp.VersionID)
1505+
time.Sleep(10 * time.Second)
15041506

15051507
_, err = abClient.GetProperties(context.Background(), nil)
15061508
_require.Nil(err)
@@ -1532,6 +1534,15 @@ func (s *AppendBlobUnrecordedTestsSuite) TestCreateAppendBlobWithTags() {
15321534
for _, blobTag := range blobTagsSet {
15331535
_require.Equal(testcommon.SpecialCharBlobTagsMap[*blobTag.Key], *blobTag.Value)
15341536
}
1537+
1538+
// Tags with spaces
1539+
where := "\"GO \"='.Net'"
1540+
lResp, err := svcClient.FilterBlobs(context.Background(), &service.FilterBlobsOptions{
1541+
Where: &where,
1542+
})
1543+
_require.Nil(err)
1544+
_require.Len(lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet, 1)
1545+
_require.Equal(lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet[0], blobTagsSet[2])
15351546
}
15361547

15371548
func (s *AppendBlobRecordedTestsSuite) TestAppendBlobGetPropertiesUsingVID() {

sdk/storage/azblob/blockblob/client_test.go

Lines changed: 59 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -2788,78 +2788,65 @@ func (s *BlockBlobUnrecordedTestsSuite) TestListBlobReturnsTags() {
27882788
}
27892789
}
27902790

2791-
// func (s *BlockBlobUnrecordedTestsSuite) TestFindBlobsByTags() {
2792-
// _require := require.New(s.T())
2793-
// testName := s.T().Name()
2794-
// _context := getTestContext(testName)
2795-
// ignoreHeaders(_context.recording, []string{"x-ms-tags", "X-Ms-Tags"})
2796-
// svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil)
2797-
// if err != nil {
2798-
// s.Fail("Unable to fetch service client because " + err.Error())
2799-
// }
2800-
//
2801-
// containerClient1 := testcommon.CreateNewContainer(context.Background(), _require, testcommon.GenerateContainerName(testName) + "1", svcClient)
2802-
// defer testcommon.DeleteContainer(context.Background(), _require, containerClient1)
2803-
//
2804-
// containerClient2 := testcommon.CreateNewContainer(context.Background(), _require, testcommon.GenerateContainerName(testName) + "2", svcClient)
2805-
// defer testcommon.DeleteContainer(context.Background(), _require, containerClient2)
2806-
//
2807-
// containerClient3 := testcommon.CreateNewContainer(context.Background(), _require, testcommon.GenerateContainerName(testName) + "3", svcClient)
2808-
// defer testcommon.DeleteContainer(context.Background(), _require, containerClient3)
2809-
//
2810-
// blobTagsMap1 := map[string]string{
2811-
// "tag2": "tagsecond",
2812-
// "tag3": "tagthird",
2813-
// }
2814-
// blobTagsMap2 := map[string]string{
2815-
// "tag1": "firsttag",
2816-
// "tag2": "secondtag",
2817-
// "tag3": "thirdtag",
2818-
// }
2819-
//
2820-
// blobURL11 := testcommon.GetBlockBlobClient(testcommon.GenerateBlobName(testName) + "11", containerClient1)
2821-
// _, err = blobURL11.Upload(context.Background(), bytes.NewReader([]byte("random data")), &blockblob.UploadOptions{
2822-
// Metadata: testcommon.BasicMetadata,
2823-
// Tags: blobTagsMap1,
2824-
// })
2825-
// _require.Nil(err)
2826-
//
2827-
// blobURL12 := testcommon.GetBlockBlobClient(testcommon.GenerateBlobName(testName) + "12", containerClient1)
2828-
// _, err = blobURL12.Upload(context.Background(), bytes.NewReader([]byte("another random data")), &blockblob.UploadOptions{
2829-
// Metadata: testcommon.BasicMetadata,
2830-
// Tags: blobTagsMap2,
2831-
// })
2832-
// _require.Nil(err)
2833-
//
2834-
// blobURL21 := testcommon.GetBlockBlobClient(testcommon.GenerateBlobName(testName) + "21", containerClient2)
2835-
// _, err = blobURL21.Upload(context.Background(), bytes.NewReader([]byte("random data")), HTTPHeaders{}, testcommon.BasicMetadata, LeaseAccessConditions{}, DefaultAccessTier, nil, ClientProvidedKeyOptions{})
2836-
// _require.Nil(err)
2837-
//
2838-
// blobURL22 := testcommon.GetBlockBlobClient(testcommon.GenerateBlobName(testName) + "22", containerClient2)
2839-
// _, err = blobURL22.Upload(context.Background(), bytes.NewReader([]byte("another random data")), HTTPHeaders{}, testcommon.BasicMetadata, LeaseAccessConditions{}, DefaultAccessTier, blobTagsMap2, ClientProvidedKeyOptions{})
2840-
// _require.Nil(err)
2841-
//
2842-
// blobURL31 := testcommon.GetBlockBlobClient(testcommon.GenerateBlobName(testName) + "31", containerClient3)
2843-
// _, err = blobURL31.Upload(context.Background(), bytes.NewReader([]byte("random data")), HTTPHeaders{}, testcommon.BasicMetadata, LeaseAccessConditions{}, DefaultAccessTier, nil, ClientProvidedKeyOptions{})
2844-
// _require.Nil(err)
2845-
//
2846-
// where := "\"tag4\"='fourthtag'"
2847-
// lResp, err := svcClient.FindBlobByTags(context.Background(), nil, nil, &where, Marker{}, nil)
2848-
// _require.Nil(err)
2849-
// _assert(lResp.Blobs, chk.HasLen, 0)
2850-
//
2851-
// //where = "\"tag1\"='firsttag'AND\"tag2\"='secondtag'AND\"@container\"='"+ containerName1 + "'"
2852-
// //TODO: Figure out how to do a composite query based on container.
2853-
// where = "\"tag1\"='firsttag'AND\"tag2\"='secondtag'"
2854-
//
2855-
// lResp, err = svcClient.FindBlobsByTags(context.Background(), nil, nil, &where, Marker{}, nil)
2856-
// _require.Nil(err)
2857-
//
2858-
// for _, blob := range lResp.Blobs {
2859-
// _assert(blob.TagValue, chk.Equals, "firsttag")
2860-
// }
2861-
// }
2862-
//
2791+
func (s *BlockBlobUnrecordedTestsSuite) TestFilterBlobsWithTags() {
2792+
_require := require.New(s.T())
2793+
testName := s.T().Name()
2794+
svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil)
2795+
_require.NoError(err)
2796+
2797+
containerClient := testcommon.CreateNewContainer(context.Background(), _require, testcommon.GenerateContainerName(testName)+"1", svcClient)
2798+
defer testcommon.DeleteContainer(context.Background(), _require, containerClient)
2799+
2800+
blobTagsMap1 := map[string]string{
2801+
"tag2": "tagsecond",
2802+
"tag3": "tagthird",
2803+
}
2804+
blobTagsMap2 := map[string]string{
2805+
"tag1": "firsttag",
2806+
"tag2": "secondtag",
2807+
"tag3": "thirdtag",
2808+
"tag key": "tag value", // tags with spaces
2809+
}
2810+
2811+
blobName1 := testcommon.GenerateBlobName(testName) + "1"
2812+
blobClient1 := testcommon.CreateNewBlockBlob(context.Background(), _require, blobName1, containerClient)
2813+
_, err = blobClient1.SetTags(context.Background(), blobTagsMap1, nil)
2814+
_require.Nil(err)
2815+
2816+
blobName2 := testcommon.GenerateBlobName(testName) + "2"
2817+
blobClient2 := testcommon.CreateNewBlockBlob(context.Background(), _require, blobName2, containerClient)
2818+
_, err = blobClient2.SetTags(context.Background(), blobTagsMap2, nil)
2819+
_require.Nil(err)
2820+
time.Sleep(10 * time.Second)
2821+
2822+
blobTagsResp, err := blobClient2.GetTags(context.Background(), nil)
2823+
_require.Nil(err)
2824+
blobTagsSet := blobTagsResp.BlobTagSet
2825+
_require.NotNil(blobTagsSet)
2826+
2827+
// Test invalid tag
2828+
where := "\"tag4\"='fourthtag'"
2829+
lResp, err := svcClient.FilterBlobs(context.Background(), &service.FilterBlobsOptions{Where: &where})
2830+
_require.Nil(err)
2831+
_require.Equal(len(lResp.Blobs), 0)
2832+
2833+
// Test multiple valid tags
2834+
where = "\"tag1\"='firsttag'AND\"tag2\"='secondtag'"
2835+
// where := "foo=\"value 1\""
2836+
lResp, err = svcClient.FilterBlobs(context.Background(), &service.FilterBlobsOptions{Where: &where})
2837+
_require.Nil(err)
2838+
_require.Len(lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet, 2)
2839+
_require.Equal(lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet[0], blobTagsSet[1])
2840+
_require.Equal(lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet[1], blobTagsSet[2])
2841+
2842+
// Test tags with spaces
2843+
where = "\"tag key\"='tag value'"
2844+
lResp, err = svcClient.FilterBlobs(context.Background(), &service.FilterBlobsOptions{Where: &where})
2845+
_require.Nil(err)
2846+
_require.Len(lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet, 1)
2847+
_require.Equal(lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet[0], blobTagsSet[0])
2848+
2849+
}
28632850

28642851
// func (s *BlockBlobUnrecordedTestsSuite) TestFilterBlobsUsingAccountSAS() {
28652852
// accountName, accountKey := accountInfo()

sdk/storage/azblob/internal/generated/autorest.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,14 @@ directive:
321321
from: BlobPropertiesInternal
322322
to: BlobProperties
323323
```
324+
325+
### Updating encoding URL, Golang adds '+' which disrupts encoding with service
326+
327+
``` yaml
328+
directive:
329+
- from: zz_service_client.go
330+
where: $
331+
transform: >-
332+
return $.
333+
replace(/req.Raw\(\).URL.RawQuery \= reqQP.Encode\(\)/, `req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1)`)
334+
```

sdk/storage/azblob/internal/generated/zz_service_client.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/storage/azblob/pageblob/client_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"context"
1212
"crypto/md5"
1313
"encoding/binary"
14+
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service"
1415
"hash/crc64"
1516
"io"
1617
"math/rand"
@@ -3917,6 +3918,7 @@ func (s *PageBlobUnrecordedTestsSuite) TestCreatePageBlobWithTags() {
39173918

39183919
_, err = pbClient.SetTags(context.Background(), testcommon.BasicBlobTagsMap, nil)
39193920
_require.Nil(err)
3921+
time.Sleep(10 * time.Second)
39203922
// _require.Equal(setTagResp.RawResponse.StatusCode, 204)
39213923

39223924
gpResp, err := pbClient.GetProperties(context.Background(), nil)
@@ -3957,6 +3959,13 @@ func (s *PageBlobUnrecordedTestsSuite) TestCreatePageBlobWithTags() {
39573959
for _, blobTag := range blobTagsSet {
39583960
_require.Equal(modifiedBlobTags[*blobTag.Key], *blobTag.Value)
39593961
}
3962+
3963+
// Test FilterBlobs API
3964+
where := "\"azure\"='blob'"
3965+
lResp, err := svcClient.FilterBlobs(context.Background(), &service.FilterBlobsOptions{Where: &where})
3966+
_require.Nil(err)
3967+
_require.Equal(*lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet[0].Key, "azure")
3968+
_require.Equal(*lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet[0].Value, "blob")
39603969
}
39613970

39623971
func (s *PageBlobUnrecordedTestsSuite) TestPageBlobSetBlobTagForSnapshot() {
@@ -3972,6 +3981,7 @@ func (s *PageBlobUnrecordedTestsSuite) TestPageBlobSetBlobTagForSnapshot() {
39723981

39733982
_, err = pbClient.SetTags(context.Background(), testcommon.SpecialCharBlobTagsMap, nil)
39743983
_require.Nil(err)
3984+
time.Sleep(10 * time.Second)
39753985

39763986
resp, err := pbClient.CreateSnapshot(context.Background(), nil)
39773987
_require.Nil(err)
@@ -3990,6 +4000,15 @@ func (s *PageBlobUnrecordedTestsSuite) TestPageBlobSetBlobTagForSnapshot() {
39904000
for _, blobTag := range blobTagsSet {
39914001
_require.Equal(testcommon.SpecialCharBlobTagsMap[*blobTag.Key], *blobTag.Value)
39924002
}
4003+
4004+
// Tags with spaces
4005+
where := "\"GO \"='.Net'"
4006+
lResp, err := svcClient.FilterBlobs(context.Background(), &service.FilterBlobsOptions{
4007+
Where: &where,
4008+
})
4009+
_require.Nil(err)
4010+
_require.Equal(*lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet[0].Key, "GO ")
4011+
_require.Equal(*lResp.FilterBlobSegment.Blobs[0].Tags.BlobTagSet[0].Value, ".Net")
39934012
}
39944013

39954014
func (s *PageBlobRecordedTestsSuite) TestCreatePageBlobReturnsVID() {

0 commit comments

Comments
 (0)