Mercurial > pub > ImplabNet
comparison Implab.Test/CancelationTests.cs @ 145:706fccb85524 v2
RC: cancellation support for promises + tests
| author | cin |
|---|---|
| date | Sun, 08 Mar 2015 02:52:27 +0300 |
| parents | |
| children | eb793fbbe4ea |
comparison
equal
deleted
inserted
replaced
| 144:8c0b95069066 | 145:706fccb85524 |
|---|---|
| 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 |
