Exemple #1
0
        public void CreateDirectoryNested()
        {
            string Target = PathGeneratorUtilities.GetRelativePath("parentDir", "targetDir");

            FileUtilities.CreateDirectory(GetFullPath(Target));
            XAssert.IsTrue(Directory.Exists(GetFullPath(Target)));
        }
        public void CreateHardlinkSupportsLongPath()
        {
            var longPath = Enumerable.Range(0, NativeIOConstants.MaxDirectoryPath).Aggregate(TemporaryDirectory, (path, _) => Path.Combine(path, "dir"));

            FileUtilities.CreateDirectory(longPath);

            var file = Path.Combine(longPath, "out.txt");
            var link = Path.Combine(longPath, "hardlink");

            SafeFileHandle fileHandle;
            var            result = FileUtilities.TryCreateOrOpenFile(
                file,
                FileDesiredAccess.GenericWrite,
                FileShare.Delete,
                FileMode.Create,
                FileFlagsAndAttributes.FileAttributeNormal,
                out fileHandle);

            XAssert.IsTrue(result.Succeeded);
            using (FileStream stream = new FileStream(fileHandle, FileAccess.Write))
            {
                stream.WriteByte(255);
            }

            XAssert.IsTrue(CreateHardLinkIfSupported(link: link, linkTarget: file));
        }
Exemple #3
0
        public void TestEnumerateFilesWithPattern()
        {
            const string Target          = "targetDir";
            string       nestedDirectory = GetFullPath(Path.Combine(Target, "sub1", "sub2", "sub3"));

            FileUtilities.CreateDirectory(nestedDirectory);

            const string Content = "my text";

            File.WriteAllText(Path.Combine(nestedDirectory, "sub_file.txt"), Content);

            var entries = FileUtilities.FileSystem.EnumerateFiles(GetFullPath(Target), pattern: "sub*", recursive: true);

            XAssert.SetEqual(new [] { "sub_file.txt" }, entries.Select(e => e.FileName).ToHashSet());

            // Checking the size of the file.
            XAssert.AreEqual(Content.Length, entries.First(e => e.FileName == "sub_file.txt").Size);

            XAssert.AreEqual(0, FileUtilities.FileSystem.EnumerateFiles(GetFullPath(Target), pattern: "sub1", recursive: true).Count);
            XAssert.AreEqual(1, FileUtilities.FileSystem.EnumerateFiles(GetFullPath(Target), pattern: "sub_file*", recursive: true).Count);
            XAssert.AreEqual(1, FileUtilities.FileSystem.EnumerateFiles(GetFullPath(Target), pattern: "*.txt", recursive: true).Count);

            // Non recursive case
            XAssert.AreEqual(0, FileUtilities.FileSystem.EnumerateFiles(GetFullPath(Target), pattern: "*.txt", recursive: false).Count);

            // Pattern with 0 matches
            XAssert.AreEqual(0, FileUtilities.FileSystem.EnumerateFiles(GetFullPath(Target), pattern: "foo", recursive: true).Count);
        }
Exemple #4
0
        public void CreateDirectory()
        {
            const string Target = "targetDir";

            FileUtilities.CreateDirectory(GetFullPath(Target));
            XAssert.IsTrue(Directory.Exists(GetFullPath(Target)));

            FileUtilities.CreateDirectory(GetFullPath(Target));
            XAssert.IsTrue(Directory.Exists(GetFullPath(Target)));
        }
Exemple #5
0
        private void VerifyResolveSymlink(string symlinkPath, string target, string expectedResult)
        {
            FileUtilities.CreateDirectory(Path.GetDirectoryName(symlinkPath));
            XAssert.PossiblySucceeded(FileUtilities.TryCreateSymbolicLink(symlinkPath, target, isTargetFile: true));
            var maybeResult = FileUtilities.ResolveSymlinkTarget(symlinkPath, target);

            if (expectedResult != null)
            {
                XAssert.IsTrue(maybeResult.Succeeded, maybeResult.Succeeded ? string.Empty : maybeResult.Failure.DescribeIncludingInnerFailures());
                XAssert.ArePathEqual(expectedResult, maybeResult.Result);
            }
            else
            {
                XAssert.IsFalse(maybeResult.Succeeded);
            }
        }
Exemple #6
0
        [Trait("Category", "WindowsOSOnly")] // TODO: Fix for non Windows
        public void GetChainOfSymlinksWithDirectorySymlink()
        {
            // File and directory layout:
            //    Enlist
            //    |
            //    +---Intermediate
            //    |   \---Current
            //    |           file.lnk ==> ..\..\Target\file.txt
            //    |
            //    +---Source ==> Intermediate\Current
            //    |
            //    \---Target
            //            file.txt

            // Create a concrete file /Target/file.txt
            string targetFile = GetFullPath(R("Target", "file.txt"));

            FileUtilities.CreateDirectory(Path.GetDirectoryName(targetFile));
            File.WriteAllText(targetFile, "Contents");

            // Create a symlink /Intermediate/Current/file.lnk --> ../../Target/file.txt
            string intermediateLink = GetFullPath(R("Intermediate", "Current", "file.lnk"));

            FileUtilities.CreateDirectory(Path.GetDirectoryName(intermediateLink));
            XAssert.PossiblySucceeded(FileUtilities.TryCreateSymbolicLink(intermediateLink, R("..", "..", "Target", "file.txt"), isTargetFile: true));

            // Create a directory symlink /Source --> Intermediate/Current
            // Access /Source/file.lnk.
            string sourceLink = GetFullPath(R("Source", "file.lnk"));

            XAssert.PossiblySucceeded(FileUtilities.TryCreateSymbolicLink(Path.GetDirectoryName(sourceLink), R("Intermediate", "Current"), isTargetFile: false));

            using (SafeFileHandle handle = OpenHandleForReparsePoint(sourceLink))
            {
                var chain = new List <string>();
                FileUtilities.GetChainOfReparsePoints(handle, sourceLink, chain);

                // There are two ways of reaching file.lnk, (1) /Source/file.lnk, and (2) /Intermediate/Current/file.lnk.
                // For Windows, BuildXL does not track all possible paths reaching to file.lnk; only what the tool/user accesses.
                // In this case, we access /Source/file.lnk. Thus, only /Source/file.lnk and /Target/file.txt are in the chain.
                // TODO: Reconcile this with Mac implementation.
                XAssert.AreEqual(2, chain.Count, "Chain of reparse points: " + string.Join(" -> ", chain));
                XAssert.ArePathEqual(sourceLink, TrimPathPrefix(chain[0]));
                XAssert.ArePathEqual(targetFile, TrimPathPrefix(chain[1]));
            }
        }
        public void LongPathAccessControlTest()
        {
            var longPath = Enumerable.Range(0, NativeIOConstants.MaxDirectoryPath).Aggregate(TemporaryDirectory, (path, _) => Path.Combine(path, "dir"));
            var file     = Path.Combine(longPath, "fileWithWriteAccess.txt");

            FileUtilities.CreateDirectory(longPath);
            SafeFileHandle fileHandle;
            var            result = FileUtilities.TryCreateOrOpenFile(
                file,
                FileDesiredAccess.GenericWrite,
                FileShare.Delete,
                FileMode.Create,
                FileFlagsAndAttributes.FileAttributeNormal,
                out fileHandle);

            XAssert.IsTrue(result.Succeeded);

            FileUtilities.SetFileAccessControl(file, FileSystemRights.WriteAttributes, true);
            XAssert.IsTrue(FileUtilities.HasWritableAccessControl(file));

            //Delete the created directory
            fileHandle.Close();
            FileUtilities.DeleteDirectoryContents(longPath, deleteRootDirectory: true);
        }
Exemple #8
0
        public void TestResolveSymlinkWithDirectorySymlinkOrJunction(bool useJunction, bool oneDotDot)
        {
            // File and directory layout:
            //    Enlist
            //    |
            //    +---Intermediate
            //    |   \---Current
            //    |           file.lnk ==> ..\..\Target\file.txt (or ..\Target\file.txt)
            //    |
            //    +---Source ==> Intermediate\Current
            //    |
            //    \---Target
            //            file.txt

            // Create a symlink Enlist/Intermediate/Current/file.lnk --> ../../Target/file.txt (or ../Target/file.txt)
            string symlinkFile = GetFullPath(R("Enlist", "Intermediate", "Current", "file.lnk"));

            FileUtilities.CreateDirectory(GetFullPath(R("Enlist", "Intermediate", "Current")));

            var relativeTarget = oneDotDot ? R("..", "Target", "file.txt") : R("..", "..", "Target", "file.txt");

            XAssert.PossiblySucceeded(FileUtilities.TryCreateSymbolicLink(symlinkFile, relativeTarget, isTargetFile: true));

            // Create a directory symlink Enlist/Source --> Enlist/Intermediate/Current
            string symlinkDirectory = GetFullPath(R("Enlist", "Source"));

            if (useJunction)
            {
                FileUtilities.CreateDirectory(symlinkDirectory);
                FileUtilities.CreateJunction(symlinkDirectory, GetFullPath(R("Enlist", "Intermediate", "Current")));
            }
            else
            {
                XAssert.PossiblySucceeded(FileUtilities.TryCreateSymbolicLink(symlinkDirectory, R("Intermediate", "Current"), isTargetFile: false));
            }

            string expectedFinalPath = null;

            if (useJunction)
            {
                expectedFinalPath = oneDotDot ? GetFullPath(R("Enlist", "Target", "file.txt")) : GetFullPath(R("Target", "file.txt"));
            }
            else
            {
                expectedFinalPath = oneDotDot ? GetFullPath(R("Enlist", "Intermediate", "Target", "file.txt")) : GetFullPath(R("Enlist", "Target", "file.txt"));
            }

            // Resolve symlink Enlist/Source/file.lnk by supplying the symlink relative target path (../../Target/file.txt or ../Target/file.txt).
            var maybeResult = FileUtilities.ResolveSymlinkTarget(GetFullPath(R("Enlist", "Source", "file.lnk")), relativeTarget);

            XAssert.PossiblySucceeded(maybeResult);

            XAssert.ArePathEqual(expectedFinalPath, maybeResult.Result);

            // Resolve symlink Enlist/Source/file.lnk without supplying the symlink target path
            // The result should be Enlist/Target/file.txt
            maybeResult = FileUtilities.ResolveSymlinkTarget(GetFullPath(R("Enlist", "Source", "file.lnk")));
            XAssert.PossiblySucceeded(maybeResult);

            XAssert.ArePathEqual(expectedFinalPath, maybeResult.Result);
        }