Files
FileFlowsPlugins/BasicNodes/Tests/HasHardLinksTest.cs

119 lines
3.5 KiB
C#

#if(DEBUG)
using System.Diagnostics;
using System.IO;
using FileFlows.BasicNodes.File;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace BasicNodes.Tests;
[TestClass]
public class HasHardLinksTest : TestBase
{
private string? testFile;
protected override void TestCleanUp()
{
// Clean up the original file and any hard links created
if (string.IsNullOrEmpty(testFile) == false && System.IO.File.Exists(testFile))
{
try
{
// Delete the original file
System.IO.File.Delete(testFile);
// Delete the hard links
for (int i = 1; ; i++)
{
var linkName = $"{testFile}_link{i}";
if (System.IO.File.Exists(linkName))
System.IO.File.Delete(linkName);
else
break; // Stop if the link doesn't exist
}
}
catch (Exception ex)
{
// Log or handle the cleanup exception if necessary
Logger.ILog($"Failed to clean up files: {ex.Message}");
}
}
}
public static void CreateHardLinkFile(string filename, int hardlinks = 1)
{
// Ensure the file exists
System.IO.File.WriteAllText(filename, "Test content");
// Create the specified number of hard links
for (int i = 1; i <= hardlinks; i++)
{
string linkName = $"{filename}_link{i}";
// Use the `ln` command to create a hard link
Process process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ln",
Arguments = $"{filename} {linkName}",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
process.WaitForExit();
if (process.ExitCode != 0)
{
string error = process.StandardError.ReadToEnd();
throw new InvalidOperationException($"Failed to create hard link: {error}");
}
}
}
[TestMethod]
public void HasHardLink()
{
testFile = Path.Combine(TempPath, Guid.NewGuid().ToString());
CreateHardLinkFile(testFile, 2);
var args = new FileFlows.Plugin.NodeParameters(testFile, Logger, false, string.Empty, MockFileService.Object);
HasHardLinks element = new ();
var result = element.Execute(args);
Assert.AreEqual(1, result);
}
[TestMethod]
public void HasHardLink2()
{
testFile = Path.Combine(TempPath, Guid.NewGuid().ToString());
CreateHardLinkFile(testFile, 1);
var args = new FileFlows.Plugin.NodeParameters(testFile, Logger, false, string.Empty, MockFileService.Object);
HasHardLinks element = new ();
var result = element.Execute(args);
Assert.AreEqual(1, result);
}
[TestMethod]
public void NoHardLinks()
{
testFile = Path.Combine(TempFile, Guid.NewGuid().ToString());
var args = new FileFlows.Plugin.NodeParameters(testFile, Logger, false, string.Empty, MockFileService.Object);
HasHardLinks element = new ();
var result = element.Execute(args);
Assert.AreEqual(2, result);
}
}
#endif