예제 #1
0
        public void DeleteFilesCancellationDoesNotCrash()
        {
            const int FileDeletionsAllowed = 2;
            var       testHook             = new DirectoryScrubber.TestHooks
            {
                OnDeletion = new Action <string, int>((path, numDeletedSoFar) =>
                {
                    if (numDeletedSoFar > FileDeletionsAllowed)
                    {
                        m_cancellationTokenSource.Cancel();
                    }
                })
            };

            string rootDir = Path.Combine(TemporaryDirectory, nameof(DeleteFilesCanDeleteFile));

            List <string> files = new List <string>();

            for (var i = 0; i < FileDeletionsAllowed * 3; i++)
            {
                string fullFilePath = WriteFile(Path.Combine(rootDir, $"out{i}.txt"));
                XAssert.FileExists(fullFilePath);
                files.Add(fullFilePath);
            }

            XAssert.IsFalse(m_cancellationTokenSource.IsCancellationRequested);

            var numDeleted = Scrubber.DeleteFiles(files.ToArray(), testHook: testHook);

            XAssert.IsTrue(m_cancellationTokenSource.IsCancellationRequested);
            XAssert.Equals(FileDeletionsAllowed, numDeleted);
        }
예제 #2
0
        public void DeleteFilesCannotDeleteFolder()
        {
            string rootDir = Path.Combine(TemporaryDirectory, nameof(DeleteFilesCannotDeleteFolder));

            Directory.CreateDirectory(rootDir);
            XAssert.IsTrue(Directory.Exists(rootDir));

            var numDeleted = Scrubber.DeleteFiles(new[] { rootDir });

            XAssert.IsTrue(Directory.Exists(rootDir));
            XAssert.AreEqual(0, numDeleted);
        }
예제 #3
0
        public void DeleteFilesCanDeleteSymlinkToAbsentFile(bool declareSymlinkTargetAsFile)
        {
            string rootDir         = Path.Combine(TemporaryDirectory, nameof(DeleteFilesCanDeleteSymlinkToAbsentFile));
            string fullSymlinkPath = WriteSymlink(Path.Combine(rootDir, "symlink-to-absent"), "non-existent-target", isTargetFile: declareSymlinkTargetAsFile);

            XAssert.IsTrue(FileUtilities.FileExistsNoFollow(fullSymlinkPath));

            var numDeleted = Scrubber.DeleteFiles(new[] { fullSymlinkPath });

            XAssert.AreEqual(1, numDeleted);
            XAssert.IsFalse(File.Exists(fullSymlinkPath));
        }
예제 #4
0
        public void DeleteFilesCanDeleteFile()
        {
            string rootDir = Path.Combine(TemporaryDirectory, nameof(DeleteFilesCanDeleteFile));

            string fullFilePath = WriteFile(Path.Combine(rootDir, "out.txt"));

            XAssert.IsTrue(File.Exists(fullFilePath));

            var numDeleted = Scrubber.DeleteFiles(new[] { fullFilePath });

            XAssert.IsFalse(File.Exists(fullFilePath));
            XAssert.AreEqual(1, numDeleted);
        }
예제 #5
0
        public void DeleteFilesWithPreExistingCancellationDoesNotCrash()
        {
            string rootDir = Path.Combine(TemporaryDirectory, nameof(DeleteFilesCanDeleteFile));

            string fullFilePath = WriteFile(Path.Combine(rootDir, "out.txt"));

            XAssert.FileExists(fullFilePath);

            m_cancellationTokenSource.Cancel();
            var numDeleted = Scrubber.DeleteFiles(new[] { fullFilePath });

            XAssert.FileExists(fullFilePath);
            XAssert.AreEqual(0, numDeleted);
        }
예제 #6
0
        public void DeleteFilesHandlesAbsentFiles()
        {
            string rootDir = Path.Combine(TemporaryDirectory, nameof(DeleteFilesHandlesAbsentFiles));

            Directory.CreateDirectory(rootDir);
            XAssert.IsTrue(Directory.Exists(rootDir));

            var absentFile = Path.Combine(rootDir, "a b s e n t");

            XAssert.IsFalse(File.Exists(absentFile));

            var numDeleted = Scrubber.DeleteFiles(new[] { absentFile });

            XAssert.IsFalse(File.Exists(absentFile));
            XAssert.AreEqual(0, numDeleted);
        }
예제 #7
0
        public void DeleteFilesCanDeleteDirectorySymlink()
        {
            string rootDir           = Path.Combine(TemporaryDirectory, nameof(DeleteFilesCanDeleteDirectorySymlink));
            string fullTargetDirPath = Path.Combine(rootDir, "target-dir");

            Directory.CreateDirectory(fullTargetDirPath);
            XAssert.IsTrue(Directory.Exists(fullTargetDirPath));

            string fullSymlinkPath = WriteSymlink(Path.Combine(rootDir, "directory symlink"), fullTargetDirPath, isTargetFile: false);

            XAssert.IsTrue(FileUtilities.FileExistsNoFollow(fullSymlinkPath));

            var numDeleted = Scrubber.DeleteFiles(new[] { fullSymlinkPath });

            XAssert.AreEqual(1, numDeleted);
            XAssert.IsFalse(File.Exists(fullSymlinkPath));
            XAssert.IsTrue(Directory.Exists(fullTargetDirPath));
        }
예제 #8
0
        public void DeleteFilesDeletesSymlinkButNotTarget(bool useRelativeTargetForSymlink)
        {
            string rootDir = Path.Combine(TemporaryDirectory, nameof(DeleteFilesDeletesSymlinkButNotTarget));

            string fileBasename = "out.txt";
            string fullFilePath = WriteFile(Path.Combine(rootDir, fileBasename));

            XAssert.IsTrue(File.Exists(fullFilePath));

            string fullSymlinkPath = WriteSymlink(
                Path.Combine(rootDir, $"sym-{fileBasename}"),
                useRelativeTargetForSymlink ? fileBasename : fullFilePath,
                isTargetFile: true);

            XAssert.IsTrue(FileUtilities.FileExistsNoFollow(fullSymlinkPath));

            var numDeleted = Scrubber.DeleteFiles(new[] { fullSymlinkPath });

            XAssert.AreEqual(1, numDeleted);
            XAssert.IsFalse(File.Exists(fullSymlinkPath));
            XAssert.IsTrue(File.Exists(fullFilePath));
        }