GreedyTest.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. // GreedyTest.cs
  2. //
  3. // Copyright (c) 2012 Petr Onderka
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. using System;
  23. using System.Threading.Tasks.Dataflow;
  24. using NUnit.Framework;
  25. namespace MonoTests.System.Threading.Tasks.Dataflow {
  26. [TestFixture]
  27. public class GreedyTest {
  28. [Test]
  29. public void GreedyJoinTest ()
  30. {
  31. var scheduler = new TestScheduler ();
  32. var block =
  33. new JoinBlock<int, int> (new GroupingDataflowBlockOptions
  34. { TaskScheduler = scheduler });
  35. var source1 =
  36. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  37. var source2 =
  38. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  39. Assert.IsNotNull (source1.LinkTo (block.Target1));
  40. Assert.IsNotNull (source2.LinkTo (block.Target2));
  41. Assert.IsTrue (source1.Post (1));
  42. scheduler.ExecuteAll ();
  43. int i;
  44. Assert.IsFalse (source1.TryReceive (out i));
  45. Assert.IsTrue (source2.Post (11));
  46. scheduler.ExecuteAll ();
  47. Assert.IsFalse (source2.TryReceive (out i));
  48. Tuple<int, int> tuple;
  49. Assert.IsTrue (block.TryReceive (out tuple));
  50. Assert.AreEqual (Tuple.Create (1, 11), tuple);
  51. }
  52. [Test]
  53. public void GreedyJoin3Test ()
  54. {
  55. var scheduler = new TestScheduler ();
  56. var block =
  57. new JoinBlock<int, int, int> (new GroupingDataflowBlockOptions
  58. { TaskScheduler = scheduler });
  59. var source1 =
  60. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  61. var source2 =
  62. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  63. var source3 =
  64. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  65. Assert.IsNotNull (source1.LinkTo (block.Target1));
  66. Assert.IsNotNull (source2.LinkTo (block.Target2));
  67. Assert.IsNotNull (source3.LinkTo (block.Target3));
  68. Assert.IsTrue (source1.Post (1));
  69. scheduler.ExecuteAll ();
  70. int i;
  71. Assert.IsFalse (source1.TryReceive (out i));
  72. Assert.IsTrue (source2.Post (11));
  73. Assert.IsTrue (source3.Post (21));
  74. scheduler.ExecuteAll ();
  75. Assert.IsFalse (source2.TryReceive (out i));
  76. Assert.IsFalse (source3.TryReceive (out i));
  77. Tuple<int, int, int> tuple;
  78. Assert.IsTrue (block.TryReceive (out tuple));
  79. Assert.AreEqual (Tuple.Create (1, 11, 21), tuple);
  80. }
  81. [Test]
  82. public void NonGreedyJoinTest ()
  83. {
  84. var scheduler = new TestScheduler ();
  85. var block =
  86. new JoinBlock<int, int> (new GroupingDataflowBlockOptions
  87. { TaskScheduler = scheduler, Greedy = false });
  88. var source1 =
  89. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  90. var source2 =
  91. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  92. Assert.IsNotNull (source1.LinkTo (block.Target1));
  93. Assert.IsNotNull (source2.LinkTo (block.Target2));
  94. Assert.IsTrue (source1.Post (1));
  95. scheduler.ExecuteAll ();
  96. int i;
  97. Assert.IsTrue (source1.TryReceive (out i));
  98. Assert.IsTrue (source1.Post (2));
  99. Assert.IsTrue (source2.Post (11));
  100. scheduler.ExecuteAll ();
  101. Assert.IsFalse (source1.TryReceive (out i));
  102. Assert.IsFalse (source2.TryReceive (out i));
  103. Tuple<int, int> tuple;
  104. Assert.IsTrue (block.TryReceive (out tuple));
  105. Assert.AreEqual (Tuple.Create (2, 11), tuple);
  106. }
  107. [Test]
  108. public void NonGreedyJoin3Test ()
  109. {
  110. var scheduler = new TestScheduler ();
  111. var block =
  112. new JoinBlock<int, int, int> (new GroupingDataflowBlockOptions
  113. { TaskScheduler = scheduler, Greedy = false });
  114. var source1 =
  115. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  116. var source2 =
  117. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  118. var source3 =
  119. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  120. Assert.IsNotNull (source1.LinkTo (block.Target1));
  121. Assert.IsNotNull (source2.LinkTo (block.Target2));
  122. Assert.IsNotNull (source3.LinkTo (block.Target3));
  123. Assert.IsTrue (source1.Post (1));
  124. scheduler.ExecuteAll ();
  125. int i;
  126. Assert.IsTrue (source1.TryReceive (out i));
  127. Assert.IsTrue (source1.Post (2));
  128. Assert.IsTrue (source2.Post (11));
  129. Assert.IsTrue (source3.Post (21));
  130. scheduler.ExecuteAll ();
  131. Assert.IsFalse (source1.TryReceive (out i));
  132. Assert.IsFalse (source2.TryReceive (out i));
  133. Assert.IsFalse (source3.TryReceive (out i));
  134. Tuple<int, int, int> tuple;
  135. Assert.IsTrue (block.TryReceive (out tuple));
  136. Assert.AreEqual (Tuple.Create (2, 11, 21), tuple);
  137. }
  138. [Test]
  139. public void NonGreedyJoinWithPostTest ()
  140. {
  141. var block =
  142. new JoinBlock<int, int> (new GroupingDataflowBlockOptions { Greedy = false });
  143. Assert.IsFalse (block.Target1.Post (42));
  144. }
  145. [Test]
  146. public void NonGreedyBatchTest ()
  147. {
  148. var scheduler = new TestScheduler ();
  149. var block = new BatchBlock<int> (3,
  150. new GroupingDataflowBlockOptions
  151. { Greedy = false, TaskScheduler = scheduler });
  152. Assert.IsFalse (block.Post (42));
  153. var source =
  154. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  155. Assert.IsNotNull (source.LinkTo (block));
  156. Assert.IsTrue (source.Post (43));
  157. scheduler.ExecuteAll ();
  158. int i;
  159. Assert.IsTrue (source.TryReceive (null, out i));
  160. Assert.AreEqual (43, i);
  161. Assert.IsTrue (source.Post (44));
  162. Assert.IsTrue (source.Post (45));
  163. var source2 =
  164. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  165. Assert.IsNotNull (source2.LinkTo (block));
  166. Assert.IsTrue (source2.Post (142));
  167. scheduler.ExecuteAll ();
  168. int[] batch;
  169. Assert.IsFalse (block.TryReceive (null, out batch));
  170. Assert.IsNull (batch);
  171. block.TriggerBatch ();
  172. scheduler.ExecuteAll ();
  173. Assert.IsTrue (block.TryReceive (null, out batch));
  174. CollectionAssert.AreEquivalent (new[] { 44, 142 }, batch);
  175. }
  176. [Test]
  177. public void NonGreedyBatchWithMoreSourcesTest ()
  178. {
  179. var scheduler = new TestScheduler ();
  180. var block = new BatchBlock<int> (2,
  181. new GroupingDataflowBlockOptions
  182. { Greedy = false, TaskScheduler = scheduler });
  183. var source1 =
  184. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  185. var source2 =
  186. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  187. Assert.IsNotNull (source1.LinkTo (block));
  188. Assert.IsNotNull (source2.LinkTo (block));
  189. Assert.IsTrue (source1.Post (43));
  190. scheduler.ExecuteAll ();
  191. int i;
  192. Assert.IsTrue (source1.TryReceive (out i));
  193. Assert.AreEqual (43, i);
  194. Assert.IsTrue (source1.Post (44));
  195. Assert.IsTrue (source2.Post (45));
  196. scheduler.ExecuteAll ();
  197. int[] batch;
  198. Assert.IsTrue (block.TryReceive (out batch));
  199. CollectionAssert.AreEquivalent (new[] { 44, 45 }, batch);
  200. }
  201. [Test]
  202. public void NonGreedyBatchedJoinTest ()
  203. {
  204. AssertEx.Throws<ArgumentException> (
  205. () => new BatchedJoinBlock<int, int> (2,
  206. new GroupingDataflowBlockOptions { Greedy = false }));
  207. }
  208. [Test]
  209. public void NonGreedyBatchedJoin3Test ()
  210. {
  211. AssertEx.Throws<ArgumentException> (
  212. () => new BatchedJoinBlock<int, int, int> (2,
  213. new GroupingDataflowBlockOptions { Greedy = false }));
  214. }
  215. [Test]
  216. public void NonGreedyJoinWithBoundedCapacityTest ()
  217. {
  218. var scheduler = new TestScheduler ();
  219. var block = new JoinBlock<int, int> (
  220. new GroupingDataflowBlockOptions
  221. { Greedy = false, BoundedCapacity = 1, TaskScheduler = scheduler });
  222. var source1 =
  223. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  224. var source2 =
  225. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  226. Assert.IsNotNull (source1.LinkTo (block.Target1));
  227. Assert.IsNotNull (source2.LinkTo (block.Target2));
  228. Assert.IsTrue (source1.Post (11));
  229. Assert.IsTrue (source2.Post (21));
  230. scheduler.ExecuteAll ();
  231. Assert.IsTrue (source1.Post (12));
  232. Assert.IsTrue (source2.Post (22));
  233. scheduler.ExecuteAll ();
  234. int i;
  235. Assert.IsTrue (source1.TryReceive (out i));
  236. Assert.AreEqual (12, i);
  237. Assert.IsTrue (source1.Post (13));
  238. Tuple<int, int> tuple;
  239. Assert.IsTrue (block.TryReceive (out tuple));
  240. Assert.AreEqual (Tuple.Create (11, 21), tuple);
  241. scheduler.ExecuteAll ();
  242. Assert.IsTrue (block.TryReceive (out tuple));
  243. Assert.AreEqual (Tuple.Create (13, 22), tuple);
  244. }
  245. [Test]
  246. public void NonGreedyJoin3WithBoundedCapacityTest ()
  247. {
  248. var scheduler = new TestScheduler ();
  249. var block = new JoinBlock<int, int, int> (
  250. new GroupingDataflowBlockOptions
  251. { Greedy = false, BoundedCapacity = 1, TaskScheduler = scheduler });
  252. var source1 =
  253. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  254. var source2 =
  255. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  256. var source3 =
  257. new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
  258. Assert.IsNotNull (source1.LinkTo (block.Target1));
  259. Assert.IsNotNull (source2.LinkTo (block.Target2));
  260. Assert.IsNotNull (source3.LinkTo (block.Target3));
  261. Assert.IsTrue (source1.Post (11));
  262. Assert.IsTrue (source2.Post (21));
  263. Assert.IsTrue (source3.Post (31));
  264. scheduler.ExecuteAll ();
  265. Assert.IsTrue (source1.Post (12));
  266. Assert.IsTrue (source2.Post (22));
  267. Assert.IsTrue (source3.Post (32));
  268. scheduler.ExecuteAll ();
  269. int i;
  270. Assert.IsTrue (source1.TryReceive (out i));
  271. Assert.AreEqual (12, i);
  272. Assert.IsTrue (source1.Post (13));
  273. Tuple<int, int, int> tuple;
  274. Assert.IsTrue (block.TryReceive (out tuple));
  275. Assert.AreEqual (Tuple.Create (11, 21, 31), tuple);
  276. scheduler.ExecuteAll ();
  277. Assert.IsTrue (block.TryReceive (out tuple));
  278. Assert.AreEqual (Tuple.Create (13, 22, 32), tuple);
  279. }
  280. }
  281. }