Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RuntimePlugin Locator looks into TestAssembly folder #1597

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
12 changes: 7 additions & 5 deletions TechTalk.SpecFlow/Infrastructure/ContainerBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using BoDi;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using TechTalk.SpecFlow.Configuration;
using TechTalk.SpecFlow.Plugins;
using TechTalk.SpecFlow.Tracing;
Expand All @@ -10,7 +12,7 @@ namespace TechTalk.SpecFlow.Infrastructure
{
public interface IContainerBuilder
{
IObjectContainer CreateGlobalContainer(IRuntimeConfigurationProvider configurationProvider = null);
IObjectContainer CreateGlobalContainer(Assembly testAssembly, IRuntimeConfigurationProvider configurationProvider = null);
IObjectContainer CreateTestThreadContainer(IObjectContainer globalContainer);
IObjectContainer CreateScenarioContainer(IObjectContainer testThreadContainer, ScenarioInfo scenarioInfo);
IObjectContainer CreateFeatureContainer(IObjectContainer testThreadContainer, FeatureInfo featureInfo);
Expand All @@ -27,7 +29,7 @@ public ContainerBuilder(IDefaultDependencyProvider defaultDependencyProvider = n
_defaultDependencyProvider = defaultDependencyProvider ?? DefaultDependencyProvider;
}

public virtual IObjectContainer CreateGlobalContainer(IRuntimeConfigurationProvider configurationProvider = null)
public virtual IObjectContainer CreateGlobalContainer(Assembly testAssembly, IRuntimeConfigurationProvider configurationProvider = null)
{
var container = new ObjectContainer();
container.RegisterInstanceAs<IContainerBuilder>(this);
Expand All @@ -52,7 +54,7 @@ public virtual IObjectContainer CreateGlobalContainer(IRuntimeConfigurationProvi

var unitTestProviderConfigration = container.Resolve<UnitTestProviderConfiguration>();

LoadPlugins(configurationProvider, container, runtimePluginEvents, specFlowConfiguration, unitTestProviderConfigration);
LoadPlugins(configurationProvider, container, runtimePluginEvents, specFlowConfiguration, unitTestProviderConfigration, testAssembly);

runtimePluginEvents.RaiseConfigurationDefaults(specFlowConfiguration);

Expand Down Expand Up @@ -126,7 +128,7 @@ public IObjectContainer CreateFeatureContainer(IObjectContainer testThreadContai
}

protected virtual void LoadPlugins(IRuntimeConfigurationProvider configurationProvider, ObjectContainer container, RuntimePluginEvents runtimePluginEvents,
SpecFlowConfiguration specFlowConfiguration, UnitTestProviderConfiguration unitTestProviderConfigration)
SpecFlowConfiguration specFlowConfiguration, UnitTestProviderConfiguration unitTestProviderConfigration, Assembly testAssembly)
{
// initialize plugins that were registered from code
foreach (var runtimePlugin in container.Resolve<IDictionary<string, IRuntimePlugin>>().Values)
Expand All @@ -139,7 +141,7 @@ public IObjectContainer CreateFeatureContainer(IObjectContainer testThreadContai
var pluginLocator = container.Resolve<IRuntimePluginLocator>();
var pluginLoader = container.Resolve<IRuntimePluginLoader>();
var traceListener = container.Resolve<ITraceListener>();
foreach (var pluginPath in pluginLocator.GetAllRuntimePlugins())
foreach (var pluginPath in pluginLocator.GetAllRuntimePlugins(Path.GetDirectoryName(testAssembly?.Location)))
{
LoadPlugin(pluginPath, pluginLoader, runtimePluginEvents, unitTestProviderConfigration, traceListener);
}
Expand Down
1 change: 1 addition & 0 deletions TechTalk.SpecFlow/Plugins/IRuntimePluginLocator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ namespace TechTalk.SpecFlow.Plugins
public interface IRuntimePluginLocator
{
IReadOnlyList<string> GetAllRuntimePlugins();
IReadOnlyList<string> GetAllRuntimePlugins(string testAssemblyLocation);
}
}
10 changes: 9 additions & 1 deletion TechTalk.SpecFlow/Plugins/RuntimePluginLocator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,21 @@ public RuntimePluginLocator(IRuntimePluginLocationMerger runtimePluginLocationMe
}

public IReadOnlyList<string> GetAllRuntimePlugins()
{
return GetAllRuntimePlugins(null);
}

public IReadOnlyList<string> GetAllRuntimePlugins(string testAssemblyLocation)
{
var allRuntimePlugins = new List<string>();

allRuntimePlugins.AddRange(SearchPluginsInFolder(Environment.CurrentDirectory));
allRuntimePlugins.AddRange(SearchPluginsInFolder(_pathToFolderWithSpecFlowAssembly));


if (testAssemblyLocation.IsNotNullOrWhiteSpace())
{
allRuntimePlugins.AddRange(SearchPluginsInFolder(testAssemblyLocation));
}

return _runtimePluginLocationMerger.Merge(allRuntimePlugins.Distinct().ToList());
}
Expand Down
2 changes: 1 addition & 1 deletion TechTalk.SpecFlow/TestRunnerManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ private static ITestRunnerManager CreateTestRunnerManager(Assembly testAssembly,
{
containerBuilder = containerBuilder ?? new ContainerBuilder();

var container = containerBuilder.CreateGlobalContainer();
var container = containerBuilder.CreateGlobalContainer(testAssembly);
var testRunnerManager = container.Resolve<ITestRunnerManager>();
testRunnerManager.Initialize(testAssembly);
return testRunnerManager;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ public override void RegisterGlobalContainerDefaults(BoDi.ObjectContainer contai

var runtimePluginLocator = new Mock<IRuntimePluginLocator>();
runtimePluginLocator.Setup(m => m.GetAllRuntimePlugins()).Returns(new List<string>() { "aPlugin" });
runtimePluginLocator.Setup(m => m.GetAllRuntimePlugins(It.IsAny<string>())).Returns(new List<string>() { "aPlugin" });


var pluginLoaderStub = new Mock<IRuntimePluginLoader>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public void Should_be_able_to_resolve_from_scenario_container()
// this basically tests the special registration in DefaultDependencyProvider

var containerBuilder = new ContainerBuilder();
var testThreadContainer = containerBuilder.CreateTestThreadContainer(containerBuilder.CreateGlobalContainer());
var testThreadContainer = containerBuilder.CreateTestThreadContainer(containerBuilder.CreateGlobalContainer(typeof(TestThreadContextTests).Assembly));
var contextManager = CreateContextManager(testThreadContainer);
contextManager.InitializeFeatureContext(new FeatureInfo(FeatureLanguage, "test feature", null));
contextManager.InitializeScenarioContext(new ScenarioInfo("test scenario", "test_description"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ internal static IObjectContainer CreateDefaultFeatureContainer(StringConfigProvi

private static IObjectContainer CreateDefaultGlobalContainer(IRuntimeConfigurationProvider configurationProvider, Action<IObjectContainer> registerGlobalMocks, ContainerBuilder instance)
{
var globalContainer = instance.CreateGlobalContainer(configurationProvider);
var globalContainer = instance.CreateGlobalContainer(typeof(TestObjectFactories).Assembly, configurationProvider);
registerGlobalMocks?.Invoke(globalContainer);
return globalContainer;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class TestRunnerManagerTest

public TestRunnerManagerTest()
{
var globalContainer = new ContainerBuilder().CreateGlobalContainer();
var globalContainer = new ContainerBuilder().CreateGlobalContainer(typeof(TestRunnerManagerTest).Assembly);
testRunnerManager = globalContainer.Resolve<TestRunnerManager>();
testRunnerManager.Initialize(anAssembly);
}
Expand Down