Skip to content

Commit

Permalink
#225 Refactored IntegrationContext to have IExecutionTimer
Browse files Browse the repository at this point in the history
  • Loading branch information
Suremaker committed Feb 27, 2021
1 parent 3fc3468 commit b94b6a7
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 28 deletions.
8 changes: 7 additions & 1 deletion src/LightBDD.Core/Execution/IExecutionTimer.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
namespace LightBDD.Core.Execution
{
interface IExecutionTimer
/// <summary>
/// Execution timer interface.
/// </summary>
public interface IExecutionTimer
{
/// <summary>
/// Returns current execution time.
/// </summary>
EventTime GetTime();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,19 @@ internal class RunnableScenarioContext
public object FixtureObject { get; }
public ProvideStepsFunc StepsProvider { get; }
public IProgressNotifier ProgressNotifier => IntegrationContext.ProgressNotifier;
public IExecutionTimer ExecutionTimer { get; }
public IExecutionTimer ExecutionTimer => IntegrationContext.ExecutionTimer;

public RunnableScenarioContext(IntegrationContext integrationContext,
ExceptionProcessor exceptionProcessor,
Action<IScenarioResult> onScenarioFinished,
object fixtureObject,
ProvideStepsFunc stepsProvider,
IExecutionTimer executionTimer)
ProvideStepsFunc stepsProvider)
{
IntegrationContext = integrationContext;
ExceptionProcessor = exceptionProcessor;
OnScenarioFinished = onScenarioFinished;
FixtureObject = fixtureObject;
StepsProvider = stepsProvider;
ExecutionTimer = executionTimer;
}
}
}
6 changes: 1 addition & 5 deletions src/LightBDD.Core/Extensibility/FeatureRunnerRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using LightBDD.Core.Execution;
using LightBDD.Core.Execution.Implementation;
using LightBDD.Core.Extensibility.Implementation;

namespace LightBDD.Core.Extensibility
Expand All @@ -17,8 +15,6 @@ public class FeatureRunnerRepository : IDisposable
{
private readonly IntegrationContext _integrationContext;
private readonly ConcurrentDictionary<Type, Lazy<IFeatureRunner>> _runners = new ConcurrentDictionary<Type, Lazy<IFeatureRunner>>();
//TODO: move
private readonly IExecutionTimer _executionTimer = DefaultExecutionTimer.StartNew();

/// <summary>
/// Constructor instantiating factory with specified runner context.
Expand All @@ -43,7 +39,7 @@ public IFeatureRunner GetRunnerFor(Type featureType)

var lazyRunnerFor = _runners.GetOrAdd(
featureType,
type => new Lazy<IFeatureRunner>(() => new FeatureRunner(type, _integrationContext, _executionTimer), LazyThreadSafetyMode.ExecutionAndPublication));
type => new Lazy<IFeatureRunner>(() => new FeatureRunner(type, _integrationContext), LazyThreadSafetyMode.ExecutionAndPublication));

return lazyRunnerFor.Value;
}
Expand Down
10 changes: 4 additions & 6 deletions src/LightBDD.Core/Extensibility/Implementation/FeatureRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,18 @@ internal class FeatureRunner : IFeatureRunner
{
private readonly FeatureResult _featureResult;
private readonly IntegrationContext _integrationContext;
private readonly IExecutionTimer _executionTimer;
private readonly Type _featureType;
private bool _disposed;
private readonly ExceptionProcessor _exceptionProcessor;

public FeatureRunner(Type featureType, IntegrationContext integrationContext, IExecutionTimer executionTimer)
public FeatureRunner(Type featureType, IntegrationContext integrationContext)
{
_featureType = featureType;
_integrationContext = integrationContext;
_executionTimer = executionTimer;
_exceptionProcessor = new ExceptionProcessor(_integrationContext);
_featureResult = new FeatureResult(_integrationContext.MetadataProvider.GetFeatureInfo(featureType));

integrationContext.ProgressNotifier.Notify(new FeatureStarting(executionTimer.GetTime(), _featureResult.Info));
integrationContext.ProgressNotifier.Notify(new FeatureStarting(integrationContext.ExecutionTimer.GetTime(), _featureResult.Info));
}

public IFeatureFixtureRunner ForFixture(object fixture)
Expand All @@ -42,7 +40,7 @@ public IFeatureFixtureRunner ForFixture(object fixture)
private ICoreScenarioBuilder CreateScenarioRunner(object fixture)
{
VerifyDisposed();
return new ScenarioBuilder(_featureResult.Info, fixture, _integrationContext, _exceptionProcessor, _featureResult.AddScenario, _executionTimer);
return new ScenarioBuilder(_featureResult.Info, fixture, _integrationContext, _exceptionProcessor, _featureResult.AddScenario);
}

private void VerifyDisposed()
Expand All @@ -55,7 +53,7 @@ public void Dispose()
{
if (_disposed) return;
_disposed = true;
_integrationContext.ProgressNotifier.Notify(new FeatureFinished(_executionTimer.GetTime(), _featureResult));
_integrationContext.ProgressNotifier.Notify(new FeatureFinished(_integrationContext.ExecutionTimer.GetTime(), _featureResult));
}
public IFeatureResult GetFeatureResult()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ internal class ScenarioBuilder : ICoreScenarioBuilder
private IEnumerable<IScenarioDecorator> _scenarioDecorators = Enumerable.Empty<IScenarioDecorator>();

public ScenarioBuilder(IFeatureInfo featureInfo, object fixture, IntegrationContext integrationContext,
ExceptionProcessor exceptionProcessor, Action<IScenarioResult> onScenarioFinished, IExecutionTimer executionTimer)
ExceptionProcessor exceptionProcessor, Action<IScenarioResult> onScenarioFinished)
{
_featureInfo = featureInfo;
_context = new RunnableScenarioContext(
integrationContext,
exceptionProcessor,
onScenarioFinished,
fixture,
ProvideSteps, executionTimer);
ProvideSteps);
}

