using Fengling.Gateway.Plugin.Abstractions; using Xunit; using YarpGateway.Plugins; namespace YarpGateway.Tests.Unit.Plugins; public class PluginLoaderTests { private string _testBaseDir = null!; public PluginLoaderTests() { _testBaseDir = Path.Combine(Path.GetTempPath(), "plugin-test-" + Guid.NewGuid()); } [Fact] public void DiscoverPlugins_EmptyDirectory_ShouldReturnEmpty() { // Arrange var loader = new PluginLoader(); var emptyDir = Path.Combine(_testBaseDir, "empty"); Directory.CreateDirectory(emptyDir); try { // Act var plugins = loader.DiscoverPlugins(emptyDir).ToList(); // Assert Assert.Empty(plugins); } finally { Directory.Delete(_testBaseDir, true); } } [Fact] public void DiscoverPlugins_ValidPlugin_ShouldReturnPlugin() { // Arrange var loader = new PluginLoader(); var pluginDir = Path.Combine(_testBaseDir, "test-plugin"); Directory.CreateDirectory(pluginDir); // 创建 plugin.json var manifest = new { id = "test-plugin", name = "Test Plugin", version = "1.0.0", entryPoint = "TestPlugin.TestPlugin", description = "A test plugin" }; var manifestJson = System.Text.Json.JsonSerializer.Serialize(manifest); File.WriteAllText(Path.Combine(pluginDir, "plugin.json"), manifestJson); // 创建一个占位 DLL File.WriteAllText(Path.Combine(pluginDir, "test-plugin.dll"), "dummy"); try { // Act var plugins = loader.DiscoverPlugins(_testBaseDir).ToList(); // Assert Assert.Single(plugins); var plugin = plugins[0]; Assert.Equal("test-plugin", plugin.Id); Assert.Equal("Test Plugin", plugin.Name); Assert.Equal("1.0.0", plugin.Version); } finally { Directory.Delete(_testBaseDir, true); } } [Fact] public void DiscoverPlugins_NoManifest_ShouldSkipPlugin() { // Arrange var loader = new PluginLoader(); var pluginDir = Path.Combine(_testBaseDir, "test-plugin"); Directory.CreateDirectory(pluginDir); // 只创建 DLL,没有 plugin.json File.WriteAllText(Path.Combine(pluginDir, "test-plugin.dll"), "dummy"); try { // Act var plugins = loader.DiscoverPlugins(_testBaseDir).ToList(); // Assert Assert.Empty(plugins); } finally { Directory.Delete(_testBaseDir, true); } } [Fact] public void CreateShadowCopy_ShouldCopyFiles() { // Arrange var sourceDir = Path.Combine(_testBaseDir, "source"); var shadowDir = Path.Combine(_testBaseDir, "shadow"); Directory.CreateDirectory(sourceDir); // 创建源 DLL var dllPath = Path.Combine(sourceDir, "TestPlugin.dll"); File.WriteAllText(dllPath, "dummy dll"); // 创建 deps.json var depsPath = dllPath + ".deps.json"; File.WriteAllText(depsPath, "{}"); try { // Act var shadowPath = PluginLoader.CreateShadowCopy(dllPath, shadowDir); // Assert Assert.True(File.Exists(shadowPath)); Assert.True(File.Exists(Path.Combine(shadowDir, "TestPlugin.dll.deps.json"))); } finally { Directory.Delete(_testBaseDir, true); } } }