using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Prise.AssemblyLoading; using Prise.AssemblyScanning; using Prise.Tests.Plugins; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Threading.Tasks; namespace Prise.Tests.AssemblyLoading { [TestClass] public class DefaultAssemblyLoaderTests : TestBase { [TestMethod] public void Ctor_No_AssemblyLoadContextFactory_Throws_ArgumentNullException() { var exception = Assert.ThrowsException(() => new DefaultAssemblyLoader(null)); exception.Message.Contains("assemblyLoadContextFactory"); } [TestMethod] public void Ctor_Works() { Assert.IsNotNull(new DefaultAssemblyLoader(() => null)); } [TestMethod] public async Task Load_No_Context_Throws_ArgumentNullException() { var loader = new DefaultAssemblyLoader(() => null); await Assert.ThrowsExceptionAsync(() => loader.Load(null)); } [TestMethod] public async Task Load_No_PathToAssembly_Throws_ArgumentNullException() { var loader = new DefaultAssemblyLoader(() => null); var loadContext = new PluginLoadContext("Path To Plugin", this.GetType(), "netcoreapp3.1"); loadContext.FullPathToPluginAssembly = null; await Assert.ThrowsExceptionAsync(() => loader.Load(loadContext)); } [TestMethod] public async Task Load_UnRooted_PathToAssembly_Throws_ArgumentNullException() { var loader = new DefaultAssemblyLoader(() => null); var loadContext = new PluginLoadContext("../testpath", this.GetType(), "netcoreapp3.1"); await Assert.ThrowsExceptionAsync(() => loader.Load(loadContext)); } [TestMethod] public async Task Load_Works() { var mockLoadContext = this.mockRepository.Create(); var assemblyShim = this.mockRepository.Create(); var loader = new DefaultAssemblyLoader(() => mockLoadContext.Object); var loadContext = new PluginLoadContext("/home/maarten/assembly.dll", this.GetType(), "netcoreapp3.1"); mockLoadContext.Setup(c => c.LoadPluginAssembly(loadContext)).ReturnsAsync(assemblyShim.Object); var assembly = await loader.Load(loadContext); Assert.AreEqual(assemblyShim.Object, assembly); } [TestMethod] public async Task Unload_No_Context_Throws_ArgumentNullException() { var loader = new DefaultAssemblyLoader(() => null); await Assert.ThrowsExceptionAsync(() => loader.Unload(null)); } [TestMethod] public async Task Unload_No_PathToAssembly_Throws_ArgumentNullException() { var loader = new DefaultAssemblyLoader(() => null); var loadContext = new PluginLoadContext("Path To Plugin", this.GetType(), "netcoreapp3.1"); loadContext.FullPathToPluginAssembly = null; await Assert.ThrowsExceptionAsync(() => loader.Unload(loadContext)); } [TestMethod] public async Task Unload_UnRooted_PathToAssembly_Throws_ArgumentNullException() { var loader = new DefaultAssemblyLoader(() => null); var loadContext = new PluginLoadContext("../testpath", this.GetType(), "netcoreapp3.1"); await Assert.ThrowsExceptionAsync(() => loader.Unload(loadContext)); } [TestMethod] public async Task Unload_Works() { var mockLoadContext = this.mockRepository.Create(); var assemblyShim = this.mockRepository.Create(); var loader = new DefaultAssemblyLoader(() => mockLoadContext.Object); var loadContext = new PluginLoadContext("/home/maarten/assembly.dll", this.GetType(), "netcoreapp3.1"); mockLoadContext.Setup(c => c.LoadPluginAssembly(loadContext)).ReturnsAsync(assemblyShim.Object); var assembly = await loader.Load(loadContext); await loader.Unload(loadContext); Assert.AreEqual(assemblyShim.Object, assembly); } } }