forked from hardkoded/puppeteer-sharp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TaskQueueTests.cs
88 lines (71 loc) · 2.58 KB
/
TaskQueueTests.cs
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;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using PuppeteerSharp.Helpers;
using Xunit;
namespace PuppeteerSharp.Tests.UtilitiesTests
{
public class TaskQueueTests
{
[Fact]
public void ShouldDisposeSemaphoreWhenDisposing()
{
var taskQueue = new TaskQueue();
taskQueue.Dispose();
var semaphore = GetSemaphore(taskQueue);
Assert.Throws<ObjectDisposedException>(() => semaphore.AvailableWaitHandle);
}
[Fact]
public void ShouldNotThrowWhenDisposingMultipleTimes()
{
var taskQueue = new TaskQueue();
taskQueue.Dispose();
// Can safely be disposed a second time
taskQueue.Dispose();
}
[Fact]
public async Task ShouldDisposeSemaphoreWhenDisposingAsync()
{
var taskQueue = new TaskQueue();
await taskQueue.DisposeAsync().ConfigureAwait(false);
var semaphore = GetSemaphore(taskQueue);
Assert.Throws<ObjectDisposedException>(() => semaphore.AvailableWaitHandle);
}
[Fact]
public async Task ShouldNotThrowWhenDisposingMultipleTimesAsync()
{
var taskQueue = new TaskQueue();
await taskQueue.DisposeAsync().ConfigureAwait(false);
// Can safely be disposed a second time
await taskQueue.DisposeAsync().ConfigureAwait(false);
}
[Fact]
public async Task CanDisposeWhileSemaphoreIsHeld()
{
var taskQueue = new TaskQueue();
await taskQueue.Enqueue(() =>
{
taskQueue.Dispose();
return Task.CompletedTask;
});
var semaphore = GetSemaphore(taskQueue);
Assert.Throws<ObjectDisposedException>(() => semaphore.AvailableWaitHandle);
taskQueue.Dispose();
}
[Fact]
public async Task CanDisposeWhileSemaphoreIsHeldAsync()
{
var taskQueue = new TaskQueue();
await taskQueue.Enqueue(async () =>
{
await taskQueue.DisposeAsync();
});
var semaphore = GetSemaphore(taskQueue);
Assert.Throws<ObjectDisposedException>(() => semaphore.AvailableWaitHandle);
await taskQueue.DisposeAsync();
}
private static SemaphoreSlim GetSemaphore(TaskQueue queue) =>
(SemaphoreSlim)typeof(TaskQueue).GetField("_semaphore", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(queue);
}
}