PageRenderTime 34ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/Tests/TechTalk.SpecFlow.RuntimeTests/Infrastructure/PluginTests.cs

http://github.com/techtalk/SpecFlow
C# | 326 lines | 240 code | 70 blank | 16 comment | 2 complexity | ee19d38244454d1cca7d82f21c4546db MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Text;
  7. using BoDi;
  8. using Moq;
  9. using Xunit;
  10. using FluentAssertions;
  11. using TechTalk.SpecFlow.Configuration;
  12. using TechTalk.SpecFlow.Infrastructure;
  13. using TechTalk.SpecFlow.Plugins;
  14. using TechTalk.SpecFlow.Tracing;
  15. using TechTalk.SpecFlow.UnitTestProvider;
  16. namespace TechTalk.SpecFlow.RuntimeTests.Infrastructure
  17. {
  18. public class PluginTests
  19. {
  20. public class PluginWithCustomDependency : IRuntimePlugin
  21. {
  22. public void Initialize(RuntimePluginEvents runtimePluginEvents, RuntimePluginParameters runtimePluginParameters, UnitTestProviderConfiguration unitTestProviderConfiguration)
  23. {
  24. runtimePluginEvents.RegisterGlobalDependencies += (sender, args) => args.ObjectContainer.RegisterTypeAs<CustomDependency, ICustomDependency>();
  25. }
  26. }
  27. public class PluginWithTraceListenerWhenStopAtFirstErrorIsTrue : IRuntimePlugin
  28. {
  29. public void RegisterDependencies(ObjectContainer container)
  30. {
  31. }
  32. public void RegisterCustomizations(ObjectContainer container, SpecFlow.Configuration.SpecFlowConfiguration specFlowConfiguration)
  33. {
  34. if (specFlowConfiguration.StopAtFirstError)
  35. container.RegisterTypeAs<DefaultListener, ITraceListener>();
  36. }
  37. public void RegisterConfigurationDefaults(SpecFlow.Configuration.SpecFlowConfiguration specFlowConfiguration)
  38. {
  39. }
  40. public void Initialize(RuntimePluginEvents runtimePluginEvents, RuntimePluginParameters runtimePluginParameters, UnitTestProviderConfiguration unitTestProviderConfiguration)
  41. {
  42. runtimePluginEvents.CustomizeGlobalDependencies += (sender, args) =>
  43. {
  44. if (args.SpecFlowConfiguration.StopAtFirstError)
  45. args.ObjectContainer.RegisterTypeAs<DefaultListener, ITraceListener>();
  46. };
  47. }
  48. }
  49. public class PluginWithCustomConfiguration : IRuntimePlugin
  50. {
  51. private readonly Action<SpecFlow.Configuration.SpecFlowConfiguration> specifyDefaults;
  52. public PluginWithCustomConfiguration(Action<SpecFlow.Configuration.SpecFlowConfiguration> specifyDefaults)
  53. {
  54. this.specifyDefaults = specifyDefaults;
  55. }
  56. public void Initialize(RuntimePluginEvents runtimePluginEvents, RuntimePluginParameters runtimePluginParameters, UnitTestProviderConfiguration unitTestProviderConfiguration)
  57. {
  58. runtimePluginEvents.ConfigurationDefaults += (sender, args) => { specifyDefaults(args.SpecFlowConfiguration); };
  59. }
  60. }
  61. public class PluginWithCustomTestThreadDependencies : IRuntimePlugin
  62. {
  63. private readonly Action<ObjectContainer> _specificTestRunnerDependencies;
  64. public PluginWithCustomTestThreadDependencies(Action<ObjectContainer> specificTestRunnerDependencies)
  65. {
  66. _specificTestRunnerDependencies = specificTestRunnerDependencies;
  67. }
  68. public void Initialize(RuntimePluginEvents runtimePluginEvents, RuntimePluginParameters runtimePluginParameters, UnitTestProviderConfiguration unitTestProviderConfiguration)
  69. {
  70. runtimePluginEvents.CustomizeTestThreadDependencies += (sender, args) => { _specificTestRunnerDependencies(args.ObjectContainer); };
  71. }
  72. }
  73. public class PluginWithCustomScenarioDependencies : IRuntimePlugin
  74. {
  75. private readonly Action<ObjectContainer> _specificScenarioDependencies;
  76. public PluginWithCustomScenarioDependencies(Action<ObjectContainer> specificScenarioDependencies)
  77. {
  78. _specificScenarioDependencies = specificScenarioDependencies;
  79. }
  80. public void Initialize(RuntimePluginEvents runtimePluginEvents, RuntimePluginParameters runtimePluginParameters, UnitTestProviderConfiguration unitTestProviderConfiguration)
  81. {
  82. runtimePluginEvents.CustomizeScenarioDependencies += (sender, args) => { _specificScenarioDependencies(args.ObjectContainer); };
  83. }
  84. }
  85. public class PluginWithCustomFeatureDependencies : IRuntimePlugin
  86. {
  87. private readonly Action<ObjectContainer> _specificFeatureDependencies;
  88. public PluginWithCustomFeatureDependencies(Action<ObjectContainer> specificFeatureDependencies)
  89. {
  90. _specificFeatureDependencies = specificFeatureDependencies;
  91. }
  92. public void Initialize(RuntimePluginEvents runtimePluginEvents, RuntimePluginParameters runtimePluginParameters, UnitTestProviderConfiguration unitTestProviderConfiguration)
  93. {
  94. runtimePluginEvents.CustomizeFeatureDependencies += (sender, args) => { _specificFeatureDependencies(args.ObjectContainer); };
  95. }
  96. }
  97. public interface ICustomDependency
  98. {
  99. }
  100. public class CustomDependency : ICustomDependency
  101. {
  102. }
  103. private class CustomTestRunnerFactory : ITestRunnerFactory
  104. {
  105. public ITestRunner Create(Assembly testAssembly)
  106. {
  107. throw new NotImplementedException();
  108. }
  109. }
  110. public class CustomTraceListener : ITraceListener
  111. {
  112. public void WriteTestOutput(string message)
  113. {
  114. }
  115. public void WriteToolOutput(string message)
  116. {
  117. }
  118. }
  119. private StringConfigProvider GetConfigWithPlugin()
  120. {
  121. return new StringConfigProvider(string.Format(@"<?xml version=""1.0"" encoding=""utf-8"" ?>
  122. <configuration>
  123. <specFlow>
  124. </specFlow>
  125. </configuration>"));
  126. }
  127. //[Fact]
  128. //public void Should_be_able_to_specify_a_plugin_with_parameters()
  129. //{
  130. // StringConfigProvider configurationHolder = new StringConfigProvider(string.Format(@"<?xml version=""1.0"" encoding=""utf-8"" ?>
  131. // <configuration>
  132. // <specFlow>
  133. // <plugins>
  134. // <add name=""MyCompany.MyPlugin"" parameters=""foo, bar"" />
  135. // </plugins>
  136. // </specFlow>
  137. // </configuration>"));
  138. // var pluginMock = new Mock<IRuntimePlugin>();
  139. // ContainerBuilder.DefaultDependencyProvider = new TestDefaultDependencyProvider(pluginMock.Object);
  140. // TestObjectFactories.CreateDefaultGlobalContainer(configurationHolder);
  141. // pluginMock.Verify(p => p.Initialize(It.IsAny<RuntimePluginEvents>(), It.Is<RuntimePluginParameters>(pp => pp.Parameters == "foo, bar"), It.IsAny<UnitTestProviderConfiguration>()));
  142. //}
  143. [Fact]
  144. public void Should_be_able_to_register_dependencies_from_a_plugin()
  145. {
  146. var pluginWithCustomDependency = new PluginWithCustomDependency();
  147. var runtimePluginEvents = new RuntimePluginEvents();
  148. pluginWithCustomDependency.Initialize(runtimePluginEvents, new RuntimePluginParameters(), new UnitTestProviderConfiguration());
  149. var container = new ObjectContainer();
  150. runtimePluginEvents.RaiseRegisterGlobalDependencies(container);
  151. var customDependency = container.Resolve<ICustomDependency>();
  152. customDependency.Should().BeOfType(typeof(CustomDependency));
  153. }
  154. [Fact]
  155. public void Should_be_able_to_change_default_configuration_from_a_plugin()
  156. {
  157. var pluginWithCustomConfiguration = new PluginWithCustomConfiguration(conf => conf.StopAtFirstError = true);
  158. var runtimePluginEvents = new RuntimePluginEvents();
  159. pluginWithCustomConfiguration.Initialize(runtimePluginEvents, new RuntimePluginParameters(), new UnitTestProviderConfiguration());
  160. var specFlowConfiguration = ConfigurationLoader.GetDefault();
  161. runtimePluginEvents.RaiseConfigurationDefaults(specFlowConfiguration);
  162. specFlowConfiguration.StopAtFirstError.Should().BeTrue();
  163. }
  164. [Fact]
  165. public void Should_be_able_to_register_further_dependencies_based_on_the_configuration()
  166. {
  167. var pluginWithCustomTestRunnerFactoryWhenStopAtFirstErrorIsTrue = new PluginWithTraceListenerWhenStopAtFirstErrorIsTrue();
  168. var runtimePluginEvents = new RuntimePluginEvents();
  169. pluginWithCustomTestRunnerFactoryWhenStopAtFirstErrorIsTrue.Initialize(runtimePluginEvents, new RuntimePluginParameters(), new UnitTestProviderConfiguration());
  170. var container = new ObjectContainer();
  171. var specFlowConfiguration = ConfigurationLoader.GetDefault();
  172. runtimePluginEvents.RaiseCustomizeGlobalDependencies(container, specFlowConfiguration);
  173. container.RegisterTypeAs<NullListener, ITraceListener>();
  174. specFlowConfiguration.StopAtFirstError = true;
  175. runtimePluginEvents.RaiseCustomizeGlobalDependencies(container, specFlowConfiguration);
  176. var customTestRunnerFactory = container.Resolve<ITraceListener>();
  177. customTestRunnerFactory.Should().BeOfType<DefaultListener>();
  178. }
  179. [Fact]
  180. public void Should_be_able_to_register_test_runner_dependencies_from_a_plugin()
  181. {
  182. var pluginWithCustomTestThreadDependencies = new PluginWithCustomTestThreadDependencies(oc => oc.RegisterTypeAs<CustomDependency, ICustomDependency>());
  183. var runtimePluginEvents = new RuntimePluginEvents();
  184. pluginWithCustomTestThreadDependencies.Initialize(runtimePluginEvents, new RuntimePluginParameters(), new UnitTestProviderConfiguration());
  185. var container = new ObjectContainer();
  186. runtimePluginEvents.RaiseCustomizeTestThreadDependencies(container);
  187. var customDependency = container.Resolve<ICustomDependency>();
  188. customDependency.Should().BeOfType(typeof(CustomDependency));
  189. }
  190. [Fact]
  191. public void Test_runner_dependencies_from_a_plugin_are_not_in_the_global_container()
  192. {
  193. StringConfigProvider configurationHolder = GetConfigWithPlugin();
  194. var pluginWithCustomTestThreadDependencies = new PluginWithCustomTestThreadDependencies(oc => oc.RegisterTypeAs<CustomDependency, ICustomDependency>());
  195. var runtimePluginEvents = new RuntimePluginEvents();
  196. pluginWithCustomTestThreadDependencies.Initialize(runtimePluginEvents, new RuntimePluginParameters(), new UnitTestProviderConfiguration());
  197. var container = new ObjectContainer();
  198. runtimePluginEvents.RaiseRegisterGlobalDependencies(container);
  199. Action resolveAction = () => container.Resolve<ICustomDependency>();
  200. resolveAction.Should().Throw<ObjectContainerException>();
  201. }
  202. [Fact]
  203. public void Should_be_able_to_override_test_runner_registration_from_a_plugin()
  204. {
  205. var pluginWithCustomTestThreadDependencies = new PluginWithCustomTestThreadDependencies(oc => oc.RegisterTypeAs<CustomTraceListener, ITraceListener>());
  206. var runtimePluginEvents = new RuntimePluginEvents();
  207. pluginWithCustomTestThreadDependencies.Initialize(runtimePluginEvents, new RuntimePluginParameters(), new UnitTestProviderConfiguration());
  208. var container = new ObjectContainer();
  209. runtimePluginEvents.RaiseCustomizeTestThreadDependencies(container);
  210. var traceListener = container.Resolve<ITraceListener>();
  211. traceListener.Should().BeOfType(typeof(CustomTraceListener));
  212. }
  213. [Fact]
  214. public void Should_be_able_to_register_scenario_dependencies_from_a_plugin()
  215. {
  216. StringConfigProvider configurationHolder = GetConfigWithPlugin();
  217. var pluginWithCustomScenarioDependencies = new PluginWithCustomScenarioDependencies(oc => oc.RegisterTypeAs<CustomDependency, ICustomDependency>());
  218. var runtimePluginEvents = new RuntimePluginEvents();
  219. pluginWithCustomScenarioDependencies.Initialize(runtimePluginEvents, new RuntimePluginParameters(), new UnitTestProviderConfiguration());
  220. var container = new ObjectContainer();
  221. runtimePluginEvents.RaiseCustomizeScenarioDependencies(container);
  222. var customDependency = container.Resolve<ICustomDependency>();
  223. customDependency.Should().BeOfType(typeof(CustomDependency));
  224. }
  225. [Fact]
  226. public void Should_be_able_to_register_feature_dependencies_from_a_plugin()
  227. {
  228. StringConfigProvider configurationHolder = GetConfigWithPlugin();
  229. var testDefaultDependencyProvider = new TestDefaultDependencyProvider(new PluginWithCustomFeatureDependencies(oc => oc.RegisterTypeAs<CustomDependency, ICustomDependency>()));
  230. var container = TestObjectFactories.CreateDefaultFeatureContainer(configurationHolder, testDefaultDependencyProvider);
  231. var customDependency = container.Resolve<ICustomDependency>();
  232. customDependency.Should().BeOfType(typeof(CustomDependency));
  233. }
  234. }
  235. class TestDefaultDependencyProvider : DefaultDependencyProvider
  236. {
  237. private readonly IRuntimePlugin _pluginToReturn;
  238. public TestDefaultDependencyProvider(IRuntimePlugin pluginToReturn)
  239. {
  240. _pluginToReturn = pluginToReturn;
  241. }
  242. public override void RegisterGlobalContainerDefaults(BoDi.ObjectContainer container)
  243. {
  244. base.RegisterGlobalContainerDefaults(container);
  245. var runtimePluginLocator = new Mock<IRuntimePluginLocator>();
  246. runtimePluginLocator.Setup(m => m.GetAllRuntimePlugins()).Returns(new List<string>() { "aPlugin" });
  247. runtimePluginLocator.Setup(m => m.GetAllRuntimePlugins(It.IsAny<string>())).Returns(new List<string>() { "aPlugin" });
  248. var pluginLoaderStub = new Mock<IRuntimePluginLoader>();
  249. var traceListener = container.Resolve<ITraceListener>();
  250. pluginLoaderStub.Setup(pl => pl.LoadPlugin(It.IsAny<string>(), traceListener)).Returns(_pluginToReturn);
  251. container.RegisterInstanceAs<IRuntimePluginLocator>(runtimePluginLocator.Object);
  252. container.RegisterInstanceAs<IRuntimePluginLoader>(pluginLoaderStub.Object);
  253. }
  254. }
  255. }