You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
3.4 KiB
87 lines
3.4 KiB
1 year ago
|
using StabilityMatrix.Extensions;
|
||
|
using StabilityMatrix.Models;
|
||
|
|
||
|
namespace StabilityMatrix.Tests.Models;
|
||
|
|
||
|
[TestClass]
|
||
|
public class SharedFoldersTests
|
||
|
{
|
||
|
private string tempFolder = string.Empty;
|
||
|
private string TempModelsFolder => Path.Combine(tempFolder, "models");
|
||
|
private string TempPackageFolder => Path.Combine(tempFolder, "package");
|
||
|
|
||
|
private readonly Dictionary<SharedFolderType, string> sampleDefinitions = new()
|
||
|
{
|
||
|
[SharedFolderType.StableDiffusion] = "models/Stable-diffusion",
|
||
|
[SharedFolderType.ESRGAN] = "models/ESRGAN",
|
||
|
[SharedFolderType.TextualInversion] = "embeddings",
|
||
|
};
|
||
|
|
||
|
[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);
|
||
|
}
|
||
|
|
||
|
private void CreateSampleJunctions()
|
||
|
{
|
||
|
var definitions = new Dictionary<SharedFolderType, string>
|
||
|
{
|
||
|
[SharedFolderType.StableDiffusion] = "models/Stable-diffusion",
|
||
|
[SharedFolderType.ESRGAN] = "models/ESRGAN",
|
||
|
[SharedFolderType.TextualInversion] = "embeddings",
|
||
|
};
|
||
|
SharedFolders.SetupLinks(definitions, TempModelsFolder, TempPackageFolder);
|
||
|
}
|
||
|
|
||
|
[TestMethod]
|
||
|
public void SetupLinks_CreatesJunctions()
|
||
|
{
|
||
|
CreateSampleJunctions();
|
||
|
|
||
|
// Check model folders
|
||
|
foreach (var (folderType, relativePath) in sampleDefinitions)
|
||
|
{
|
||
|
var packagePath = Path.Combine(TempPackageFolder, relativePath);
|
||
|
var modelFolder = Path.Combine(TempModelsFolder, folderType.GetStringValue());
|
||
|
// Should exist and be a junction
|
||
|
Assert.IsTrue(Directory.Exists(packagePath), $"Package folder {packagePath} does not exist.");
|
||
|
var info = new DirectoryInfo(packagePath);
|
||
|
Assert.IsTrue(info.Attributes.HasFlag(FileAttributes.ReparsePoint), $"Package folder {packagePath} is not a junction.");
|
||
|
// Check junction target should be in models folder
|
||
|
Assert.AreEqual(modelFolder, info.LinkTarget, $"Package folder {packagePath} does not point to {modelFolder}.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[TestMethod]
|
||
|
public void SetupLinks_CanDeleteJunctions()
|
||
|
{
|
||
|
CreateSampleJunctions();
|
||
|
|
||
|
var modelFolder = Path.Combine(tempFolder, "models", SharedFolderType.StableDiffusion.GetStringValue());
|
||
|
var packagePath = Path.Combine(tempFolder, "package", sampleDefinitions[SharedFolderType.StableDiffusion]);
|
||
|
|
||
|
// Write a file to a model folder
|
||
|
File.Create(Path.Combine(modelFolder, "AFile")).Close();
|
||
|
Assert.IsTrue(File.Exists(Path.Combine(modelFolder, "AFile")), $"File should exist in {modelFolder}.");
|
||
|
// Should exist in the package folder
|
||
|
Assert.IsTrue(File.Exists(Path.Combine(packagePath, "AFile")), $"File should exist in {packagePath}.");
|
||
|
|
||
|
// Now delete the junction
|
||
|
Directory.Delete(packagePath, false);
|
||
|
Assert.IsFalse(Directory.Exists(packagePath), $"Package folder {packagePath} should not exist.");
|
||
|
|
||
|
// The file should still exist in the model folder
|
||
|
Assert.IsTrue(File.Exists(Path.Combine(modelFolder, "AFile")), $"File should exist in {modelFolder}.");
|
||
|
}
|
||
|
}
|