145
|
1 using System;
|
|
2 using Implab.Parallels;
|
|
3
|
|
4 #if MONO
|
|
5
|
|
6 using NUnit.Framework;
|
|
7 using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
|
|
8 using TestMethodAttribute = NUnit.Framework.TestAttribute;
|
|
9
|
|
10 #else
|
|
11
|
|
12 using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
13
|
|
14 #endif
|
|
15
|
|
16 namespace Implab.Test {
|
|
17 [TestClass]
|
|
18 public class CancelationTests {
|
|
19
|
|
20 [TestMethod]
|
|
21 public void PromiseCancelTest() {
|
|
22 var p = new Promise();
|
|
23 bool requested = false;
|
|
24 var reason = new Exception("Test");
|
|
25
|
|
26 // request cancelation
|
|
27 p.Cancel(reason);
|
|
28
|
|
29 Assert.IsTrue(p.IsCancellationRequested);
|
|
30 Assert.AreSame(reason, p.CancellationReason);
|
|
31 Assert.IsFalse(p.IsCancelled);
|
|
32
|
|
33 p.CancellationRequested(r => {
|
|
34 Assert.AreSame(reason, r);
|
|
35 requested = true;
|
|
36 });
|
|
37
|
|
38 Assert.IsTrue(requested);
|
|
39
|
|
40 // cancel the promise
|
|
41 Assert.IsTrue(p.CancelOperationIfRequested());
|
|
42 Assert.IsTrue(p.IsCancelled);
|
|
43 Assert.AreSame(reason, p.Error);
|
|
44 }
|
|
45
|
|
46 [TestMethod]
|
|
47 public void CancelActionBeforeStartTask() {
|
|
48 bool run = false;
|
|
49 var task = new ActionTask(() => {
|
|
50 run = true;
|
|
51 }, null, null);
|
|
52
|
|
53 // request cancelation
|
|
54 task.Cancel();
|
|
55 Assert.IsTrue(task.IsCancelled);
|
|
56 task.Resolve();
|
|
57 Assert.IsFalse(run);
|
|
58 }
|
|
59
|
|
60 [TestMethod]
|
|
61 public void CancelActionAfterTaskStarted() {
|
|
62 var finish = new Signal();
|
|
63 var started = new Signal();
|
|
64
|
|
65 var task = new ActionTask(() => {
|
|
66 started.Set();
|
|
67 finish.Wait();
|
|
68 }, null, null);
|
|
69
|
|
70 AsyncPool.RunThread(() => {
|
|
71 task.Resolve();
|
|
72 });
|
|
73
|
|
74 started.Wait(1000);
|
|
75
|
|
76 task.Cancel();
|
|
77 Assert.IsTrue(task.IsCancellationRequested);
|
|
78 Assert.IsFalse(task.IsCancelled);
|
|
79 Assert.IsFalse(task.IsResolved);
|
|
80
|
|
81 finish.Set();
|
|
82 task.Join(1000);
|
|
83
|
|
84 }
|
|
85
|
|
86 [TestMethod]
|
|
87 public void CancelTaskChainFromBottom() {
|
|
88 var check1 = new Signal();
|
|
89 var requested = false;
|
|
90 var p1 = AsyncPool.RunThread(token => {
|
|
91 token.CancellationRequested(reason => requested = true);
|
|
92 check1.Wait();
|
|
93 token.CancelOperationIfRequested();
|
|
94 });
|
|
95
|
|
96 var p2 = p1.Then(() => {
|
|
97 });
|
|
98
|
|
99 Assert.IsFalse(p1.IsResolved);
|
|
100 Assert.IsFalse(p2.IsResolved);
|
|
101
|
|
102 p2.Cancel();
|
|
103
|
|
104 Assert.IsFalse(p2.IsCancelled);
|
|
105 Assert.IsFalse(p1.IsCancelled);
|
|
106 Assert.IsTrue(requested);
|
|
107
|
|
108 check1.Set();
|
|
109
|
|
110 try {
|
|
111 p2.Join(1000);
|
|
112 Assert.Fail("The chain isn't cancelled");
|
|
113 } catch(OperationCanceledException){
|
|
114 }
|
|
115
|
|
116 Assert.IsTrue(p1.IsCancelled);
|
|
117 Assert.IsTrue(p2.IsCancelled);
|
|
118 }
|
|
119
|
|
120
|
|
121
|
|
122 [TestMethod]
|
|
123 public void CancellableAsyncTask() {
|
|
124 var finish = new Signal();
|
|
125 var started = new Signal();
|
|
126
|
|
127 var p = AsyncPool.RunThread(token => {
|
|
128 token.CancellationRequested(r => finish.Set());
|
|
129 started.Set();
|
|
130 finish.Wait();
|
|
131 Assert.IsTrue(token.CancelOperationIfRequested());
|
|
132 });
|
|
133
|
|
134 started.Wait(1000);
|
|
135 Assert.IsFalse(p.IsResolved);
|
|
136 p.Cancel();
|
|
137 try {
|
|
138 p.Join(1000);
|
|
139 } catch (OperationCanceledException) {
|
|
140 }
|
|
141 }
|
|
142 }
|
|
143 }
|
|
144
|