@@ -74,6 +74,30 @@ namespace Azure { namespace Storage { namespace Test {
74
74
}
75
75
}
76
76
77
+ TEST_F (FileShareFileClientTest, CreateWithHttpHeaders)
78
+ {
79
+ auto fileName = RandomString ();
80
+ Files::Shares::ShareFileClient client = m_fileShareDirectoryClient->GetFileClient (fileName);
81
+
82
+ std::vector<uint8_t > emptyContent;
83
+ Azure::Core::Cryptography::Md5Hash instance;
84
+ auto md5 = instance.Final (emptyContent.data (), 0L );
85
+
86
+ Files::Shares::Models::FileHttpHeaders httpHeaders;
87
+ httpHeaders.ContentType = " application/x-binary" ;
88
+ httpHeaders.ContentLanguage = " en-US" ;
89
+ httpHeaders.ContentDisposition = " attachment" ;
90
+ httpHeaders.CacheControl = " no-cache" ;
91
+ httpHeaders.ContentEncoding = " identity" ;
92
+ httpHeaders.ContentHash .Algorithm = HashAlgorithm::Md5;
93
+ httpHeaders.ContentHash .Value = md5;
94
+
95
+ Files::Shares::CreateFileOptions options;
96
+ options.HttpHeaders = httpHeaders;
97
+
98
+ EXPECT_NO_THROW (client.Create (1024 , options));
99
+ }
100
+
77
101
TEST_F (FileShareFileClientTest, DownloadEmptyFile)
78
102
{
79
103
auto fileClient = m_fileShareDirectoryClient->GetFileClient (RandomString ());
@@ -656,6 +680,19 @@ namespace Azure { namespace Storage { namespace Test {
656
680
EXPECT_EQ (downloadOptions.Range .Value ().Offset , result.ContentRange .Offset );
657
681
EXPECT_EQ (static_cast <int64_t >(numOfChunks) * rangeSize, result.FileSize );
658
682
}
683
+
684
+ // Range download without Length
685
+ {
686
+ Files::Shares::DownloadFileOptions downloadOptions;
687
+ downloadOptions.Range = Core::Http::HttpRange ();
688
+ downloadOptions.Range .Value ().Offset = static_cast <int64_t >(rangeSize) * (numOfChunks - 1 );
689
+ Files::Shares::Models::DownloadFileResult result;
690
+ EXPECT_NO_THROW (result = fileClient.Download (downloadOptions).Value );
691
+ auto resultBuffer = result.BodyStream ->ReadToEnd (Core::Context ());
692
+ EXPECT_EQ (rangeContent, resultBuffer);
693
+ EXPECT_EQ (downloadOptions.Range .Value ().Offset , result.ContentRange .Offset );
694
+ EXPECT_EQ (static_cast <int64_t >(numOfChunks) * rangeSize, result.FileSize );
695
+ }
659
696
}
660
697
// last write time
661
698
{
@@ -703,6 +740,21 @@ namespace Azure { namespace Storage { namespace Test {
703
740
uploadOptions.TransactionalContentHash = hash;
704
741
memBodyStream.Rewind ();
705
742
EXPECT_THROW (fileClient.UploadRange (0 , memBodyStream, uploadOptions), StorageException);
743
+
744
+ Files::Shares::DownloadFileOptions downloadOptions;
745
+ downloadOptions.Range = Core::Http::HttpRange ();
746
+ downloadOptions.Range .Value ().Offset = 0 ;
747
+ downloadOptions.Range .Value ().Length = rangeSize;
748
+ downloadOptions.RangeHashAlgorithm = HashAlgorithm::Md5;
749
+ Files::Shares::Models::DownloadFileResult result;
750
+ EXPECT_NO_THROW (result = fileClient.Download (downloadOptions).Value );
751
+ auto resultBuffer = result.BodyStream ->ReadToEnd (Core::Context ());
752
+ EXPECT_EQ (rangeContent, resultBuffer);
753
+ EXPECT_EQ (downloadOptions.Range .Value ().Length .Value (), result.ContentRange .Length .Value ());
754
+ EXPECT_EQ (downloadOptions.Range .Value ().Offset , result.ContentRange .Offset );
755
+ EXPECT_EQ (static_cast <int64_t >(numOfChunks) * rangeSize, result.FileSize );
756
+ EXPECT_TRUE (result.TransactionalContentHash .HasValue ());
757
+ EXPECT_EQ (md5, result.TransactionalContentHash .Value ().Value );
706
758
}
707
759
}
708
760
@@ -736,6 +788,37 @@ namespace Azure { namespace Storage { namespace Test {
736
788
}
737
789
}
738
790
791
+ TEST_F (FileShareFileClientTest, CopyWithProperties)
792
+ {
793
+ size_t fileSize = 128 ;
794
+ std::vector<uint8_t > fileContent = RandomBuffer (fileSize);
795
+ auto memBodyStream = Core::IO::MemoryBodyStream (fileContent);
796
+ {
797
+ // Simple copy works.
798
+ auto fileClient = m_shareClient->GetRootDirectoryClient ().GetFileClient (RandomString () + " 1" );
799
+ fileClient.Create (fileSize);
800
+
801
+ auto sourceProperties = fileClient.GetProperties ().Value ;
802
+
803
+ Files::Shares::StartFileCopyOptions options;
804
+ options.SmbProperties .Attributes = sourceProperties.SmbProperties .Attributes ;
805
+ options.SmbProperties .CreatedOn = sourceProperties.SmbProperties .CreatedOn ;
806
+ options.SmbProperties .ChangedOn = sourceProperties.SmbProperties .ChangedOn ;
807
+ options.SmbProperties .LastWrittenOn = sourceProperties.SmbProperties .LastWrittenOn ;
808
+ options.PermissionCopyMode = Files::Shares::Models::PermissionCopyMode::Override;
809
+ options.SmbProperties .PermissionKey = sourceProperties.SmbProperties .PermissionKey ;
810
+
811
+ auto destFileClient
812
+ = m_shareClient->GetRootDirectoryClient ().GetFileClient (RandomString () + " 2" );
813
+ auto copyOperation = destFileClient.StartCopy (fileClient.GetUrl (), options);
814
+ EXPECT_EQ (
815
+ copyOperation.GetRawResponse ().GetStatusCode (),
816
+ Azure::Core::Http::HttpStatusCode::Accepted);
817
+ auto fileProperties = copyOperation.PollUntilDone (std::chrono::milliseconds (1000 )).Value ;
818
+ EXPECT_EQ (fileProperties.CopyStatus .Value (), Files::Shares::Models::CopyStatus::Success);
819
+ }
820
+ }
821
+
739
822
TEST_F (FileShareFileClientTest, RangeRelated)
740
823
{
741
824
size_t fileSize = 1024 * 3 ;
@@ -764,6 +847,60 @@ namespace Azure { namespace Storage { namespace Test {
764
847
EXPECT_EQ (static_cast <int32_t >(fileSize / 2 ) - 1024 , result.Ranges [1 ].Length .Value ());
765
848
}
766
849
850
+ TEST_F (FileShareFileClientTest, GetRangeListWithRange)
851
+ {
852
+ size_t rangeSize = 128 ;
853
+ std::vector<uint8_t > rangeContent = RandomBuffer (rangeSize);
854
+ auto memBodyStream = Core::IO::MemoryBodyStream (rangeContent);
855
+
856
+ auto fileClient = m_shareClient->GetRootDirectoryClient ().GetFileClient (RandomString ());
857
+ fileClient.Create (rangeSize);
858
+
859
+ EXPECT_NO_THROW (fileClient.UploadRange (0 , memBodyStream));
860
+
861
+ // GetRangeList with Range
862
+ {
863
+ Files::Shares::GetFileRangeListOptions options;
864
+ options.Range = Core::Http::HttpRange ();
865
+ options.Range .Value ().Offset = 0 ;
866
+ options.Range .Value ().Length = 128 ;
867
+ Files::Shares::Models::GetFileRangeListResult result;
868
+
869
+ EXPECT_NO_THROW (result = fileClient.GetRangeList (options).Value );
870
+ EXPECT_EQ (1U , result.Ranges .size ());
871
+ EXPECT_EQ (0 , result.Ranges [0 ].Offset );
872
+ EXPECT_TRUE (result.Ranges [0 ].Length .HasValue ());
873
+
874
+ options.Range .Value ().Length .Reset ();
875
+ EXPECT_NO_THROW (result = fileClient.GetRangeList (options).Value );
876
+ EXPECT_EQ (1U , result.Ranges .size ());
877
+ EXPECT_EQ (0 , result.Ranges [0 ].Offset );
878
+ EXPECT_TRUE (result.Ranges [0 ].Length .HasValue ());
879
+ }
880
+
881
+ // GetRangeListDiff with Range
882
+ {
883
+ auto snapshot = m_shareClient->CreateSnapshot ().Value .Snapshot ;
884
+ EXPECT_NO_THROW (fileClient.ClearRange (64 , 64 ));
885
+ Files::Shares::GetFileRangeListOptions options;
886
+ options.Range = Core::Http::HttpRange ();
887
+ options.Range .Value ().Offset = 64 ;
888
+ options.Range .Value ().Length = 64 ;
889
+ Files::Shares::Models::GetFileRangeListResult result;
890
+
891
+ EXPECT_NO_THROW (result = fileClient.GetRangeListDiff (snapshot, options).Value );
892
+ EXPECT_EQ (1U , result.Ranges .size ());
893
+ EXPECT_EQ (64 , result.Ranges [0 ].Offset );
894
+ EXPECT_TRUE (result.Ranges [0 ].Length .HasValue ());
895
+
896
+ options.Range .Value ().Length .Reset ();
897
+ EXPECT_NO_THROW (result = fileClient.GetRangeListDiff (snapshot, options).Value );
898
+ EXPECT_EQ (1U , result.Ranges .size ());
899
+ EXPECT_EQ (64 , result.Ranges [0 ].Offset );
900
+ EXPECT_TRUE (result.Ranges [0 ].Length .HasValue ());
901
+ }
902
+ }
903
+
767
904
TEST_F (FileShareFileClientTest, PreviousRangeWithSnapshot)
768
905
{
769
906
size_t fileSize = 1024 * 10 ;
@@ -1084,6 +1221,40 @@ namespace Azure { namespace Storage { namespace Test {
1084
1221
EXPECT_NO_THROW (containerClient.Delete ());
1085
1222
}
1086
1223
1224
+ TEST_F (FileShareFileClientTest, UploadFromWithOptions)
1225
+ {
1226
+ auto fileClient = m_shareClient->GetRootDirectoryClient ().GetFileClient (RandomString ());
1227
+
1228
+ size_t fileSize = 512 ;
1229
+ std::vector<uint8_t > content (RandomBuffer (fileSize));
1230
+ auto memBodyStream = Core::IO::MemoryBodyStream (content);
1231
+
1232
+ Azure::Core::Cryptography::Md5Hash instance;
1233
+ auto md5 = instance.Final (content.data (), fileSize);
1234
+
1235
+ Files::Shares::UploadFileFromOptions options;
1236
+
1237
+ options.SmbProperties .Attributes = Files::Shares::Models::FileAttributes::Hidden;
1238
+ options.SmbProperties .CreatedOn = std::chrono::system_clock::now ();
1239
+ options.SmbProperties .LastWrittenOn = std::chrono::system_clock::now ();
1240
+ options.SmbProperties .PermissionKey = " " ;
1241
+ options.SmbProperties .ChangedOn = std::chrono::system_clock::now ();
1242
+ options.HttpHeaders .ContentType = " application/x-binary" ;
1243
+ options.HttpHeaders .ContentLanguage = " en-US" ;
1244
+ options.HttpHeaders .ContentDisposition = " attachment" ;
1245
+ options.HttpHeaders .CacheControl = " no-cache" ;
1246
+ options.HttpHeaders .ContentEncoding = " identity" ;
1247
+ options.HttpHeaders .ContentHash .Value = md5;
1248
+
1249
+ // UploadFrom buffer
1250
+ EXPECT_NO_THROW (fileClient.UploadFrom (content.data (), fileSize, options));
1251
+
1252
+ // UploadFrom file
1253
+ const std::string tempFilename = " file" + RandomString ();
1254
+ WriteFile (tempFilename, content);
1255
+ EXPECT_NO_THROW (fileClient.UploadFrom (tempFilename, options));
1256
+ }
1257
+
1087
1258
TEST_F (FileShareFileClientTest, AllowTrailingDot)
1088
1259
{
1089
1260
const std::string fileName = RandomString ();
@@ -1430,6 +1601,14 @@ namespace Azure { namespace Storage { namespace Test {
1430
1601
1431
1602
// Delete
1432
1603
EXPECT_NO_THROW (fileClient.Delete ());
1604
+
1605
+ // OAuth Constructor
1606
+ auto fileClient1 = Files::Shares::ShareFileClient (
1607
+ m_fileClient->GetUrl (),
1608
+ std::make_shared<Azure::Identity::ClientSecretCredential>(
1609
+ AadTenantId (), AadClientId (), AadClientSecret (), GetTokenCredentialOptions ()),
1610
+ options);
1611
+ EXPECT_NO_THROW (fileClient1.GetProperties ());
1433
1612
}
1434
1613
1435
1614
TEST_F (FileShareFileClientTest, OAuthCopy_PLAYBACKONLY_)
@@ -1496,4 +1675,44 @@ namespace Azure { namespace Storage { namespace Test {
1496
1675
EXPECT_TRUE (fileHandles[0 ].AccessRights .HasValue ());
1497
1676
EXPECT_EQ (allAccessRights, fileHandles[0 ].AccessRights .Value ());
1498
1677
}
1678
+
1679
+ TEST_F (FileShareFileClientTest, WithShareSnapshot)
1680
+ {
1681
+ const std::string timestamp1 = " 2001-01-01T01:01:01.1111000Z" ;
1682
+ const std::string timestamp2 = " 2022-02-02T02:02:02.2222000Z" ;
1683
+
1684
+ auto client1 = m_fileClient->WithShareSnapshot (timestamp1);
1685
+ EXPECT_FALSE (client1.GetUrl ().find (" snapshot=" + timestamp1) == std::string::npos);
1686
+ EXPECT_TRUE (client1.GetUrl ().find (" snapshot=" + timestamp2) == std::string::npos);
1687
+ client1 = client1.WithShareSnapshot (timestamp2);
1688
+ EXPECT_TRUE (client1.GetUrl ().find (" snapshot=" + timestamp1) == std::string::npos);
1689
+ EXPECT_FALSE (client1.GetUrl ().find (" snapshot=" + timestamp2) == std::string::npos);
1690
+ client1 = client1.WithShareSnapshot (" " );
1691
+ EXPECT_TRUE (client1.GetUrl ().find (" snapshot=" + timestamp1) == std::string::npos);
1692
+ EXPECT_TRUE (client1.GetUrl ().find (" snapshot=" + timestamp2) == std::string::npos);
1693
+ }
1694
+
1695
+ TEST (ShareFileHandleAccessRightsTest, ShareFileHandleAccessRights)
1696
+ {
1697
+ Files::Shares::Models::ShareFileHandleAccessRights accessRightsA
1698
+ = Files::Shares::Models::ShareFileHandleAccessRights::Read
1699
+ | Files::Shares::Models::ShareFileHandleAccessRights::Write;
1700
+ Files::Shares::Models::ShareFileHandleAccessRights accessRightsB
1701
+ = Files::Shares::Models::ShareFileHandleAccessRights::Write
1702
+ | Files::Shares::Models::ShareFileHandleAccessRights::Delete;
1703
+
1704
+ Files::Shares::Models::ShareFileHandleAccessRights orAccessRights
1705
+ = Files::Shares::Models::ShareFileHandleAccessRights::Read
1706
+ | Files::Shares::Models::ShareFileHandleAccessRights::Write
1707
+ | Files::Shares::Models::ShareFileHandleAccessRights::Delete;
1708
+ Files::Shares::Models::ShareFileHandleAccessRights andAccessRights
1709
+ = Files::Shares::Models::ShareFileHandleAccessRights::Write;
1710
+ Files::Shares::Models::ShareFileHandleAccessRights xorAccessRights
1711
+ = Files::Shares::Models::ShareFileHandleAccessRights::Read
1712
+ | Files::Shares::Models::ShareFileHandleAccessRights::Delete;
1713
+
1714
+ EXPECT_EQ (orAccessRights, accessRightsA | accessRightsB);
1715
+ EXPECT_EQ (andAccessRights, accessRightsA & accessRightsB);
1716
+ EXPECT_EQ (xorAccessRights, accessRightsA ^ accessRightsB);
1717
+ }
1499
1718
}}} // namespace Azure::Storage::Test
0 commit comments