From e6e1faf41cacb095f2528993506f5a8c51ab7225 Mon Sep 17 00:00:00 2001 From: Gauri Prasad <51212198+gapra-msft@users.noreply.github.com> Date: Fri, 10 Feb 2023 10:06:02 -0800 Subject: [PATCH] Added a few service client tests (#19924) * Added a few service client tests and some changes to testcommon * Fixed type of arg * Addressed comments from PR * Modified some tests and uploaded some assets * make sas unrecorded * fix ineffassign * Removing deprecated import * Ignoring unused lint --------- Co-authored-by: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> --- sdk/storage/azblob/appendblob/client_test.go | 8 +- sdk/storage/azblob/assets.json | 2 +- sdk/storage/azblob/blob/client_test.go | 10 +- sdk/storage/azblob/blob/retry_reader_test.go | 2 +- sdk/storage/azblob/blockblob/client_test.go | 10 +- .../internal/testcommon/clients_auth.go | 54 ++++--- sdk/storage/azblob/pageblob/client_test.go | 4 +- sdk/storage/azblob/service/client.go | 2 +- sdk/storage/azblob/service/client_test.go | 141 +++++++++++++++--- 9 files changed, 176 insertions(+), 57 deletions(-) diff --git a/sdk/storage/azblob/appendblob/client_test.go b/sdk/storage/azblob/appendblob/client_test.go index 009d066e02ad..63dca724f609 100644 --- a/sdk/storage/azblob/appendblob/client_test.go +++ b/sdk/storage/azblob/appendblob/client_test.go @@ -263,7 +263,7 @@ func (s *AppendBlobUnrecordedTestsSuite) TestAppendBlockFromURL() { // Get source abClient URL with SAS for AppendBlockFromURL. srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) perms := sas.BlobPermissions{Read: true} @@ -345,7 +345,7 @@ func (s *AppendBlobUnrecordedTestsSuite) TestAppendBlockFromURLWithMD5() { // Get source abClient URL with SAS for AppendBlockFromURL. srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) perms := sas.BlobPermissions{Read: true} @@ -1763,7 +1763,7 @@ func (s *AppendBlobRecordedTestsSuite) TestAppendBlockPermanentDelete() { parts, err := sas.ParseURL(abClient.URL()) // Get parts for BlobURL _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) // Set Account SAS and set Permanent Delete to true @@ -1872,7 +1872,7 @@ func (s *AppendBlobRecordedTestsSuite) TestAppendBlockPermanentDeleteWithoutPerm parts, err := sas.ParseURL(abClient.URL()) // Get parts for BlobURL _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) // Set Account SAS diff --git a/sdk/storage/azblob/assets.json b/sdk/storage/azblob/assets.json index 3ac1b0af1830..11783d2a84b4 100644 --- a/sdk/storage/azblob/assets.json +++ b/sdk/storage/azblob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azblob", - "Tag": "go/storage/azblob_46e572d43a" + "Tag": "go/storage/azblob_658d0bdec9" } diff --git a/sdk/storage/azblob/blob/client_test.go b/sdk/storage/azblob/blob/client_test.go index 48059f028899..c7e985cd0487 100644 --- a/sdk/storage/azblob/blob/client_test.go +++ b/sdk/storage/azblob/blob/client_test.go @@ -111,7 +111,7 @@ func (s *BlobUnrecordedTestsSuite) TestCreateBlobClientWithSnapshotAndSAS() { currentTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) sasQueryParams, err := sas.AccountSignatureValues{ @@ -152,7 +152,7 @@ func (s *BlobUnrecordedTestsSuite) TestCreateBlobClientWithSnapshotAndSASUsingCo currentTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) sasQueryParams, err := sas.AccountSignatureValues{ Protocol: sas.ProtocolHTTPS, @@ -418,7 +418,7 @@ func (s *BlobRecordedTestsSuite) TestBlobStartCopySourcePrivate() { // bbClient := testcommon.CreateNewBlockBlob(context.Background(), _require, blockBlobName, containerClient) // // // Create sas values for the source blob -// credential, err := testcommon.GetGenericCredential(nil, testcommon.TestAccountDefault) +// credential, err := testcommon.GetGenericSharedKeyCredential(nil, testcommon.TestAccountDefault) // if err != nil { // s.T().Fatal("Couldn't fetch credential because " + err.Error()) // } @@ -3022,7 +3022,7 @@ func (s *BlobRecordedTestsSuite) TestPermanentDelete() { parts, err := sas.ParseURL(bbClient.URL()) // Get parts for BlobURL _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) // Set Account SAS and set Permanent Delete to true @@ -3132,7 +3132,7 @@ func (s *BlobRecordedTestsSuite) TestPermanentDeleteWithoutPermission() { parts, err := sas.ParseURL(bbClient.URL()) // Get parts for BlobURL _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) // Set Account SAS diff --git a/sdk/storage/azblob/blob/retry_reader_test.go b/sdk/storage/azblob/blob/retry_reader_test.go index e280a38193dd..9e34da5f0c19 100644 --- a/sdk/storage/azblob/blob/retry_reader_test.go +++ b/sdk/storage/azblob/blob/retry_reader_test.go @@ -8,10 +8,10 @@ package blob import ( "context" + "crypto/rand" "errors" "fmt" "io" - "math/rand" "net" "net/http" "testing" diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 90389d37457a..346b3f51ac8b 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -190,7 +190,7 @@ type BlockBlobUnrecordedTestsSuite struct { // // Get source blob url with SAS for StageFromURL. // srcBlobParts, _ := NewBlobURLParts(srcBlob.URL()) // -// credential, err := testcommon.GetGenericCredential(nil, testcommon.TestAccountDefault) +// credential, err := testcommon.GetGenericSharedKeyCredential(nil, testcommon.TestAccountDefault) // _require.Nil(err) // // srcBlobParts.SAS, err = BlobSASSignatureValues{ @@ -287,7 +287,7 @@ type BlockBlobUnrecordedTestsSuite struct { // // Get source blob url with SAS for StageFromURL. // srcBlobParts, _ := NewBlobURLParts(srcBlob.URL()) // -// credential, err := testcommon.GetGenericCredential(nil, testcommon.TestAccountDefault) +// credential, err := testcommon.GetGenericSharedKeyCredential(nil, testcommon.TestAccountDefault) // _require.Nil(err) // // srcBlobParts.SAS, err = BlobSASSignatureValues{ @@ -387,7 +387,7 @@ type BlockBlobUnrecordedTestsSuite struct { // contentLanguageVal := "content-language-override" // contentTypeVal := "content-type-override" // -// credential, err := testcommon.GetGenericCredential(nil, testcommon.TestAccountDefault) +// credential, err := testcommon.GetGenericSharedKeyCredential(nil, testcommon.TestAccountDefault) // _require.Nil(err) // // Append User Delegation SAS token to URL // blobParts.SAS, err = BlobSASSignatureValues{ @@ -1308,7 +1308,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestSetTierOnCopyBlockBlobFromURL() { expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) if err != nil { s.T().Fatal("Couldn't fetch credential because " + err.Error()) } @@ -1369,7 +1369,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestSetTierOnCopyBlockBlobFromURL() { // // // Get source blob url with SAS for StageFromURL. // srcBlobParts, _ := NewBlobURLParts(srcBlob.URL()) -// credential, err := testcommon.GetGenericCredential(nil, testcommon.TestAccountDefault) +// credential, err := testcommon.GetGenericSharedKeyCredential(nil, testcommon.TestAccountDefault) // _require.Nil(err) // srcBlobParts.SAS, err = blob.SASSignatureValues{ // Protocol: SASProtocolHTTPS, // Users MUST use HTTPS (not HTTP) diff --git a/sdk/storage/azblob/internal/testcommon/clients_auth.go b/sdk/storage/azblob/internal/testcommon/clients_auth.go index b49e9bb7be38..62b538f958e2 100644 --- a/sdk/storage/azblob/internal/testcommon/clients_auth.go +++ b/sdk/storage/azblob/internal/testcommon/clients_auth.go @@ -86,7 +86,7 @@ var SpecialCharBlobTagsMap = map[string]string{ "GO ": ".Net", } -func setClientOptions(t *testing.T, opts *azcore.ClientOptions) { +func SetClientOptions(t *testing.T, opts *azcore.ClientOptions) { opts.Logging.AllowedHeaders = append(opts.Logging.AllowedHeaders, "X-Request-Mismatch", "X-Request-Mismatch-Error") transport, err := recording.NewRecordingHTTPClient(t, nil) @@ -99,9 +99,9 @@ func GetClient(t *testing.T, accountType TestAccountType, options *azblob.Client options = &azblob.ClientOptions{} } - setClientOptions(t, &options.ClientOptions) + SetClientOptions(t, &options.ClientOptions) - cred, err := GetGenericCredential(accountType) + cred, err := GetGenericSharedKeyCredential(accountType) if err != nil { return nil, err } @@ -116,9 +116,9 @@ func GetServiceClient(t *testing.T, accountType TestAccountType, options *servic options = &service.ClientOptions{} } - setClientOptions(t, &options.ClientOptions) + SetClientOptions(t, &options.ClientOptions) - cred, err := GetGenericCredential(accountType) + cred, err := GetGenericSharedKeyCredential(accountType) if err != nil { return nil, err } @@ -128,7 +128,22 @@ func GetServiceClient(t *testing.T, accountType TestAccountType, options *servic return serviceClient, err } -func GetAccountInfo(accountType TestAccountType) (string, string) { +func GetServiceClientNoCredential(t *testing.T, sasUrl string, options *service.ClientOptions) (*service.Client, error) { + if options == nil { + options = &service.ClientOptions{} + } + + SetClientOptions(t, &options.ClientOptions) + + serviceClient, err := service.NewClientWithNoCredential(sasUrl, options) + + return serviceClient, err +} + +func GetGenericAccountInfo(accountType TestAccountType) (string, string) { + if recording.GetRecordMode() == recording.PlaybackMode { + return FakeStorageAccount, "ZmFrZQ==" + } accountNameEnvVar := string(accountType) + AccountNameEnvVar accountKeyEnvVar := string(accountType) + AccountKeyEnvVar accountName, _ := GetRequiredEnv(accountNameEnvVar) @@ -136,40 +151,39 @@ func GetAccountInfo(accountType TestAccountType) (string, string) { return accountName, accountKey } -func GetGenericCredential(accountType TestAccountType) (*azblob.SharedKeyCredential, error) { - if recording.GetRecordMode() == recording.PlaybackMode { - return azblob.NewSharedKeyCredential(FakeStorageAccount, "ZmFrZQ==") - } - - accountName, accountKey := GetAccountInfo(accountType) +func GetGenericSharedKeyCredential(accountType TestAccountType) (*azblob.SharedKeyCredential, error) { + accountName, accountKey := GetGenericAccountInfo(accountType) if accountName == "" || accountKey == "" { return nil, errors.New(string(accountType) + AccountNameEnvVar + " and/or " + string(accountType) + AccountKeyEnvVar + " environment variables not specified.") } return azblob.NewSharedKeyCredential(accountName, accountKey) } -func GetConnectionString(accountType TestAccountType) string { - accountName, accountKey := GetAccountInfo(accountType) +func GetGenericConnectionString(accountType TestAccountType) (*string, error) { + accountName, accountKey := GetGenericAccountInfo(accountType) + if accountName == "" || accountKey == "" { + return nil, errors.New(string(accountType) + AccountNameEnvVar + " and/or " + string(accountType) + AccountKeyEnvVar + " environment variables not specified.") + } connectionString := fmt.Sprintf("DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s;EndpointSuffix=core.windows.net/", accountName, accountKey) - return connectionString + return &connectionString, nil } func GetServiceClientFromConnectionString(t *testing.T, accountType TestAccountType, options *service.ClientOptions) (*service.Client, error) { if options == nil { options = &service.ClientOptions{} } + SetClientOptions(t, &options.ClientOptions) transport, err := recording.NewRecordingHTTPClient(t, nil) require.NoError(t, err) options.Transport = transport - if recording.GetRecordMode() == recording.PlaybackMode { - return service.NewClientWithNoCredential(FakeStorageURL, options) + cred, err := GetGenericConnectionString(accountType) + if err != nil { + return nil, err } - - connectionString := GetConnectionString(accountType) - svcClient, err := service.NewClientFromConnectionString(connectionString, options) + svcClient, err := service.NewClientFromConnectionString(*cred, options) return svcClient, err } diff --git a/sdk/storage/azblob/pageblob/client_test.go b/sdk/storage/azblob/pageblob/client_test.go index fb0c6f405d20..8d133dec20b0 100644 --- a/sdk/storage/azblob/pageblob/client_test.go +++ b/sdk/storage/azblob/pageblob/client_test.go @@ -4029,7 +4029,7 @@ func (s *PageBlobRecordedTestsSuite) TestPageBlockPermanentDelete() { parts, err := sas.ParseURL(pbClient.URL()) // Get parts for BlobURL _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) // Set Account SAS and set Permanent Delete to true @@ -4146,7 +4146,7 @@ func (s *PageBlobRecordedTestsSuite) TestPageBlockPermanentDeleteWithoutPermissi parts, err := sas.ParseURL(pbClient.URL()) // Get parts for BlobURL _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) // Set Account SAS diff --git a/sdk/storage/azblob/service/client.go b/sdk/storage/azblob/service/client.go index 526f540ca937..19d613aaf65f 100644 --- a/sdk/storage/azblob/service/client.go +++ b/sdk/storage/azblob/service/client.go @@ -27,7 +27,7 @@ import ( // ClientOptions contains the optional parameters when creating a Client. type ClientOptions struct { - azcore.ClientOptions + azcore.ClientOptions //nolint:unused } // Client represents a URL to the Azure Blob Storage service allowing you to manipulate blob containers. diff --git a/sdk/storage/azblob/service/client_test.go b/sdk/storage/azblob/service/client_test.go index 42a61c62277a..00b88de5bcaf 100644 --- a/sdk/storage/azblob/service/client_test.go +++ b/sdk/storage/azblob/service/client_test.go @@ -81,10 +81,10 @@ func (s *ServiceUnrecordedTestsSuite) TestServiceClientFromConnectionString() { _require := require.New(s.T()) testName := s.T().Name() - accountName, _ := testcommon.GetAccountInfo(testcommon.TestAccountDefault) - connectionString := testcommon.GetConnectionString(testcommon.TestAccountDefault) + accountName, _ := testcommon.GetGenericAccountInfo(testcommon.TestAccountDefault) + connectionString, _ := testcommon.GetGenericConnectionString(testcommon.TestAccountDefault) - parsedConnStr, err := shared.ParseConnectionString(connectionString) + parsedConnStr, err := shared.ParseConnectionString(*connectionString) _require.Nil(err) _require.Equal(parsedConnStr.ServiceURL, "https://"+accountName+".blob.core.windows.net/") @@ -669,36 +669,38 @@ func (s *ServiceRecordedTestsSuite) TestAccountDeleteRetentionPolicyDaysOmitted( func (s *ServiceUnrecordedTestsSuite) TestSASServiceClient() { _require := require.New(s.T()) testName := s.T().Name() - accountName := os.Getenv("AZURE_STORAGE_ACCOUNT_NAME") - accountKey := os.Getenv("AZURE_STORAGE_ACCOUNT_KEY") - cred, err := azblob.NewSharedKeyCredential(accountName, accountKey) - _require.Nil(err) + cred, _ := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) - serviceClient, err := service.NewClientWithSharedKeyCredential(fmt.Sprintf("https://%s.blob.core.windows.net/", accountName), cred, nil) + serviceClient, err := service.NewClientWithSharedKeyCredential(fmt.Sprintf("https://%s.blob.core.windows.net/", cred.AccountName()), cred, nil) _require.Nil(err) containerName := testcommon.GenerateContainerName(testName) + // Note: Always set all permissions, services, types to true to ensure order of string formed is correct. resources := sas.AccountResourceTypes{ Object: true, Service: true, Container: true, } permissions := sas.AccountPermissions{ - Read: true, - Add: true, - Write: true, - Create: true, - Update: true, - Delete: true, + Read: true, + Write: true, + Delete: true, + DeletePreviousVersion: true, + List: true, + Add: true, + Create: true, + Update: true, + Process: true, + Tag: true, + FilterByTags: true, + PermanentDelete: true, } - expiry := time.Now().Add(time.Hour) - sasUrl, err := serviceClient.GetSASURL(resources, permissions, expiry, nil) _require.Nil(err) - svcClient, err := service.NewClientWithNoCredential(sasUrl, nil) + svcClient, err := testcommon.GetServiceClientNoCredential(s.T(), sasUrl, nil) _require.Nil(err) // create container using SAS @@ -709,6 +711,70 @@ func (s *ServiceUnrecordedTestsSuite) TestSASServiceClient() { _require.Nil(err) } +func (s *ServiceUnrecordedTestsSuite) TestSASServiceClientNoKey() { + _require := require.New(s.T()) + accountName := os.Getenv("AZURE_STORAGE_ACCOUNT_NAME") + + serviceClient, err := service.NewClientWithNoCredential(fmt.Sprintf("https://%s.blob.core.windows.net/", accountName), nil) + _require.Nil(err) + resources := sas.AccountResourceTypes{ + Object: true, + Service: true, + Container: true, + } + permissions := sas.AccountPermissions{ + Read: true, + Write: true, + Delete: true, + DeletePreviousVersion: true, + List: true, + Add: true, + Create: true, + Update: true, + Process: true, + Tag: true, + FilterByTags: true, + PermanentDelete: true, + } + + expiry := time.Now().Add(time.Hour) + _, err = serviceClient.GetSASURL(resources, permissions, expiry, nil) + _require.Equal(err.Error(), "SAS can only be signed with a SharedKeyCredential") +} + +func (s *ServiceUnrecordedTestsSuite) TestSASServiceClientSignNegative() { + _require := require.New(s.T()) + accountName := os.Getenv("AZURE_STORAGE_ACCOUNT_NAME") + accountKey := os.Getenv("AZURE_STORAGE_ACCOUNT_KEY") + cred, err := azblob.NewSharedKeyCredential(accountName, accountKey) + _require.Nil(err) + + serviceClient, err := service.NewClientWithSharedKeyCredential(fmt.Sprintf("https://%s.blob.core.windows.net/", accountName), cred, nil) + _require.Nil(err) + resources := sas.AccountResourceTypes{ + Object: true, + Service: true, + Container: true, + } + permissions := sas.AccountPermissions{ + Read: true, + Write: true, + Delete: true, + DeletePreviousVersion: true, + List: true, + Add: true, + Create: true, + Update: true, + Process: true, + Tag: true, + FilterByTags: true, + PermanentDelete: true, + } + expiry := time.Time{} + _, err = serviceClient.GetSASURL(resources, permissions, expiry, nil) + _require.Equal(err.Error(), "account SAS is missing at least one of these: ExpiryTime, Permissions, Service, or ResourceType") +} + func (s *ServiceUnrecordedTestsSuite) TestNoSharedKeyCredError() { _require := require.New(s.T()) accountName := os.Getenv("AZURE_STORAGE_ACCOUNT_NAME") @@ -904,7 +970,7 @@ func (s *ServiceUnrecordedTestsSuite) TestServiceSASUploadDownload() { _, err = svcClient.CreateContainer(context.Background(), containerName, nil) _require.Nil(err) - credential, err := testcommon.GetGenericCredential(testcommon.TestAccountDefault) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) _require.Nil(err) sasQueryParams, err := sas.BlobSignatureValues{ @@ -951,3 +1017,42 @@ func (s *ServiceUnrecordedTestsSuite) TestServiceSASUploadDownload() { err = reader.Close() _require.Nil(err) } + +func (s *ServiceRecordedTestsSuite) TestAccountGetStatistics() { + _require := require.New(s.T()) + accountName := os.Getenv("AZURE_STORAGE_ACCOUNT_NAME") + accountKey := os.Getenv("AZURE_STORAGE_ACCOUNT_KEY") + cred, err := azblob.NewSharedKeyCredential(accountName, accountKey) + _require.Nil(err) + + options := &service.ClientOptions{} + testcommon.SetClientOptions(s.T(), &options.ClientOptions) + serviceClient, err := service.NewClientWithSharedKeyCredential(fmt.Sprintf("https://%s-secondary.blob.core.windows.net/", accountName), cred, options) + _require.Nil(err) + + resp, err := serviceClient.GetStatistics(context.Background(), &service.GetStatisticsOptions{}) + _require.Nil(err) + _require.NotNil(resp.Version) + _require.NotNil(resp.RequestID) + _require.NotNil(resp.Date) + _require.NotNil(resp.GeoReplication) + _require.NotNil(resp.GeoReplication.Status) + if *resp.GeoReplication.Status == service.BlobGeoReplicationStatusLive { + _require.NotNil(resp.GeoReplication.LastSyncTime) + } else { + _require.Nil(resp.GeoReplication.LastSyncTime) + } +} + +// Note: Further tests for filterblobs in pageblob and appendblob +// TODO : Need to add scraping logic to remove any endpoints from Body +func (s *ServiceRecordedTestsSuite) TestAccountFilterBlobs() { + _require := require.New(s.T()) + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + filter := "\"key\"='value'" + resp, err := svcClient.FilterBlobs(context.Background(), filter, &service.FilterBlobsOptions{}) + _require.Nil(err) + _require.Len(resp.FilterBlobSegment.Blobs, 0) +}