• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lucaslorentz / durabletask-extensions / 9336995150

02 Jun 2024 08:43AM UTC coverage: 81.967% (+0.03%) from 81.942%
9336995150

push

github

lucaslorentz
Update to EF Core 8

6 of 6 new or added lines in 1 file covered. (100.0%)

2350 of 2867 relevant lines covered (81.97%)

139.01 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

67.74
/src/LLL.DurableTask.Worker/Activities/MethodTaskActivity.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Reflection;
4
using System.Runtime.ExceptionServices;
5
using System.Threading.Tasks;
6
using DurableTask.Core;
7
using DurableTask.Core.Serializing;
8
using LLL.DurableTask.Core.Serializing;
9
using Newtonsoft.Json.Linq;
10

11
namespace LLL.DurableTask.Worker.Orchestrations;
12

13
public class MethodTaskActivity : TaskActivity
14
{
15
    private readonly MethodInfo _methodInfo;
16
    private readonly DataConverter _dataConverter;
17

18
    public MethodTaskActivity(
10✔
19
        object instance,
10✔
20
        MethodInfo methodInfo)
10✔
21
    {
22
        Instance = instance;
10✔
23
        _methodInfo = methodInfo;
10✔
24
        _dataConverter = new TypelessJsonDataConverter();
10✔
25
    }
26

27
    public object Instance { get; }
10✔
28

29
    public override string Run(TaskContext context, string input)
30
    {
31
        throw new NotImplementedException();
×
32
    }
33

34
    public override async Task<string> RunAsync(TaskContext context, string input)
35
    {
36
        var parameters = PrepareParameters(input, new Dictionary<Type, Func<object>>
10✔
37
        {
10✔
38
            [typeof(TaskContext)] = () => context
10✔
39
        });
10✔
40

41
        try
42
        {
43
            var result = _methodInfo.Invoke(Instance, parameters);
10✔
44
            return await SerializeResult(result);
9✔
45
        }
46
        catch (TargetInvocationException ex)
47
        {
48
            ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
1✔
49
            throw;
×
50
        }
51
    }
52

53
    private object[] PrepareParameters(
54
        string input,
55
        Dictionary<Type, Func<object>> factories)
56
    {
57
        var jsonParameters = _dataConverter.Deserialize<JToken[]>(input);
10✔
58

59
        var inputPosition = 0;
10✔
60

61
        var parameters = new List<object>();
10✔
62

63
        foreach (var parameter in _methodInfo.GetParameters())
20✔
64
        {
65
            object value;
66

67
            if (factories.TryGetValue(parameter.ParameterType, out var factory))
×
68
            {
69
                value = factory();
×
70
            }
71
            else if (inputPosition < jsonParameters.Length)
×
72
            {
73
                value = jsonParameters[inputPosition++].ToObject(parameter.ParameterType);
×
74
            }
75
            else if (parameter.IsOptional)
×
76
            {
77
                value = parameter.DefaultValue;
×
78
            }
79
            else
80
                throw new Exception($"Activity expects at least {inputPosition + 1} parameters but {jsonParameters.Length} were provided.");
×
81

82
            parameters.Add(value);
×
83
        }
84

85
        return parameters.ToArray();
10✔
86
    }
87

88
    private async Task<string> SerializeResult(object result)
89
    {
90
        if (result is Task task)
9✔
91
        {
92
            if (_methodInfo.ReturnType.IsGenericType)
7✔
93
            {
94
                result = await (dynamic)task;
95
            }
96
            else
97
            {
98
                await task;
99
                result = null;
100
            }
101
        }
102

103
        var serializedResult = _dataConverter.Serialize(result);
104

105
        return serializedResult;
106
    }
107
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc