Add some test cases for blob service (#4890)
This commit is contained in:
parent
678d08072b
commit
f6f2617201
@ -280,6 +280,7 @@ void TestProxyManager::SetProxySanitizer()
|
||||
"x-ms-file-creation-time",
|
||||
"x-ms-file-last-write-time",
|
||||
"x-ms-rename-source",
|
||||
"x-ms-immutability-policy-until-date",
|
||||
};
|
||||
const std::vector<std::string> ignoreQueryParameters = {
|
||||
"st",
|
||||
|
||||
@ -2,5 +2,5 @@
|
||||
"AssetsRepo": "Azure/azure-sdk-assets",
|
||||
"AssetsRepoPrefixPath": "cpp",
|
||||
"TagPrefix": "cpp/storage",
|
||||
"Tag": "cpp/storage_bc6afdd1c4"
|
||||
"Tag": "cpp/storage_4491a2739b"
|
||||
}
|
||||
|
||||
@ -77,14 +77,14 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
}
|
||||
|
||||
Blobs::Models::BlobItem BlobContainerClientTest::GetBlobItem(
|
||||
const Blobs::BlobContainerClient& containerClient,
|
||||
const std::string& blobName,
|
||||
Blobs::Models::ListBlobsIncludeFlags include)
|
||||
{
|
||||
Blobs::ListBlobsOptions options;
|
||||
options.Prefix = blobName;
|
||||
options.Include = include;
|
||||
for (auto page = m_blobContainerClient->ListBlobs(options); page.HasPage();
|
||||
page.MoveToNextPage())
|
||||
for (auto page = containerClient.ListBlobs(options); page.HasPage(); page.MoveToNextPage())
|
||||
{
|
||||
for (auto& blob : page.Blobs)
|
||||
{
|
||||
@ -572,21 +572,10 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
auto appendBlobClient = containerClient2.GetAppendBlobClient(blobName);
|
||||
auto blobContentInfo = appendBlobClient.Create();
|
||||
{
|
||||
Blobs::ListBlobsOptions listOptions;
|
||||
listOptions.Prefix = blobName;
|
||||
for (auto page = containerClient2.ListBlobs(listOptions); page.HasPage();
|
||||
page.MoveToNextPage())
|
||||
{
|
||||
for (auto& blob : page.Blobs)
|
||||
{
|
||||
if (blob.Name == blobName)
|
||||
{
|
||||
EXPECT_TRUE(blob.Details.IsServerEncrypted);
|
||||
EXPECT_TRUE(blob.Details.EncryptionScope.HasValue());
|
||||
EXPECT_EQ(blob.Details.EncryptionScope.Value(), testEncryptionScope);
|
||||
}
|
||||
}
|
||||
}
|
||||
auto blobItem = GetBlobItem(containerClient2, blobName);
|
||||
EXPECT_TRUE(blobItem.Details.IsServerEncrypted);
|
||||
EXPECT_TRUE(blobItem.Details.EncryptionScope.HasValue());
|
||||
EXPECT_EQ(blobItem.Details.EncryptionScope.Value(), testEncryptionScope);
|
||||
}
|
||||
appendBlobClient.Delete();
|
||||
EXPECT_TRUE(blobContentInfo.Value.EncryptionScope.HasValue());
|
||||
@ -1382,4 +1371,72 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
ASSERT_TRUE(blobItem.HasVersionsOnly.HasValue());
|
||||
EXPECT_TRUE(blobItem.HasVersionsOnly.Value());
|
||||
}
|
||||
|
||||
TEST_F(BlobContainerClientTest, ObjectReplication_PLAYBACKONLY_)
|
||||
{
|
||||
auto clientOptions = InitStorageClientOptions<Blobs::BlobClientOptions>();
|
||||
auto sourceServiceClient = Blobs::BlobServiceClient::CreateFromConnectionString(
|
||||
StandardStorageConnectionString(), clientOptions);
|
||||
auto destServiceClient = Blobs::BlobServiceClient::CreateFromConnectionString(
|
||||
AdlsGen2ConnectionString(), clientOptions);
|
||||
auto sourceContainerClient = sourceServiceClient.GetBlobContainerClient("src");
|
||||
auto destContainerClient = destServiceClient.GetBlobContainerClient("dest");
|
||||
|
||||
const auto blobName = "1.txt";
|
||||
auto sourceBlobClient = sourceContainerClient.GetBlockBlobClient(blobName);
|
||||
auto destBlobClient = destContainerClient.GetBlockBlobClient(blobName);
|
||||
|
||||
{
|
||||
auto properties = sourceBlobClient.GetProperties().Value;
|
||||
EXPECT_FALSE(properties.ObjectReplicationSourceProperties.empty());
|
||||
for (const auto& i : properties.ObjectReplicationSourceProperties)
|
||||
{
|
||||
EXPECT_FALSE(i.PolicyId.empty());
|
||||
EXPECT_FALSE(i.Rules.empty());
|
||||
for (const auto& j : i.Rules)
|
||||
{
|
||||
EXPECT_FALSE(j.RuleId.empty());
|
||||
EXPECT_FALSE(j.ReplicationStatus.ToString().empty());
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
auto blobItem = GetBlobItem(sourceContainerClient, blobName);
|
||||
EXPECT_FALSE(blobItem.Details.ObjectReplicationSourceProperties.empty());
|
||||
for (const auto& i : blobItem.Details.ObjectReplicationSourceProperties)
|
||||
{
|
||||
EXPECT_FALSE(i.PolicyId.empty());
|
||||
EXPECT_FALSE(i.Rules.empty());
|
||||
for (const auto& j : i.Rules)
|
||||
{
|
||||
EXPECT_FALSE(j.RuleId.empty());
|
||||
EXPECT_FALSE(j.ReplicationStatus.ToString().empty());
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
auto downloadResponse = sourceBlobClient.Download().Value;
|
||||
EXPECT_FALSE(downloadResponse.Details.ObjectReplicationSourceProperties.empty());
|
||||
for (const auto& i : downloadResponse.Details.ObjectReplicationSourceProperties)
|
||||
{
|
||||
EXPECT_FALSE(i.PolicyId.empty());
|
||||
EXPECT_FALSE(i.Rules.empty());
|
||||
for (const auto& j : i.Rules)
|
||||
{
|
||||
EXPECT_FALSE(j.RuleId.empty());
|
||||
EXPECT_FALSE(j.ReplicationStatus.ToString().empty());
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
auto properties = destBlobClient.GetProperties().Value;
|
||||
ASSERT_TRUE(properties.ObjectReplicationDestinationPolicyId.HasValue());
|
||||
EXPECT_FALSE(properties.ObjectReplicationDestinationPolicyId.Value().empty());
|
||||
}
|
||||
{
|
||||
auto downloadResponse = destBlobClient.Download().Value;
|
||||
ASSERT_TRUE(downloadResponse.Details.ObjectReplicationDestinationPolicyId.HasValue());
|
||||
EXPECT_FALSE(downloadResponse.Details.ObjectReplicationDestinationPolicyId.Value().empty());
|
||||
}
|
||||
}
|
||||
}}} // namespace Azure::Storage::Test
|
||||
|
||||
@ -16,7 +16,16 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
Blobs::BlobClientOptions clientOptions = Blobs::BlobClientOptions());
|
||||
|
||||
std::string GetSas();
|
||||
|
||||
Blobs::Models::BlobItem GetBlobItem(
|
||||
const std::string& blobName,
|
||||
Blobs::Models::ListBlobsIncludeFlags include = Blobs::Models::ListBlobsIncludeFlags::None)
|
||||
{
|
||||
return GetBlobItem(*m_blobContainerClient, blobName, include);
|
||||
}
|
||||
|
||||
Blobs::Models::BlobItem GetBlobItem(
|
||||
const Blobs::BlobContainerClient& containerClient,
|
||||
const std::string& blobName,
|
||||
Blobs::Models::ListBlobsIncludeFlags include = Blobs::Models::ListBlobsIncludeFlags::None);
|
||||
|
||||
|
||||
@ -23,7 +23,8 @@ namespace Azure { namespace Storage { namespace Blobs { namespace Models {
|
||||
|
||||
bool operator==(const BlobImmutabilityPolicy& lhs, const BlobImmutabilityPolicy& rhs)
|
||||
{
|
||||
return lhs.ExpiresOn == rhs.ExpiresOn && lhs.PolicyMode == rhs.PolicyMode;
|
||||
return lhs.PolicyMode == rhs.PolicyMode
|
||||
&& (lhs.ExpiresOn - rhs.ExpiresOn) <= std::chrono::seconds(1);
|
||||
}
|
||||
|
||||
}}}} // namespace Azure::Storage::Blobs::Models
|
||||
@ -135,32 +136,16 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
|
||||
blobClient.UploadFrom(nullptr, 0);
|
||||
|
||||
auto getBlobItem = [&]() {
|
||||
Blobs::ListBlobsOptions options;
|
||||
options.Prefix = blobName;
|
||||
options.Include = Blobs::Models::ListBlobsIncludeFlags::Deleted;
|
||||
for (auto page = blobContainerClient.ListBlobs(options); page.HasPage();
|
||||
page.MoveToNextPage())
|
||||
{
|
||||
for (auto& blob : page.Blobs)
|
||||
{
|
||||
if (blob.Name == blobName)
|
||||
{
|
||||
return std::move(blob);
|
||||
}
|
||||
}
|
||||
}
|
||||
std::abort();
|
||||
};
|
||||
|
||||
auto blobItem = getBlobItem();
|
||||
auto blobItem
|
||||
= GetBlobItem(blobContainerClient, blobName, Blobs::Models::ListBlobsIncludeFlags::Deleted);
|
||||
EXPECT_FALSE(blobItem.IsDeleted);
|
||||
EXPECT_FALSE(blobItem.Details.DeletedOn.HasValue());
|
||||
EXPECT_FALSE(blobItem.Details.RemainingRetentionDays.HasValue());
|
||||
|
||||
blobClient.Delete();
|
||||
|
||||
blobItem = getBlobItem();
|
||||
blobItem
|
||||
= GetBlobItem(blobContainerClient, blobName, Blobs::Models::ListBlobsIncludeFlags::Deleted);
|
||||
EXPECT_TRUE(blobItem.IsDeleted);
|
||||
ASSERT_TRUE(blobItem.Details.DeletedOn.HasValue());
|
||||
EXPECT_TRUE(IsValidTime(blobItem.Details.DeletedOn.Value()));
|
||||
@ -1166,9 +1151,9 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(BlockBlobClientTest, DISABLED_Immutability)
|
||||
TEST_F(BlockBlobClientTest, Immutability_PLAYBACKONLY_)
|
||||
{
|
||||
const auto ImmutabilityMaxLength = std::chrono::seconds(5);
|
||||
const auto ImmutabilityMaxLength = std::chrono::seconds(30);
|
||||
const std::string blobName = m_blobName;
|
||||
auto blobClient = *m_blockBlobClient;
|
||||
|
||||
@ -1222,12 +1207,12 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
EXPECT_EQ(copyDestinationBlobClient.GetProperties().Value.ImmutabilityPolicy.Value(), policy);
|
||||
}
|
||||
|
||||
std::this_thread::sleep_for(ImmutabilityMaxLength);
|
||||
TestSleep(ImmutabilityMaxLength);
|
||||
}
|
||||
|
||||
TEST_F(BlockBlobClientTest, DISABLED_ImmutabilityAccessCondition)
|
||||
TEST_F(BlockBlobClientTest, ImmutabilityAccessCondition_PLAYBACKONLY_)
|
||||
{
|
||||
const auto ImmutabilityMaxLength = std::chrono::seconds(5);
|
||||
const auto ImmutabilityMaxLength = std::chrono::seconds(30);
|
||||
|
||||
auto blobClient = *m_blockBlobClient;
|
||||
std::vector<uint8_t> emptyContent;
|
||||
@ -1249,7 +1234,7 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
options.AccessConditions.IfUnmodifiedSince = timeAfterStr;
|
||||
EXPECT_NO_THROW(blobClient.SetImmutabilityPolicy(policy, options));
|
||||
|
||||
std::this_thread::sleep_for(ImmutabilityMaxLength);
|
||||
TestSleep(ImmutabilityMaxLength);
|
||||
}
|
||||
|
||||
TEST_F(BlockBlobClientTest, LegalHold_PLAYBACKONLY_)
|
||||
@ -2001,4 +1986,44 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST_F(BlockBlobClientTest, AbortCopy_PLAYBACKONLY_)
|
||||
{
|
||||
const auto sourceContainerName = "container1";
|
||||
const auto sourceBlobName = "b1";
|
||||
auto clientOptions = InitStorageClientOptions<Blobs::BlobClientOptions>();
|
||||
auto sourceServiceClient = Blobs::BlobServiceClient::CreateFromConnectionString(
|
||||
AdlsGen2ConnectionString(), clientOptions);
|
||||
auto sourceContainerClient = sourceServiceClient.GetBlobContainerClient(sourceContainerName);
|
||||
auto sourceBlobClient = sourceContainerClient.GetBlockBlobClient(sourceBlobName);
|
||||
|
||||
auto getSas = [&]() {
|
||||
Sas::BlobSasBuilder sasBuilder;
|
||||
auto keyCredential
|
||||
= _internal::ParseConnectionString(AdlsGen2ConnectionString()).KeyCredential;
|
||||
sasBuilder.BlobContainerName = sourceContainerName;
|
||||
sasBuilder.BlobName = sourceBlobName;
|
||||
sasBuilder.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(60);
|
||||
sasBuilder.Resource = Sas::BlobSasResource::Blob;
|
||||
sasBuilder.SetPermissions(Sas::BlobSasPermissions::Read);
|
||||
auto sasToken = sasBuilder.GenerateSasToken(*keyCredential);
|
||||
return sasToken;
|
||||
};
|
||||
|
||||
auto copyOperation = m_blockBlobClient->StartCopyFromUri(sourceBlobClient.GetUrl() + getSas());
|
||||
const auto copyId = copyOperation.GetRawResponse().GetHeaders().at("x-ms-copy-id");
|
||||
|
||||
auto properties = m_blockBlobClient->GetProperties().Value;
|
||||
ASSERT_TRUE(properties.CopyStatus.HasValue());
|
||||
EXPECT_EQ(properties.CopyStatus.Value(), Blobs::Models::CopyStatus::Pending);
|
||||
EXPECT_FALSE(properties.CopyProgress.Value().empty());
|
||||
|
||||
TestSleep(1s);
|
||||
|
||||
auto abortCopyResponse = m_blockBlobClient->AbortCopyFromUri(copyId);
|
||||
|
||||
properties = m_blockBlobClient->GetProperties().Value;
|
||||
ASSERT_TRUE(properties.CopyStatus.HasValue());
|
||||
EXPECT_EQ(properties.CopyStatus.Value(), Blobs::Models::CopyStatus::Aborted);
|
||||
}
|
||||
|
||||
}}} // namespace Azure::Storage::Test
|
||||
|
||||
Loading…
Reference in New Issue
Block a user