Welcome to mirror list, hosted at ThFree Co, Russian Federation.

AsyncWorkQueueTests.cs « Xamarin.PropertyEditing.Tests - github.com/xamarin/Xamarin.PropertyEditing.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: fa1e70ffcf25c710daf68a3111726dad64993b62 (plain)
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
123
124
125
126
127
128
using System;
using System.Threading;
using System.Threading.Tasks;
using NUnit.Framework;

namespace Xamarin.PropertyEditing.Tests
{
	[TestFixture]
	internal class AsyncWorkQueueTests
	{
		[SetUp]
		public void Setup ()
		{
			this.queue = new AsyncWorkQueue();
		}

		[Test, Timeout (1000)]
		public async Task FirstRequestIsCompleted ()
		{
			object requester = new object();
			await this.queue.RequestAsyncWork (requester);
		}

		[Test, Timeout (1000)]
		public async Task WorkContinuesOnDispose ()
		{
			object requester1 = new object();
			object requester2 = new	object();

			IDisposable work = await this.queue.RequestAsyncWork (requester1);
			Task<IDisposable> work2 = this.queue.RequestAsyncWork (requester2);

			work.Dispose();
			await work2;
			work2.Dispose();
		}

		[Test, Timeout (1000)]
		public async Task SameRequesterDoesntWait ()
		{
			object requester = new object();
			IDisposable work = await this.queue.RequestAsyncWork (requester);
			// If this was not safe to call from the same requester, the test should stop here and timeout
			IDisposable work2 = await this.queue.RequestAsyncWork (requester);

			work.Dispose();
			work2.Dispose();
		}

		[Test, Timeout (1000)]
		[Description ("Worker siblings added while their requester isn't active should ALL unlock when their requester becomes active")]
		public async Task SameRequesterAfterNonSameIsFreed ()
		{
			object requester1 = new object();
			object requester2 = new object();

			IDisposable work = await this.queue.RequestAsyncWork (requester1);
			
			var inWorkTask = this.queue.RequestAsyncWork (requester2);
			Assume.That (inWorkTask.IsCompleted, Is.False);
			var inWork2Task = this.queue.RequestAsyncWork (requester2);
			Assume.That (inWork2Task.IsCompleted, Is.False);

			work.Dispose();
			(await inWorkTask).Dispose();
			(await inWork2Task).Dispose();
		}

		[Test, Timeout (1000)]
		public async Task WorkContinuesOnDisposeOfParentAndChild ()
		{
			string requester1 = "r1";

			IDisposable parent = await this.queue.RequestAsyncWork (requester1);
			IDisposable child = await this.queue.RequestAsyncWork (requester1);

			string requester2 = "r2";
			Task work2 = this.queue.RequestAsyncWork (requester2);
			Assume.That (work2.IsCompleted, Is.False);

			child.Dispose();
			Assert.That (work2.IsCompleted, Is.False);

			parent.Dispose();
			await work2;
		}

		[Test, Timeout (1000)]
		public async Task WorkContinuesOnDisposeOfParentAndChildInterspersed ()
		{
			object requester1 = new object();
			IDisposable parent = await this.queue.RequestAsyncWork (requester1);

			object requester2 = new object();
			Task work2 = this.queue.RequestAsyncWork (requester2);
			Assume.That (work2.IsCompleted, Is.False);

			IDisposable child = await this.queue.RequestAsyncWork (requester1);

			child.Dispose();
			Assert.That (work2.IsCompleted, Is.False);

			parent.Dispose();
			await work2;
		}

		[Test, Timeout (1000)]
		public async Task WorkContinuesOnDisposeOfParentAndChildInterspersed2 ()
		{
			object requester1 = new object();
			IDisposable parent = await this.queue.RequestAsyncWork (requester1);

			object requester2 = new object();
			Task work2 = this.queue.RequestAsyncWork (requester2);
			Assume.That (work2.IsCompleted, Is.False);

			IDisposable child = await this.queue.RequestAsyncWork (requester1);

			parent.Dispose();
			Assert.That (work2.IsCompleted, Is.False);

			child.Dispose();
			await work2;
		}

		private AsyncWorkQueue queue;
	}
}