Exemple #1
0
        public void FollowSymlink_DeadLoop_1()
        {
#if DNXCORE50
            if (!CrossPlatformHelpers.IsLinux)
            {
                return;
            }
            DMLibDataInfo sourceDataInfo = new DMLibDataInfo("rootfolder");
            DirNode       targetFolder   = new DirNode($"{UnicodeFileName}{FolderSuffix}");
            targetFolder.AddFileNode(new FileNode($"{UnicodeFileName}{FileSuffix}")
            {
                SizeInByte = 1024
            });

            targetFolder.AddDirNode(DirNode.SymlinkedDir($"{UnicodeFileName}{SymlinkSuffix}", Path.Combine("..", $"{UnicodeFileName}{FolderSuffix}"), targetFolder));

            sourceDataInfo.RootNode.AddDirNode(targetFolder);

            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);
            Test.Assert(result.Exceptions.Count == 1 && result.Exceptions[0] is TransferException && result.Exceptions[0].Message.Contains("Potential dead loop in directory structure due to symbolic link"), "Verify expected exception is thrown.");
#endif
        }
        private void BuildDirNode(CloudBlobDirectory cloudDir, DirNode dirNode)
        {
            foreach (IListBlobItem item in cloudDir.ListBlobs(false, BlobListingDetails.Metadata, HelperConst.DefaultBlobOptions))
            {
                CloudBlob          cloudBlob   = item as CloudBlob;
                CloudBlobDirectory subCloudDir = item as CloudBlobDirectory;

                if (cloudBlob != null)
                {
                    if (CloudBlobHelper.MapStorageBlobTypeToBlobType(cloudBlob.BlobType) == this.BlobType)
                    {
                        FileNode fileNode = new FileNode(cloudBlob.GetShortName());
                        this.BuildFileNode(cloudBlob, fileNode);
                        dirNode.AddFileNode(fileNode);
                    }
                }
                else if (subCloudDir != null)
                {
                    var     subDirName = subCloudDir.GetShortName();
                    DirNode subDirNode = dirNode.GetDirNode(subDirName);

                    // A blob directory could be listed more than once if it's across table servers.
                    if (subDirNode == null)
                    {
                        subDirNode = new DirNode(subDirName);
                        this.BuildDirNode(subCloudDir, subDirNode);
                        dirNode.AddDirNode(subDirNode);
                    }
                }
            }
        }
Exemple #3
0
        public static void AddTree(DirNode dirNode, string dirPrefix, string filePrefix, int width, int depth, int fileSizeInKB, FileAttributes?fa = null, DateTime?lmt = null)
        {
            for (int i = 0; i < width; ++i)
            {
                string   fileName = i == 0 ? filePrefix : filePrefix + "_" + i;
                FileNode fileNode = new FileNode(fileName)
                {
                    SizeInByte       = 1024L * fileSizeInKB,
                    FileAttr         = fa,
                    LastModifiedTime = lmt,
                };

                dirNode.AddFileNode(fileNode);
            }

            if (depth > 0)
            {
                for (int i = 0; i < width; ++i)
                {
                    string  dirName    = i == 0 ? dirPrefix : dirPrefix + "_" + i;
                    DirNode subDirNode = dirNode.GetDirNode(dirName);
                    if (subDirNode == null)
                    {
                        subDirNode = new DirNode(dirName);
                        dirNode.AddDirNode(subDirNode);
                    }

                    DMLibDataHelper.AddTree(subDirNode, dirPrefix, filePrefix, width, depth - 1, fileSizeInKB, fa, lmt: lmt);
                }
            }
        }
        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 (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);
                }
            }
        }
Exemple #5
0
        private void BuildDirNode(string dirPath, DirNode parent, bool handleSMBAttributes)
        {
            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;

            foreach (var fileInfo in LongPathDirectoryExtension.GetFiles(dirPath))
            {
                FileNode fileNode = new FileNode(fileInfo.Remove(0, dirPath.Length));
                this.BuildFileNode(fileInfo, fileNode, handleSMBAttributes);
                parent.AddFileNode(fileNode);
            }

            foreach (var subDirInfo in LongPathDirectoryExtension.GetDirectories(dirPath))
            {
                DirNode subDirNode = new DirNode(subDirInfo.Remove(0, dirPath.Length));
                this.BuildDirNode(subDirInfo, subDirNode, handleSMBAttributes);
                parent.AddDirNode(subDirNode);
            }
        }
Exemple #6
0
        private void BuildDirNode(DirectoryInfo dirInfo, DirNode parent, bool handleSMBAttributes = false)
        {
            if (handleSMBAttributes)
            {
                DateTimeOffset?creationTime   = null;
                DateTimeOffset?lastWriteTime  = null;
                FileAttributes?fileAttributes = null;

#if DOTNET5_4
                LongPathFileExtension.GetFileProperties(dirInfo.FullName, out creationTime, out lastWriteTime, out fileAttributes, true);
#else
                LongPathFileExtension.GetFileProperties(dirInfo.FullName, out creationTime, out lastWriteTime, out fileAttributes);
#endif
                parent.CreationTime  = creationTime;
                parent.LastWriteTime = lastWriteTime;
            }

            foreach (FileInfo fileInfo in dirInfo.GetFiles())
            {
                FileNode fileNode = new FileNode(fileInfo.Name);
                this.BuildFileNode(fileInfo, fileNode, handleSMBAttributes);
                parent.AddFileNode(fileNode);
            }

            foreach (DirectoryInfo subDirInfo in dirInfo.GetDirectories())
            {
                DirNode subDirNode = new DirNode(subDirInfo.Name);
                this.BuildDirNode(subDirInfo, subDirNode, handleSMBAttributes);
                parent.AddDirNode(subDirNode);
            }
        }
