|
|
|
using StabilityMatrix.Core.ReparsePoints;
|
|
|
|
|
|
|
|
namespace StabilityMatrix.Tests.ReparsePoints;
|
|
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
|
|
|
|
[TestClass]
|
|
|
|
public class JunctionTest
|
|
|
|
{
|
|
|
|
private string tempFolder = string.Empty;
|
|
|
|
|
|
|
|
[TestInitialize]
|
|
|
|
public void Initialize()
|
|
|
|
{
|
|
|
|
tempFolder = Path.GetTempFileName();
|
|
|
|
File.Delete(tempFolder);
|
|
|
|
Directory.CreateDirectory(tempFolder);
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestCleanup]
|
|
|
|
public void Cleanup()
|
|
|
|
{
|
|
|
|
if (string.IsNullOrEmpty(tempFolder)) return;
|
|
|
|
TempFiles.DeleteDirectory(tempFolder);
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
public void Exists_NoSuchFile()
|
|
|
|
{
|
|
|
|
Assert.IsFalse(Junction.Exists(Path.Combine(tempFolder, "$$$NoSuchFolder$$$")));
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
public void Exists_IsADirectory()
|
|
|
|
{
|
|
|
|
File.Create(Path.Combine(tempFolder, "AFile")).Close();
|
|
|
|
|
|
|
|
Assert.IsFalse(Junction.Exists(Path.Combine(tempFolder, "AFile")));
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
public void Create_VerifyExists_GetTarget_Delete()
|
|
|
|
{
|
|
|
|
var targetFolder = Path.Combine(tempFolder, "ADirectory");
|
|
|
|
var junctionPoint = Path.Combine(tempFolder, "SymLink");
|
|
|
|
|
|
|
|
Directory.CreateDirectory(targetFolder);
|
|
|
|
File.Create(Path.Combine(targetFolder, "AFile")).Close();
|
|
|
|
|
|
|
|
// Verify behavior before junction point created.
|
|
|
|
Assert.IsFalse(File.Exists(Path.Combine(junctionPoint, "AFile")),
|
|
|
|
"File should not be located until junction point created.");
|
|
|
|
|
|
|
|
Assert.IsFalse(Junction.Exists(junctionPoint), "Junction point not created yet.");
|
|
|
|
|
|
|
|
// Create junction point and confirm its properties.
|
|
|
|
Junction.Create(junctionPoint, targetFolder, false /*don't overwrite*/);
|
|
|
|
|
|
|
|
Assert.IsTrue(Junction.Exists(junctionPoint), "Junction point exists now.");
|
|
|
|
|
|
|
|
Assert.AreEqual(targetFolder, Junction.GetTarget(junctionPoint));
|
|
|
|
|
|
|
|
Assert.IsTrue(File.Exists(Path.Combine(junctionPoint, "AFile")),
|
|
|
|
"File should be accessible via the junction point.");
|
|
|
|
|
|
|
|
// Delete junction point.
|
|
|
|
Junction.Delete(junctionPoint);
|
|
|
|
|
|
|
|
Assert.IsFalse(Junction.Exists(junctionPoint), "Junction point should not exist now.");
|
|
|
|
|
|
|
|
Assert.IsFalse(File.Exists(Path.Combine(junctionPoint, "AFile")),
|
|
|
|
"File should not be located after junction point deleted.");
|
|
|
|
|
|
|
|
Assert.IsFalse(Directory.Exists(junctionPoint), "Ensure directory was deleted too.");
|
|
|
|
|
|
|
|
// Cleanup
|
|
|
|
File.Delete(Path.Combine(targetFolder, "AFile"));
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
[ExpectedException(typeof(IOException), "Directory already exists and overwrite parameter is false.")]
|
|
|
|
public void Create_ThrowsIfOverwriteNotSpecifiedAndDirectoryExists()
|
|
|
|
{
|
|
|
|
var targetFolder = Path.Combine(tempFolder, "ADirectory");
|
|
|
|
var junctionPoint = Path.Combine(tempFolder, "SymLink");
|
|
|
|
|
|
|
|
Directory.CreateDirectory(junctionPoint);
|
|
|
|
|
|
|
|
Junction.Create(junctionPoint, targetFolder, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
public void Create_OverwritesIfSpecifiedAndDirectoryExists()
|
|
|
|
{
|
|
|
|
var targetFolder = Path.Combine(tempFolder, "ADirectory");
|
|
|
|
var junctionPoint = Path.Combine(tempFolder, "SymLink");
|
|
|
|
|
|
|
|
Directory.CreateDirectory(junctionPoint);
|
|
|
|
Directory.CreateDirectory(targetFolder);
|
|
|
|
|
|
|
|
Junction.Create(junctionPoint, targetFolder, true);
|
|
|
|
|
|
|
|
Assert.AreEqual(targetFolder, Junction.GetTarget(junctionPoint));
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
[ExpectedException(typeof(IOException), "Target path does not exist or is not a directory.")]
|
|
|
|
public void Create_ThrowsIfTargetDirectoryDoesNotExist()
|
|
|
|
{
|
|
|
|
var targetFolder = Path.Combine(tempFolder, "ADirectory");
|
|
|
|
var junctionPoint = Path.Combine(tempFolder, "SymLink");
|
|
|
|
|
|
|
|
Junction.Create(junctionPoint, targetFolder, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
[ExpectedException(typeof(IOException), "Unable to open reparse point.")]
|
|
|
|
public void GetTarget_NonExistentJunctionPoint()
|
|
|
|
{
|
|
|
|
Junction.GetTarget(Path.Combine(tempFolder, "SymLink"));
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
[ExpectedException(typeof(IOException), "Path is not a junction point.")]
|
|
|
|
public void GetTarget_CalledOnADirectoryThatIsNotAJunctionPoint()
|
|
|
|
{
|
|
|
|
Junction.GetTarget(tempFolder);
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
[ExpectedException(typeof(IOException), "Path is not a junction point.")]
|
|
|
|
public void GetTarget_CalledOnAFile()
|
|
|
|
{
|
|
|
|
File.Create(Path.Combine(tempFolder, "AFile")).Close();
|
|
|
|
|
|
|
|
Junction.GetTarget(Path.Combine(tempFolder, "AFile"));
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
public void Delete_NonExistentJunctionPoint()
|
|
|
|
{
|
|
|
|
// Should do nothing.
|
|
|
|
Junction.Delete(Path.Combine(tempFolder, "SymLink"));
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
[ExpectedException(typeof(IOException), "Unable to delete junction point.")]
|
|
|
|
public void Delete_CalledOnADirectoryThatIsNotAJunctionPoint()
|
|
|
|
{
|
|
|
|
Junction.Delete(tempFolder);
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestMethod]
|
|
|
|
[ExpectedException(typeof(IOException), "Path is not a junction point.")]
|
|
|
|
public void Delete_CalledOnAFile()
|
|
|
|
{
|
|
|
|
File.Create(Path.Combine(tempFolder, "AFile")).Close();
|
|
|
|
|
|
|
|
Junction.Delete(Path.Combine(tempFolder, "AFile"));
|
|
|
|
}
|
|
|
|
}
|