< Summary

Information
Class: Elsa.Testing.Shared.Services.SignalManager
Assembly: Elsa.Testing.Shared.Component
File(s): /home/runner/work/elsa-core/elsa-core/src/common/Elsa.Testing.Shared.Component/Services/SignalManager.cs
Line coverage
86%
Covered lines: 20
Uncovered lines: 3
Coverable lines: 23
Total lines: 51
Line coverage: 86.9%
Branch coverage
66%
Covered branches: 4
Total branches: 6
Branch coverage: 66.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
WaitAsync()50%2280%
WaitAsync()50%2281.81%
Trigger(...)100%22100%
GetOrCreate(...)100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/common/Elsa.Testing.Shared.Component/Services/SignalManager.cs

#LineLine coverage
 1using System.Collections.Concurrent;
 2
 3namespace Elsa.Testing.Shared.Services;
 4
 5public class SignalManager
 6{
 17    private readonly ConcurrentDictionary<object, TaskCompletionSource<object?>> _signals = new();
 8
 9    public async Task<T> WaitAsync<T>(object signal, int millisecondsTimeout = 60000)
 10    {
 3311        var result = await WaitAsync(signal, millisecondsTimeout);
 12
 3313        if(result is not T typedResult)
 014            throw new InvalidCastException($"Signal '{signal}' was not of type '{typeof(T).Name}'.");
 15
 3316        return typedResult;
 3317    }
 18
 19    public async Task<object?> WaitAsync(object signal, int millisecondsTimeout = 60000)
 20    {
 3321        var taskCompletionSource = GetOrCreate(signal);
 3322        using var cancellationTokenSource = new CancellationTokenSource(millisecondsTimeout);
 3323        var delayTask = Task.Delay(millisecondsTimeout, cancellationTokenSource.Token);
 3324        var completedTask = await Task.WhenAny(taskCompletionSource.Task, delayTask);
 25
 3326        if (completedTask == delayTask)
 27        {
 028            _signals.TryRemove(signal, out _);
 029            throw new TimeoutException($"Signal '{signal}' timed out after {millisecondsTimeout} milliseconds.");
 30        }
 31
 3332        cancellationTokenSource.Cancel();
 3333        _signals.TryRemove(signal, out _);
 3334        return await taskCompletionSource.Task;
 3335    }
 36
 37    public void Trigger(object signal, object? result = null)
 38    {
 7139        var taskCompletionSource = GetOrCreate(signal);
 40
 7141        if (taskCompletionSource.Task.IsCompleted)
 1142            return;
 43
 6044        taskCompletionSource.SetResult(result);
 6045    }
 46
 47    private TaskCompletionSource<object?> GetOrCreate(object eventName)
 48    {
 16449        return _signals.GetOrAdd(eventName, _ => new(TaskCreationOptions.RunContinuationsAsynchronously));
 50    }
 51}