Exemple #7
0
        public static void AddTree(
            DirNode dirNode,
            string dirPrefix,
            string filePrefix,
            int width,
            int depth,
            int fileSizeInKB,
            FileAttributes?fa         = null,
            DateTime?lmt              = null,
            string cacheControl       = null,
            string contentDisposition = null,
            string contentEncoding    = null,
            string contentLanguage    = null,
            string contentType        = null,
            string md5 = null,
            IDictionary <string, string> metadata = null)
        {
            for (int i = 0; i < width; ++i)
            {
                string   fileName = i == 0 ? filePrefix : filePrefix + "_" + i;
                FileNode fileNode = new FileNode(fileName)
                {
                    SizeInByte         = 1024L * fileSizeInKB,
                    FileAttr           = fa,
                    LastModifiedTime   = lmt,
                    CacheControl       = cacheControl,
                    ContentDisposition = contentDisposition,
                    ContentEncoding    = contentEncoding,
                    ContentLanguage    = contentLanguage,
                    ContentType        = contentType,
                    MD5      = md5,
                    Metadata = metadata
                };

                dirNode.AddFileNode(fileNode);
            }

            if (depth > 0)
            {
                for (int i = 0; i < width; ++i)
                {
                    string  dirName    = i == 0 ? dirPrefix : dirPrefix + "_" + i;
                    DirNode subDirNode = dirNode.GetDirNode(dirName);
                    if (subDirNode == null)
                    {
                        subDirNode = new DirNode(dirName);
                        dirNode.AddDirNode(subDirNode);
                    }

                    DMLibDataHelper.AddTree(subDirNode, dirPrefix, filePrefix, width, depth - 1, fileSizeInKB, fa, lmt: lmt);
                }
            }
        }
Exemple #8
0
        public void FollowSymlink_DeadLoop_2()
        {
#if DNXCORE50
            if (!CrossPlatformHelpers.IsLinux)
            {
                return;
            }
            DMLibDataInfo sourceDataInfo = new DMLibDataInfo("rootfolder");
            DMLibDataInfo targetDataInfo = new DMLibDataInfo("targetC");

            DirNode dirNodeC = new DirNode("folder_C");
            DirNode dirNodeB = new DirNode("folder_B");
            dirNodeB.AddFileNode(new FileNode("File_B")
            {
                SizeInByte = 1024
            });

            dirNodeC.AddDirNode(dirNodeB);
            dirNodeB.AddDirNode(DirNode.SymlinkedDir("symlinkToC", "../../folder_C", dirNodeC));
            targetDataInfo.RootNode.AddDirNode(dirNodeC);

            SourceAdaptor.CreateIfNotExists();
            SourceAdaptor.GenerateData(targetDataInfo);

            sourceDataInfo.RootNode.AddDirNode(DirNode.SymlinkedDir("symlinkToB", "../targetC/folder_C/folder_B", dirNodeB));

            var options = new TestExecutionOptions <DMLibDataInfo>()
            {
                IsDirectoryTransfer  = true,
                TransferItemModifier = (notUsed, item) =>
                {
                    dynamic transferOptions = DefaultTransferDirectoryOptions;
                    transferOptions.Recursive = true;
                    (transferOptions as UploadDirectoryOptions).FollowSymlink = true;
                    item.Options = transferOptions;
                },
                DisableSourceCleaner = true,
            };

            // This case may takes very long time.
            options.TimeoutInMs = 60 * 60 * 1000;

            var result = this.ExecuteTestCase(sourceDataInfo, options);
            foreach (var exception in result.Exceptions)
            {
                Test.Info(exception.Message);
            }

            Test.Assert(result.Exceptions.Count == 1 && result.Exceptions[0] is TransferException && result.Exceptions[0].InnerException.Message.Contains("Too many levels of symbolic links"), "Verify expected exception is thrown.");
#endif
        }
Exemple #9
0
        private void BuildDeepSymlinkDir(DirNode rootDir, DirNode parent, int level)
        {
            DirNode subDir = new DirNode($"{UnicodeFileName}{FolderSuffix}_{level}");

            if (--level > 0)
            {
                BuildDeepSymlinkDir(rootDir, subDir, level);
            }

            subDir.AddFileNode(new FileNode($"{UnicodeFileName}{FileSuffix}")
            {
                SizeInByte = 1024
            });
            rootDir.AddDirNode(subDir);
            parent.AddDirNode(DirNode.SymlinkedDir($"{UnicodeFileName}{SymlinkSuffix}_{level}", Path.Combine(Object.ReferenceEquals(rootDir, parent) ? "" : "..", subDir.Name), subDir));
        }
        private void BuildDirNode(DirectoryInfo dirInfo, DirNode parent)
        {
            foreach (FileInfo fileInfo in dirInfo.GetFiles())
            {
                FileNode fileNode = new FileNode(fileInfo.Name);
                this.BuildFileNode(fileInfo, fileNode);
                parent.AddFileNode(fileNode);
            }

            foreach (DirectoryInfo subDirInfo in dirInfo.GetDirectories())
            {
                DirNode subDirNode = new DirNode(subDirInfo.Name);
                this.BuildDirNode(subDirInfo, subDirNode);
                parent.AddDirNode(subDirNode);
            }
        }
        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);
            }
        }
Exemple #12
0
        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 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");
        }