public ICoreScenarioBuilder AddSteps(IEnumerable<StepDescriptor> steps)
Expand Down
7 changes: 7 additions & 0 deletions src/LightBDD.Core/Extensibility/IntegrationContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
using LightBDD.Core.Notification;
using LightBDD.Core.Results;
using System;
using LightBDD.Core.Execution;
using LightBDD.Core.Execution.Implementation;
using LightBDD.Core.Formatting.Values;
using LightBDD.Core.Notification.Implementation;

Expand Down Expand Up @@ -71,6 +73,11 @@ public abstract class IntegrationContext
/// </summary>
public abstract ValueFormattingService ValueFormattingService { get; }

/// <summary>
/// Returns execution timer.
/// </summary>
public IExecutionTimer ExecutionTimer { get; } = DefaultExecutionTimer.StartNew();

/// <summary>
/// Creates progress notifier.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using LightBDD.Core.Execution;
using LightBDD.Core.Extensibility;
using LightBDD.Core.Results;
using LightBDD.Framework;
Expand All @@ -17,13 +17,16 @@ public class CoreBddRunner_time_measurement_tests
private IBddRunner _runner;
private static readonly TimeSpan UtcNowClockPrecision = TimeSpan.FromMilliseconds(30);
private IFeatureRunner _feature;
private IExecutionTimer _timer;

#region Setup/Teardown

[SetUp]
public void SetUp()
{
_feature = TestableFeatureRunnerRepository.GetRunner(GetType());
var repo = new TestableFeatureRunnerRepository();
_timer = repo.Context.ExecutionTimer;
_feature = repo.GetRunnerFor(GetType());
_runner = _feature.GetBddRunner(this);
}

Expand All @@ -49,23 +52,24 @@ public void It_should_capture_execution_time_for_composite_steps()

private void AssertScenarioExecutionTime(Action runScenario)
{
var startTime = DateTimeOffset.UtcNow;
var watch = Stopwatch.StartNew();
var start = _timer.GetTime();
try { runScenario(); }
catch { }
watch.Stop();

var stop = _timer.GetTime();
var executionTime = stop.GetExecutionTime(start);

var result = _feature.GetFeatureResult().GetScenarios().Single();

FormatTime("Measure time", new ExecutionTime(startTime, watch.Elapsed));
FormatTime("Measure time", executionTime);
FormatTime("Scenario time", result.ExecutionTime);

Assert.That(result.ExecutionTime, Is.Not.Null);
Assert.That(result.ExecutionTime.Duration, Is.LessThanOrEqualTo(watch.Elapsed), "Scenario.ExecutionTime.Duration");
Assert.That(result.ExecutionTime.Duration, Is.LessThanOrEqualTo(executionTime.Duration), "Scenario.ExecutionTime.Duration");
Assert.That(result.ExecutionTime.Start, Is
.GreaterThanOrEqualTo(startTime)
.GreaterThanOrEqualTo(start.Time)
.And
.LessThan(startTime.Add(watch.Elapsed).Add(UtcNowClockPrecision)), "Scenario.ExecutionTime.Start");
.LessThan(executionTime.End.Add(UtcNowClockPrecision)), "Scenario.ExecutionTime.Start");

AssertStepsExecutionTimesAreDoneInOrder();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,14 @@ public TestableFeatureRunnerRepository(IProgressNotifier progressNotifier)
}

public TestableFeatureRunnerRepository(TestableIntegrationContextBuilder contextBuilder)
: base(contextBuilder.Build()) { }
: this(contextBuilder.Build()) { }

private TestableFeatureRunnerRepository(IntegrationContext context) : base(context)
{
Context = context;
}

public IntegrationContext Context { get; }

public static IFeatureRunner GetRunner(Type featureType)
{
Expand Down

0 comments on commit b94b6a7

Please sign in to comment.