/// <summary> /// Initializes a new instance of the <see cref="Xunit1Executor" /> class. /// </summary> /// <param name="diagnosticMessageSink">The message sink which receives <see cref="_DiagnosticMessage"/> messages.</param> /// <param name="useAppDomain">Determines whether tests should be run in a separate app domain.</param> /// <param name="testAssemblyFileName">The filename of the test assembly.</param> /// <param name="configFileName">The filename of the configuration file.</param> /// <param name="shadowCopy">Set to <c>true</c> to enable shadow copying the assemblies.</param> /// <param name="shadowCopyFolder">The path on disk to use for shadow copying; if <c>null</c>, a folder /// will be automatically (randomly) generated</param> public Xunit1Executor( _IMessageSink diagnosticMessageSink, bool useAppDomain, string testAssemblyFileName, string?configFileName = null, bool shadowCopy = true, string?shadowCopyFolder = null) { Guard.ArgumentNotNull(testAssemblyFileName); appDomain = AppDomainManagerFactory.Create(useAppDomain, testAssemblyFileName, configFileName, shadowCopy, shadowCopyFolder, diagnosticMessageSink); xunitAssemblyPath = GetXunitAssemblyPath(testAssemblyFileName); xunitAssemblyName = AssemblyName.GetAssemblyName(xunitAssemblyPath); executor = Guard.NotNull("Could not create Xunit.Sdk.Executor object for v1 test assembly", CreateObject("Xunit.Sdk.Executor", testAssemblyFileName)); TestFrameworkDisplayName = string.Format(CultureInfo.InvariantCulture, "xUnit.net {0}", AssemblyName.GetAssemblyName(xunitAssemblyPath).Version); }
Xunit2( _IMessageSink diagnosticMessageSink, AppDomainSupport appDomainSupport, _ISourceInformationProvider sourceInformationProvider, _IAssemblyInfo?assemblyInfo, string?assemblyFileName, string xunitExecutionAssemblyPath, string?configFileName, bool shadowCopy, string?shadowCopyFolder, bool verifyAssembliesOnDisk) { #if NETFRAMEWORK // Only safe to assume the execution reference is copied in a desktop project if (verifyAssembliesOnDisk) { Guard.FileExists(xunitExecutionAssemblyPath); } CanUseAppDomains = !IsDotNet(xunitExecutionAssemblyPath); #else CanUseAppDomains = false; #endif DiagnosticMessageSink = diagnosticMessageSink; var appDomainAssembly = assemblyFileName ?? xunitExecutionAssemblyPath; AppDomain = AppDomainManagerFactory.Create(appDomainSupport != AppDomainSupport.Denied && CanUseAppDomains, appDomainAssembly, configFileName, shadowCopy, shadowCopyFolder, diagnosticMessageSink); DisposalTracker.Add(AppDomain); #if NETFRAMEWORK var runnerUtilityAssemblyLocation = Path.GetDirectoryName(typeof(AssemblyHelper).Assembly.GetLocalCodeBase()); assemblyHelper = AppDomain.CreateObjectFrom <AssemblyHelper>(typeof(AssemblyHelper).Assembly.Location, typeof(AssemblyHelper).FullName !, runnerUtilityAssemblyLocation); DisposalTracker.Add(assemblyHelper); #endif TestFrameworkAssemblyName = GetTestFrameworkAssemblyName(xunitExecutionAssemblyPath); // We need both a v2 and v3 assembly info, so manufacture the things we're missing IAssemblyInfo remoteAssemblyInfo; if (assemblyInfo != null) { remoteAssemblyInfo = new Xunit2AssemblyInfo(assemblyInfo); } else { remoteAssemblyInfo = Guard.NotNull( "Could not create Xunit.Sdk.TestFrameworkProxy for v2 unit test", AppDomain.CreateObject <IAssemblyInfo>(TestFrameworkAssemblyName, "Xunit.Sdk.ReflectionAssemblyInfo", assemblyFileName) ); assemblyInfo = new Xunit3AssemblyInfo(remoteAssemblyInfo); } this.assemblyInfo = assemblyInfo; this.configFileName = configFileName; TestAssemblyUniqueID = UniqueIDGenerator.ForAssembly(this.assemblyInfo.Name, this.assemblyInfo.AssemblyPath, configFileName); var v2SourceInformationProvider = Xunit2SourceInformationProviderAdapter.Adapt(sourceInformationProvider); var v2DiagnosticMessageSink = new Xunit2MessageSink(DiagnosticMessageSink); remoteFramework = Guard.NotNull( "Could not create Xunit.Sdk.TestFrameworkProxy for v2 unit test", AppDomain.CreateObject <ITestFramework>( TestFrameworkAssemblyName, "Xunit.Sdk.TestFrameworkProxy", remoteAssemblyInfo, v2SourceInformationProvider, v2DiagnosticMessageSink ) ); DisposalTracker.Add(remoteFramework); remoteDiscoverer = Guard.NotNull("Could not get discoverer from test framework for v2 unit test", remoteFramework.GetDiscoverer(remoteAssemblyInfo)); DisposalTracker.Add(remoteDiscoverer); // If we got an assembly file name, that means we can do execution as well as discovery. if (assemblyFileName != null) { #if NETFRAMEWORK var assemblyName = AssemblyName.GetAssemblyName(assemblyFileName); #else var an = Assembly.Load(new AssemblyName { Name = Path.GetFileNameWithoutExtension(assemblyFileName) }).GetName(); var assemblyName = new AssemblyName { Name = an.Name, Version = an.Version }; #endif remoteExecutor = remoteFramework.GetExecutor(assemblyName); DisposalTracker.Add(remoteExecutor); } }