-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathNamedLockTests.cs
More file actions
88 lines (58 loc) · 3.01 KB
/
NamedLockTests.cs
File metadata and controls
88 lines (58 loc) · 3.01 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
using System.Collections.Concurrent;
using MathCore.Threading;
namespace MathCore.Tests.Threading;
[TestClass]
public class NamedLockTests
{
public TestContext TestContext { get; set; }
[TestMethod, Timeout(10000, CooperativeCancellation = true), Ignore]
public async Task MultipleAccessTest()
{
const string resource_name = "test";
var resource_lock = new NamedLock();
var result_list = new ConcurrentList<string>();
var start_action = new ManualResetEvent(false);
var access_task1 = Task.Run(async () =>
{
start_action.WaitOne();
await resource_lock.LockAsync(resource_name, TestContext.CancellationToken);
await Task.Delay(200, TestContext.CancellationToken).ConfigureAwait(false);
result_list.Add("R-1.0");
await Task.Delay(200, TestContext.CancellationToken).ConfigureAwait(false);
result_list.Add("R-1.1");
await Task.Delay(200, TestContext.CancellationToken).ConfigureAwait(false);
result_list.Add("R-1.2");
await resource_lock.UnlockAsync(resource_name, TestContext.CancellationToken);
}, TestContext.CancellationToken);
var access_task2 = Task.Run(async () =>
{
start_action.WaitOne();
await Task.Delay(500, TestContext.CancellationToken).ConfigureAwait(false);
await resource_lock.LockAsync(resource_name, TestContext.CancellationToken);
await Task.Delay(50, TestContext.CancellationToken).ConfigureAwait(false);
result_list.Add("R-2.0");
await Task.Delay(50, TestContext.CancellationToken).ConfigureAwait(false);
result_list.Add("R-2.1");
await Task.Delay(50, TestContext.CancellationToken).ConfigureAwait(false);
result_list.Add("R-2.2");
await resource_lock.UnlockAsync(resource_name, TestContext.CancellationToken);
}, TestContext.CancellationToken);
var access_task3 = Task.Run(async () =>
{
start_action.WaitOne();
await Task.Delay(50, TestContext.CancellationToken).ConfigureAwait(false);
await resource_lock.LockAsync(resource_name, TestContext.CancellationToken);
await Task.Delay(300, TestContext.CancellationToken).ConfigureAwait(false);
result_list.Add("R-3.0");
await Task.Delay(300, TestContext.CancellationToken).ConfigureAwait(false);
result_list.Add("R-3.1");
await Task.Delay(300, TestContext.CancellationToken).ConfigureAwait(false);
result_list.Add("R-3.2");
await resource_lock.UnlockAsync(resource_name, TestContext.CancellationToken);
}, TestContext.CancellationToken);
start_action.Set();
await Task.WhenAll(access_task1, access_task2, access_task3).ConfigureAwait(false);
var result = result_list.JoinStrings("; ");
result.AssertEquals("R-1.0; R-1.1; R-1.2; R-3.0; R-3.1; R-3.2; R-2.0; R-2.1; R-2.2");
}
}