public void FollowSymlink_Random_SymlinkDir_OnSameLevel() { #if DNXCORE50 if (!CrossPlatformHelpers.IsLinux) { return; } DMLibDataInfo sourceDataInfo = new DMLibDataInfo("rootfolder"); int level = random.Next(2, 40); for (int i = 0; i < level; ++i) { var dirNode = new DirNode($"{UnicodeFileName}{FolderSuffix}_{i}"); dirNode.AddFileNode(new FileNode($"{UnicodeFileName}{FileSuffix}") { SizeInByte = 1024 }); sourceDataInfo.RootNode.AddDirNode(dirNode); sourceDataInfo.RootNode.AddDirNode(DirNode.SymlinkedDir($"{UnicodeFileName}{SymlinkSuffix}_{i}", dirNode.Name, dirNode)); } var options = new TestExecutionOptions <DMLibDataInfo>() { IsDirectoryTransfer = true, TransferItemModifier = (notUsed, item) => { dynamic transferOptions = DefaultTransferDirectoryOptions; transferOptions.Recursive = true; (transferOptions as UploadDirectoryOptions).FollowSymlink = true; item.Options = transferOptions; }, }; var result = this.ExecuteTestCase(sourceDataInfo, options); // For sync copy, recalculate md5 of destination by downloading the file to local. if (IsCloudService(DMLibTestContext.DestType) && !DMLibTestContext.IsAsync) { DMLibDataHelper.SetCalculatedFileMD5(result.DataInfo, DestAdaptor); } Test.Assert(result.Exceptions.Count == 0, "Verify no exception is thrown."); Test.Assert(DMLibDataHelper.Equals(sourceDataInfo, result.DataInfo), "Verify transfer result."); #endif }
private void BuildDirNode(string dirPath, DirNode parent) { dirPath = AppendDirectorySeparator(dirPath); foreach (var fileInfo in LongPathDirectoryExtension.GetFiles(dirPath)) { FileNode fileNode = new FileNode(fileInfo.Remove(0, dirPath.Length)); this.BuildFileNode(fileInfo, fileNode); parent.AddFileNode(fileNode); } foreach (var subDirInfo in LongPathDirectoryExtension.GetDirectories(dirPath)) { DirNode subDirNode = new DirNode(subDirInfo.Remove(0, dirPath.Length)); this.BuildDirNode(subDirInfo, subDirNode); parent.AddDirNode(subDirNode); } }
private void BuildDirNode(CloudFileDirectory cloudDir, DirNode dirNode) { cloudDir.FetchAttributes(options: HelperConst.DefaultFileOptions); dirNode.LastWriteTime = cloudDir.Properties.LastWriteTime; dirNode.CreationTime = cloudDir.Properties.CreationTime; dirNode.SMBAttributes = cloudDir.Properties.NtfsAttributes; if (!string.IsNullOrEmpty(cloudDir.FilePermission)) { dirNode.PortableSDDL = cloudDir.FilePermission; } else if (!string.IsNullOrEmpty(cloudDir.Properties.FilePermissionKey)) { dirNode.PortableSDDL = cloudDir.Share.GetFilePermission(cloudDir.Properties.FilePermissionKey, options: HelperConst.DefaultFileOptions); } if (cloudDir.Metadata.Count > 0) { dirNode.Metadata = new Dictionary <string, string>(cloudDir.Metadata); } foreach (IListFileItem item in cloudDir.ListFilesAndDirectories(HelperConst.DefaultFileOptions)) { CloudFile cloudFile = item as CloudFile; CloudFileDirectory subCloudDir = item as CloudFileDirectory; if (cloudFile != null) { // Cannot fetch attributes while listing, so do it for each cloud file. cloudFile.FetchAttributes(options: HelperConst.DefaultFileOptions); FileNode fileNode = new FileNode(cloudFile.Name); this.BuildFileNode(cloudFile, fileNode); dirNode.AddFileNode(fileNode); } else if (subCloudDir != null) { DirNode subDirNode = new DirNode(subCloudDir.Name); this.BuildDirNode(subCloudDir, subDirNode); dirNode.AddDirNode(subDirNode); } } }
private void GenerateDir(DirNode dirNode, CloudBlobDirectory cloudBlobDir) { DMLibDataHelper.CreateLocalDirIfNotExists(this.TempFolder); foreach (var subDir in dirNode.DirNodes) { CloudBlobDirectory subCloudBlobDir = cloudBlobDir.GetDirectoryReference(subDir.Name); this.GenerateDir(subDir, subCloudBlobDir); } List <FileNode> snapshotList = new List <FileNode>(); foreach (var file in dirNode.FileNodes) { CloudBlob cloudBlob = CloudBlobHelper.GetCloudBlobReference(cloudBlobDir, file.Name, this.BlobType); this.GenerateFile(file, cloudBlob, snapshotList); } foreach (var snapshot in snapshotList) { dirNode.AddFileNode(snapshot); } }
private void BuildDirNode(CloudFileDirectory cloudDir, DirNode dirNode) { foreach (IListFileItem item in cloudDir.ListFilesAndDirectories(HelperConst.DefaultFileOptions)) { CloudFile cloudFile = item as CloudFile; CloudFileDirectory subCloudDir = item as CloudFileDirectory; if (cloudFile != null) { // Cannot fetch attributes while listing, so do it for each cloud file. cloudFile.FetchAttributes(options: HelperConst.DefaultFileOptions); FileNode fileNode = new FileNode(cloudFile.Name); this.BuildFileNode(cloudFile, fileNode); dirNode.AddFileNode(fileNode); } else if (subCloudDir != null) { DirNode subDirNode = new DirNode(subCloudDir.Name); this.BuildDirNode(subCloudDir, subDirNode); dirNode.AddDirNode(subDirNode); } } }
private void BuildDirNode(string dirPath, DirNode parent, bool handleSMBAttributes, PreserveSMBPermissions getSMBPermissions) { dirPath = AppendDirectorySeparator(dirPath); DateTimeOffset?creationTime = null; DateTimeOffset?lastWriteTime = null; FileAttributes?fileAttributes = null; #if DOTNET5_4 LongPathFileExtension.GetFileProperties(dirPath, out creationTime, out lastWriteTime, out fileAttributes, true); #else LongPathFileExtension.GetFileProperties(dirPath, out creationTime, out lastWriteTime, out fileAttributes); #endif parent.CreationTime = creationTime; parent.LastWriteTime = lastWriteTime; if (PreserveSMBPermissions.None != getSMBPermissions) { parent.PortableSDDL = LongPathFileExtension.GetFilePortableSDDL(dirPath, getSMBPermissions); } foreach (var fileInfo in LongPathDirectoryExtension.GetFiles(dirPath)) { FileNode fileNode = new FileNode(fileInfo.Remove(0, dirPath.Length)); this.BuildFileNode(fileInfo, fileNode, handleSMBAttributes, getSMBPermissions); parent.AddFileNode(fileNode); } foreach (var subDirInfo in LongPathDirectoryExtension.GetDirectories(dirPath)) { DirNode subDirNode = new DirNode(subDirInfo.Remove(0, dirPath.Length)); this.BuildDirNode(subDirInfo, subDirNode, handleSMBAttributes, getSMBPermissions); parent.AddDirNode(subDirNode); } }
private static void PrepareSourceData() { DMLibDataInfo sourceFileTree = new DMLibDataInfo(string.Empty); DirNode dirNode1 = new DirNode("folder1"); DirNode subDir1 = new DirNode("subfolder1"); subDir1.AddDirNode(new DirNode("subfolder3")); subDir1.AddFileNode(GenerateFileNode("testfile2")); subDir1.AddFileNode(GenerateFileNode("4testfile")); dirNode1.AddDirNode(subDir1); DirNode subDir2 = new DirNode("subfolder2"); DirNode subDir4 = new DirNode("subfolder4"); subDir4.AddFileNode(GenerateFileNode("test5")); subDir2.AddDirNode(subDir4); subDir2.AddFileNode(GenerateFileNode("TESTFILE345")); subDir2.AddFileNode(GenerateFileNode("testfile234")); subDir2.AddFileNode(GenerateFileNode("testYfile")); subDir2.AddFileNode(GenerateFileNode("f_arbitrary.exe")); subDir2.AddFileNode(GenerateFileNode("测试x文件")); dirNode1.AddDirNode(subDir2); dirNode1.AddFileNode(GenerateFileNode("testfile1")); dirNode1.AddFileNode(GenerateFileNode("TestFile2")); dirNode1.AddFileNode(GenerateFileNode("测试文件2")); sourceFileTree.RootNode.AddDirNode(dirNode1); DirNode dirNode2 = new DirNode("folder2"); dirNode2.AddFileNode(GenerateFileNode("folder_file")); dirNode2.AddDirNode(new DirNode("testfile1")); dirNode2.AddFileNode(GenerateFileNode("测试文件三")); dirNode2.AddFileNode(GenerateFileNode("测试四文件")); sourceFileTree.RootNode.AddDirNode(dirNode2); DirNode dirNode3 = new DirNode("folder3"); sourceFileTree.RootNode.AddDirNode(dirNode3); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testfile")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testfile1")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testfile2")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testXfile")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testXXfile")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("测试文件")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("..a123")); DMLibDataInfo blobSourceFileTree = sourceFileTree.Clone(); blobSourceFileTree.RootNode.AddFileNode(GenerateFileNode("TeSTfIle")); Test.Info("Start to generate test data, will take a while..."); foreach (DMLibDataType dataType in sourceDataTypes) { if (IsCloudBlob(dataType)) { PrepareSourceData(dataType, blobSourceFileTree.Clone()); } else { PrepareSourceData(dataType, sourceFileTree.Clone()); } } Test.Info("Done"); }