-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMessageHandlerTest.cs
More file actions
122 lines (106 loc) · 4.25 KB
/
Copy pathMessageHandlerTest.cs
File metadata and controls
122 lines (106 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using AsyncMessageHandler;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
namespace UnitTestExample
{
public class MessageHandlerTest
{
private class TestMessage : Message
{
public int TestId;
public int TestDelay;
public TestMessage(int id, int delay)
{
TestId = id;
TestDelay = delay;
}
}
private class BadMessage : TestMessage
{
public BadMessage(int id, int delay) : base(id, delay)
{
}
}
private class BadMessageException : Exception { }
[Fact]
public void TestUnordered()
{
var tasks = CreateAndWaitMessages(MessageHandlingMode.Unordered, out var completionOrder);
//We should have 4 completed tasks, since #4 should have failed
Assert.Equal(4, completionOrder.Count);
//Task #4 should have failed
Assert.IsType<BadMessageException>(tasks[3].Exception.InnerException);
//The order of completion should be 2, 5, 3, 1
Assert.Equal(2, completionOrder[0].TestId);
Assert.Equal(5, completionOrder[1].TestId);
Assert.Equal(3, completionOrder[2].TestId);
Assert.Equal(1, completionOrder[3].TestId);
}
[Fact]
public void TestOrderedAbortAllOnAnyFailure()
{
var tasks = CreateAndWaitMessages(MessageHandlingMode.OrderedAbortAllOnAnyFailure, out var completionOrder);
//We should have 3 completed tasks, since #4 should have failed
//and #5 should not execute
Assert.Equal(3, completionOrder.Count);
//Task #4 should have failed
Assert.IsType<BadMessageException>(tasks[3].Exception?.GetBaseException());
//The order of completion should be 1, 2, 3
Assert.Equal(1, completionOrder[0].TestId);
Assert.Equal(2, completionOrder[1].TestId);
Assert.Equal(3, completionOrder[2].TestId);
}
[Fact]
public void TestOrderedContinueOnAnyFailure()
{
var tasks = CreateAndWaitMessages(MessageHandlingMode.OrderedContinueOnAnyFailure, out var completionOrder);
//We should have 4 completed tasks, since #4 should have failed
Assert.Equal(4, completionOrder.Count);
//Task #4 should have failed
Assert.IsType<BadMessageException>(tasks[3].Exception?.GetBaseException());
//The order of completion should be 1, 2, 3
Assert.Equal(1, completionOrder[0].TestId);
Assert.Equal(2, completionOrder[1].TestId);
Assert.Equal(3, completionOrder[2].TestId);
Assert.Equal(5, completionOrder[3].TestId);
}
private static List<Task> CreateAndWaitMessages(MessageHandlingMode mode, out List<TestMessage> completionOrder)
{
completionOrder = new List<TestMessage>();
var completionOrder2 = completionOrder;
var messageHandler = new MessageHandler(
mode,
async (message) =>
{
if (message is BadMessage)
{
throw new BadMessageException();
}
if (message is TestMessage testMessage)
{
await Task.Delay(testMessage.TestDelay);
completionOrder2.Add(testMessage);
}
});
var tasks = new List<Task>() {
messageHandler.HandleAsync(new TestMessage(1, 3000)),
messageHandler.HandleAsync(new TestMessage(2, 0)),
messageHandler.HandleAsync(new TestMessage(3, 2000)),
messageHandler.HandleAsync(new BadMessage(4, 0)),
messageHandler.HandleAsync(new TestMessage(5, 1000)),
};
//just wait for the tasks but don't throw exceptions
foreach (var task in tasks)
{
try
{
Task.WaitAll(task);
}
catch { }
}
return tasks;
}
}
}