Exemple #1
0
        public void GetChainOfJunctions()
        {
            string targetDirectory = GetFullPath("target");

            Directory.CreateDirectory(targetDirectory);

            string intermediateJunction = GetFullPath("intermediate.jct");

            Directory.CreateDirectory(intermediateJunction);
            FileUtilities.CreateJunction(intermediateJunction, targetDirectory);

            string sourceJunction = GetFullPath("source.jct");

            Directory.CreateDirectory(sourceJunction);
            FileUtilities.CreateJunction(sourceJunction, intermediateJunction);

            using (SafeFileHandle handle = OpenHandleForReparsePoint(sourceJunction))
            {
                var chain = new List <string>();
                FileUtilities.GetChainOfReparsePoints(handle, sourceJunction, chain);
                XAssert.AreEqual(3, chain.Count, "Chain of reparse points: " + string.Join(" -> ", chain));
                XAssert.AreEqual(sourceJunction.ToUpperInvariant(), TrimPathPrefix(chain[0].ToUpperInvariant()));
                XAssert.AreEqual(intermediateJunction.ToUpperInvariant(), TrimPathPrefix(chain[1].ToUpperInvariant()));
                XAssert.AreEqual(targetDirectory.ToUpperInvariant(), TrimPathPrefix(chain[2].ToUpperInvariant()));
            }
        }
Exemple #2
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);
        }