Integrate DateTime into Storage's file service. (#1154)

This commit is contained in:
Kan Tang 2020-12-22 15:38:46 +08:00 committed by GitHub
parent 37b55c1e11
commit e23e9333c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 394 additions and 232 deletions

View File

@ -14,6 +14,7 @@
- Move File SAS into `Azure::Storage::Sas` namespace.
- Replaced all transactional content MD5/CRC64 with `ContentHash` struct.
- `FileShareHttpHeaders` is renamed to `ShareFileHttpHeaders`, and member `std::string ContentMd5` is changed to `Storage::ContentHash ContentHash`.
- All date time related strings are now changed to `Azure::Core::DateTime` type.
## 12.0.0-beta.5 (2020-11-13)

View File

@ -82,12 +82,12 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { names
/**
* @brief Creation time for the file/directory..
*/
Azure::Core::Nullable<std::string> CreationTime;
Azure::Core::Nullable<Core::DateTime> CreatedOn;
/**
* @brief Last write time for the file/directory..
*/
Azure::Core::Nullable<std::string> LastWriteTime;
Azure::Core::Nullable<Core::DateTime> LastWrittenOn;
};
// FileClient models:
@ -114,7 +114,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { names
struct DownloadFileToResult
{
std::string ETag;
std::string LastModified;
Core::DateTime LastModified;
int64_t ContentLength = 0;
ShareFileHttpHeaders HttpHeaders;
Storage::Metadata Metadata;

View File

@ -134,17 +134,21 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
protocolLayerOptions.FileAttributes
= Details::FileAttributesToString(Models::FileAttributes::Directory);
}
if (options.SmbProperties.CreationTime.HasValue())
if (options.SmbProperties.CreatedOn.HasValue())
{
protocolLayerOptions.FileCreationTime = options.SmbProperties.CreationTime.GetValue();
protocolLayerOptions.FileCreationTime
= options.SmbProperties.CreatedOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
protocolLayerOptions.FileCreationTime = std::string(c_FileDefaultTimeValue);
}
if (options.SmbProperties.LastWriteTime.HasValue())
if (options.SmbProperties.LastWrittenOn.HasValue())
{
protocolLayerOptions.FileLastWriteTime = options.SmbProperties.LastWriteTime.GetValue();
protocolLayerOptions.FileLastWriteTime
= options.SmbProperties.LastWrittenOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
@ -188,21 +192,24 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
{
auto protocolLayerOptions = Details::ShareRestClient::Directory::SetPropertiesOptions();
protocolLayerOptions.FileAttributes = Details::FileAttributesToString(smbProperties.Attributes);
if (smbProperties.CreationTime.HasValue())
if (smbProperties.CreatedOn.HasValue())
{
protocolLayerOptions.FileCreationTime = smbProperties.CreationTime.GetValue();
protocolLayerOptions.FileCreationTime = smbProperties.CreatedOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
protocolLayerOptions.FileCreationTime = std::string(c_FilePreserveSmbProperties);
protocolLayerOptions.FileCreationTime = std::string(c_FileDefaultTimeValue);
}
if (smbProperties.LastWriteTime.HasValue())
if (smbProperties.LastWrittenOn.HasValue())
{
protocolLayerOptions.FileLastWriteTime = smbProperties.LastWriteTime.GetValue();
protocolLayerOptions.FileLastWriteTime
= smbProperties.LastWrittenOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
protocolLayerOptions.FileLastWriteTime = std::string(c_FilePreserveSmbProperties);
protocolLayerOptions.FileLastWriteTime = std::string(c_FileDefaultTimeValue);
}
if (options.FilePermission.HasValue())
{

View File

@ -122,17 +122,21 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
protocolLayerOptions.FileAttributes
= Details::FileAttributesToString(Models::FileAttributes::None);
}
if (options.SmbProperties.CreationTime.HasValue())
if (options.SmbProperties.CreatedOn.HasValue())
{
protocolLayerOptions.FileCreationTime = options.SmbProperties.CreationTime.GetValue();
protocolLayerOptions.FileCreationTime
= options.SmbProperties.CreatedOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
protocolLayerOptions.FileCreationTime = std::string(c_FileDefaultTimeValue);
}
if (options.SmbProperties.LastWriteTime.HasValue())
if (options.SmbProperties.LastWrittenOn.HasValue())
{
protocolLayerOptions.FileLastWriteTime = options.SmbProperties.LastWriteTime.GetValue();
protocolLayerOptions.FileLastWriteTime
= options.SmbProperties.LastWrittenOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
@ -261,18 +265,21 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
protocolLayerOptions.CopySource = std::move(copySource);
protocolLayerOptions.FileCopyFileAttributes
= Details::FileAttributesToString(options.SmbProperties.Attributes);
if (options.SmbProperties.CreationTime.HasValue())
if (options.SmbProperties.CreatedOn.HasValue())
{
protocolLayerOptions.FileCopyFileCreationTime = options.SmbProperties.CreationTime.GetValue();
protocolLayerOptions.FileCopyFileCreationTime
= options.SmbProperties.CreatedOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
protocolLayerOptions.FileCopyFileCreationTime = std::string(c_FileCopySourceTime);
}
if (options.SmbProperties.LastWriteTime.HasValue())
if (options.SmbProperties.LastWrittenOn.HasValue())
{
protocolLayerOptions.FileCopyFileLastWriteTime
= options.SmbProperties.LastWriteTime.GetValue();
= options.SmbProperties.LastWrittenOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
@ -337,21 +344,29 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
{
auto protocolLayerOptions = Details::ShareRestClient::File::SetHttpHeadersOptions();
protocolLayerOptions.FileAttributes = Details::FileAttributesToString(smbProperties.Attributes);
if (smbProperties.CreationTime.HasValue())
if (protocolLayerOptions.FileAttributes.empty())
{
protocolLayerOptions.FileCreationTime = smbProperties.CreationTime.GetValue();
protocolLayerOptions.FileAttributes
= Details::FileAttributesToString(Models::FileAttributes::None);
}
if (smbProperties.CreatedOn.HasValue())
{
protocolLayerOptions.FileCreationTime = smbProperties.CreatedOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
protocolLayerOptions.FileCreationTime = std::string(c_FilePreserveSmbProperties);
protocolLayerOptions.FileCreationTime = std::string(c_FileDefaultTimeValue);
}
if (smbProperties.LastWriteTime.HasValue())
if (smbProperties.LastWrittenOn.HasValue())
{
protocolLayerOptions.FileLastWriteTime = smbProperties.LastWriteTime.GetValue();
protocolLayerOptions.FileLastWriteTime
= smbProperties.LastWrittenOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
protocolLayerOptions.FileLastWriteTime = std::string(c_FilePreserveSmbProperties);
protocolLayerOptions.FileLastWriteTime = std::string(c_FileDefaultTimeValue);
}
protocolLayerOptions.XMsContentLength = options.Size;
protocolLayerOptions.LeaseIdOptional = options.AccessConditions.LeaseId;
@ -813,17 +828,21 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
protocolLayerOptions.FileAttributes
= Details::FileAttributesToString(Models::FileAttributes::None);
}
if (options.SmbProperties.CreationTime.HasValue())
if (options.SmbProperties.CreatedOn.HasValue())
{
protocolLayerOptions.FileCreationTime = options.SmbProperties.CreationTime.GetValue();
protocolLayerOptions.FileCreationTime
= options.SmbProperties.CreatedOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
protocolLayerOptions.FileCreationTime = std::string(c_FileDefaultTimeValue);
}
if (options.SmbProperties.LastWriteTime.HasValue())
if (options.SmbProperties.LastWrittenOn.HasValue())
{
protocolLayerOptions.FileLastWriteTime = options.SmbProperties.LastWriteTime.GetValue();
protocolLayerOptions.FileLastWriteTime
= options.SmbProperties.LastWrittenOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
@ -910,17 +929,21 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
protocolLayerOptions.FileAttributes
= Details::FileAttributesToString(Models::FileAttributes::None);
}
if (options.SmbProperties.CreationTime.HasValue())
if (options.SmbProperties.CreatedOn.HasValue())
{
protocolLayerOptions.FileCreationTime = options.SmbProperties.CreationTime.GetValue();
protocolLayerOptions.FileCreationTime
= options.SmbProperties.CreatedOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{
protocolLayerOptions.FileCreationTime = std::string(c_FileDefaultTimeValue);
}
if (options.SmbProperties.LastWriteTime.HasValue())
if (options.SmbProperties.LastWrittenOn.HasValue())
{
protocolLayerOptions.FileLastWriteTime = options.SmbProperties.LastWriteTime.GetValue();
protocolLayerOptions.FileLastWriteTime
= options.SmbProperties.LastWrittenOn.GetValue().GetRfc3339String(
Core::DateTime::TimeFractionFormat::AllDigits);
}
else
{

View File

@ -12,8 +12,9 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { names
const Azure::Storage::Files::Shares::Models::SignedIdentifier& lhs,
const Azure::Storage::Files::Shares::Models::SignedIdentifier& rhs)
{
return lhs.Id == rhs.Id && lhs.Policy.Start == rhs.Policy.Start
&& lhs.Policy.Expiry == rhs.Policy.Expiry && lhs.Policy.Permission == rhs.Policy.Permission;
return lhs.Id == rhs.Id && lhs.Policy.StartsOn == rhs.Policy.StartsOn
&& lhs.Policy.ExpiresOn == rhs.Policy.ExpiresOn
&& lhs.Policy.Permission == rhs.Policy.Permission;
}
}}}}} // namespace Azure::Storage::Files::Shares::Models
@ -156,17 +157,16 @@ namespace Azure { namespace Storage { namespace Test {
{
Files::Shares::Models::SignedIdentifier identifier;
identifier.Id = RandomString(64);
identifier.Policy.Start
= ToIso8601(std::chrono::system_clock::now() - std::chrono::minutes(10), 7);
identifier.Policy.Expiry
= ToIso8601(std::chrono::system_clock::now() - std::chrono::minutes(100), 7);
identifier.Policy.StartsOn = Core::DateTime::Now() - std::chrono::minutes(10);
identifier.Policy.ExpiresOn = Core::DateTime::Now() + std::chrono::minutes(100);
identifier.Policy.Permission = "r";
identifiers.emplace_back(identifier);
}
auto lmt = m_shareClient->GetAccessPolicy()->LastModified;
auto ret = m_shareClient->SetAccessPolicy(identifiers);
EXPECT_FALSE(ret->ETag.empty());
EXPECT_FALSE(ret->LastModified.empty());
EXPECT_FALSE(ret->LastModified < lmt);
auto ret2 = m_shareClient->GetAccessPolicy();
EXPECT_EQ(ret2->ETag, ret->ETag);

View File

@ -168,8 +168,8 @@ namespace Azure { namespace Storage { namespace Test {
Files::Shares::Models::FileShareSmbProperties properties;
properties.Attributes = Files::Shares::Models::FileAttributes::Directory
| Files::Shares::Models::FileAttributes::NotContentIndexed;
properties.CreationTime = ToIso8601(std::chrono::system_clock::now(), 7);
properties.LastWriteTime = ToIso8601(std::chrono::system_clock::now(), 7);
properties.CreatedOn = Core::DateTime::Now();
properties.LastWrittenOn = Core::DateTime::Now();
properties.PermissionKey = "";
auto client1 = m_shareClient->GetShareDirectoryClient(LowercaseRandomString());
auto client2 = m_shareClient->GetShareDirectoryClient(LowercaseRandomString());
@ -201,8 +201,8 @@ namespace Azure { namespace Storage { namespace Test {
Files::Shares::Models::FileShareSmbProperties properties;
properties.Attributes = Files::Shares::Models::FileAttributes::Directory
| Files::Shares::Models::FileAttributes::NotContentIndexed;
properties.CreationTime = ToIso8601(std::chrono::system_clock::now(), 7);
properties.LastWriteTime = ToIso8601(std::chrono::system_clock::now(), 7);
properties.CreatedOn = Core::DateTime::Now();
properties.LastWrittenOn = Core::DateTime::Now();
properties.PermissionKey = m_fileShareDirectoryClient->GetProperties()->FilePermissionKey;
{
// Create directory with SmbProperties works
@ -217,8 +217,8 @@ namespace Azure { namespace Storage { namespace Test {
EXPECT_NO_THROW(client2.Create(options2));
auto directoryProperties1 = client1.GetProperties();
auto directoryProperties2 = client2.GetProperties();
EXPECT_EQ(directoryProperties2->FileCreationTime, directoryProperties1->FileCreationTime);
EXPECT_EQ(directoryProperties2->FileLastWriteTime, directoryProperties1->FileLastWriteTime);
EXPECT_EQ(directoryProperties2->FileCreatedOn, directoryProperties1->FileCreatedOn);
EXPECT_EQ(directoryProperties2->FileLastWrittenOn, directoryProperties1->FileLastWrittenOn);
EXPECT_EQ(directoryProperties2->FileAttributes, directoryProperties1->FileAttributes);
}
@ -233,8 +233,8 @@ namespace Azure { namespace Storage { namespace Test {
EXPECT_NO_THROW(client2.SetProperties(properties));
auto directoryProperties1 = client1.GetProperties();
auto directoryProperties2 = client2.GetProperties();
EXPECT_EQ(directoryProperties2->FileCreationTime, directoryProperties1->FileCreationTime);
EXPECT_EQ(directoryProperties2->FileLastWriteTime, directoryProperties1->FileLastWriteTime);
EXPECT_EQ(directoryProperties2->FileCreatedOn, directoryProperties1->FileCreatedOn);
EXPECT_EQ(directoryProperties2->FileLastWrittenOn, directoryProperties1->FileLastWrittenOn);
EXPECT_EQ(directoryProperties2->FileAttributes, directoryProperties1->FileAttributes);
}
}

View File

@ -137,8 +137,8 @@ namespace Azure { namespace Storage { namespace Test {
Files::Shares::Models::FileShareSmbProperties properties;
properties.Attributes = Files::Shares::Models::FileAttributes::System
| Files::Shares::Models::FileAttributes::NotContentIndexed;
properties.CreationTime = ToIso8601(std::chrono::system_clock::now(), 7);
properties.LastWriteTime = ToIso8601(std::chrono::system_clock::now(), 7);
properties.CreatedOn = Core::DateTime::Now();
properties.LastWrittenOn = Core::DateTime::Now();
properties.PermissionKey = "";
auto client1 = m_fileShareDirectoryClient->GetShareFileClient(LowercaseRandomString());
auto client2 = m_fileShareDirectoryClient->GetShareFileClient(LowercaseRandomString());
@ -170,8 +170,8 @@ namespace Azure { namespace Storage { namespace Test {
Files::Shares::Models::FileShareSmbProperties properties;
properties.Attributes = Files::Shares::Models::FileAttributes::System
| Files::Shares::Models::FileAttributes::NotContentIndexed;
properties.CreationTime = ToIso8601(std::chrono::system_clock::now(), 7);
properties.LastWriteTime = ToIso8601(std::chrono::system_clock::now(), 7);
properties.CreatedOn = Core::DateTime::Now();
properties.LastWrittenOn = Core::DateTime::Now();
properties.PermissionKey = m_fileClient->GetProperties()->FilePermissionKey;
{
// Create directory with SmbProperties works
@ -186,8 +186,8 @@ namespace Azure { namespace Storage { namespace Test {
EXPECT_NO_THROW(client2.Create(1024, options2));
auto directoryProperties1 = client1.GetProperties();
auto directoryProperties2 = client2.GetProperties();
EXPECT_EQ(directoryProperties2->FileCreationTime, directoryProperties1->FileCreationTime);
EXPECT_EQ(directoryProperties2->FileLastWriteTime, directoryProperties1->FileLastWriteTime);
EXPECT_EQ(directoryProperties2->FileCreatedOn, directoryProperties1->FileCreatedOn);
EXPECT_EQ(directoryProperties2->FileLastWrittenOn, directoryProperties1->FileLastWrittenOn);
EXPECT_EQ(directoryProperties2->FileAttributes, directoryProperties1->FileAttributes);
}
@ -202,8 +202,8 @@ namespace Azure { namespace Storage { namespace Test {
EXPECT_NO_THROW(client2.SetProperties(GetInterestingHttpHeaders(), properties));
auto directoryProperties1 = client1.GetProperties();
auto directoryProperties2 = client2.GetProperties();
EXPECT_EQ(directoryProperties2->FileCreationTime, directoryProperties1->FileCreationTime);
EXPECT_EQ(directoryProperties2->FileLastWriteTime, directoryProperties1->FileLastWriteTime);
EXPECT_EQ(directoryProperties2->FileCreatedOn, directoryProperties1->FileCreatedOn);
EXPECT_EQ(directoryProperties2->FileLastWrittenOn, directoryProperties1->FileLastWrittenOn);
EXPECT_EQ(directoryProperties2->FileAttributes, directoryProperties1->FileAttributes);
}
}
@ -219,13 +219,15 @@ namespace Azure { namespace Storage { namespace Test {
TEST_F(FileShareFileClientTest, LeaseRelated)
{
std::string leaseId1 = CreateUniqueLeaseId();
auto lastModified = m_fileClient->GetProperties()->LastModified;
auto aLease = *m_fileClient->AcquireLease(leaseId1);
EXPECT_FALSE(aLease.ETag.empty());
EXPECT_FALSE(aLease.LastModified.empty());
EXPECT_TRUE(aLease.LastModified >= lastModified);
EXPECT_EQ(aLease.LeaseId, leaseId1);
lastModified = m_fileClient->GetProperties()->LastModified;
aLease = *m_fileClient->AcquireLease(leaseId1);
EXPECT_FALSE(aLease.ETag.empty());
EXPECT_FALSE(aLease.LastModified.empty());
EXPECT_TRUE(aLease.LastModified >= lastModified);
EXPECT_EQ(aLease.LeaseId, leaseId1);
auto properties = *m_fileClient->GetProperties();
@ -234,25 +236,28 @@ namespace Azure { namespace Storage { namespace Test {
std::string leaseId2 = CreateUniqueLeaseId();
EXPECT_NE(leaseId1, leaseId2);
lastModified = m_fileClient->GetProperties()->LastModified;
auto cLease = *m_fileClient->ChangeLease(leaseId1, leaseId2);
EXPECT_FALSE(cLease.ETag.empty());
EXPECT_FALSE(cLease.LastModified.empty());
EXPECT_TRUE(cLease.LastModified >= lastModified);
EXPECT_EQ(cLease.LeaseId, leaseId2);
lastModified = m_fileClient->GetProperties()->LastModified;
auto fileInfo = *m_fileClient->ReleaseLease(leaseId2);
EXPECT_FALSE(fileInfo.ETag.empty());
EXPECT_FALSE(fileInfo.LastModified.empty());
EXPECT_TRUE(fileInfo.LastModified >= lastModified);
aLease = *m_fileClient->AcquireLease(CreateUniqueLeaseId());
properties = *m_fileClient->GetProperties();
lastModified = m_fileClient->GetProperties()->LastModified;
auto brokenLease = *m_fileClient->BreakLease();
EXPECT_FALSE(brokenLease.ETag.empty());
EXPECT_FALSE(brokenLease.LastModified.empty());
EXPECT_TRUE(brokenLease.LastModified >= lastModified);
aLease = *m_fileClient->AcquireLease(CreateUniqueLeaseId());
lastModified = m_fileClient->GetProperties()->LastModified;
brokenLease = *m_fileClient->BreakLease();
EXPECT_FALSE(brokenLease.ETag.empty());
EXPECT_FALSE(brokenLease.LastModified.empty());
EXPECT_TRUE(brokenLease.LastModified >= lastModified);
m_fileClient->BreakLease();
}

View File

@ -70,12 +70,13 @@ namespace Azure { namespace Storage { namespace Test {
EXPECT_NO_THROW(shareClient.ListFilesAndDirectoriesSegment());
};
for (auto permissions : {Sas::ShareSasPermissions::Read,
Sas::ShareSasPermissions::Write,
Sas::ShareSasPermissions::Delete,
Sas::ShareSasPermissions::List,
Sas::ShareSasPermissions::Create,
Sas::ShareSasPermissions::All})
for (auto permissions :
{Sas::ShareSasPermissions::Read,
Sas::ShareSasPermissions::Write,
Sas::ShareSasPermissions::Delete,
Sas::ShareSasPermissions::List,
Sas::ShareSasPermissions::Create,
Sas::ShareSasPermissions::All})
{
shareSasBuilder.SetPermissions(permissions);
auto sasToken = shareSasBuilder.GenerateSasToken(*keyCredential);
@ -102,10 +103,11 @@ namespace Azure { namespace Storage { namespace Test {
}
}
for (auto permissions : {Sas::ShareFileSasPermissions::Read,
Sas::ShareFileSasPermissions::Write,
Sas::ShareFileSasPermissions::Delete,
Sas::ShareFileSasPermissions::Create})
for (auto permissions :
{Sas::ShareFileSasPermissions::Read,
Sas::ShareFileSasPermissions::Write,
Sas::ShareFileSasPermissions::Delete,
Sas::ShareFileSasPermissions::Create})
{
fileSasBuilder.SetPermissions(permissions);
auto sasToken = fileSasBuilder.GenerateSasToken(*keyCredential);
@ -166,10 +168,8 @@ namespace Azure { namespace Storage { namespace Test {
{
Files::Shares::Models::SignedIdentifier identifier;
identifier.Id = RandomString(64);
identifier.Policy.Start
= ToIso8601(std::chrono::system_clock::now() - std::chrono::minutes(5));
identifier.Policy.Expiry
= ToIso8601(std::chrono::system_clock::now() + std::chrono::minutes(60));
identifier.Policy.StartsOn = Core::DateTime::Now() - std::chrono::minutes(5);
identifier.Policy.ExpiresOn = Core::DateTime::Now() + std::chrono::minutes(60);
identifier.Policy.Permission = "r";
m_shareClient->SetAccessPolicy({identifier});