public async Task TestConsumeToAccept()
        {
            var wob = new WriteOnceBlock <int>(i => i * 2);

            wob.Post(1);
            await wob.Completion;

            var b2 = new BatchedJoinBlock <int, int>(1);

            wob.LinkTo(b2.Target2, new DataflowLinkOptions {
                PropagateCompletion = true
            });
            Tuple <IList <int>, IList <int> > item2 = await b2.ReceiveAsync();

            Assert.Equal(expected: 0, actual: item2.Item1.Count);
            Assert.Equal(expected: 1, actual: item2.Item2.Count);
            b2.Target1.Complete();

            var b3 = new BatchedJoinBlock <int, int, int>(1);

            wob.LinkTo(b3.Target3, new DataflowLinkOptions {
                PropagateCompletion = true
            });
            Tuple <IList <int>, IList <int>, IList <int> > item3 = await b3.ReceiveAsync();

            Assert.Equal(expected: 0, actual: item3.Item1.Count);
            Assert.Equal(expected: 0, actual: item3.Item2.Count);
            Assert.Equal(expected: 1, actual: item3.Item3.Count);
            b3.Target1.Complete();
            b3.Target2.Complete();

            await Task.WhenAll(b2.Completion, b3.Completion);
        }
        public void CloningTest()
        {
            object act1 = null, act2 = null;
            var    evt = new CountdownEvent(2);

            object source  = new object();
            var    block   = new WriteOnceBlock <object> (o => new object());
            var    action1 = new ActionBlock <object> (i =>
            {
                act1 = i;
                evt.Signal();
            });
            var action2 = new ActionBlock <object> (i =>
            {
                act2 = i;
                evt.Signal();
            });

            block.LinkTo(action1);
            block.LinkTo(action2);

            Assert.IsTrue(block.Post(source));

            Assert.IsTrue(evt.Wait(100));

            Assert.IsNotNull(act1);
            Assert.IsNotNull(act2);

            Assert.IsFalse(source.Equals(act1));
            Assert.IsFalse(source.Equals(act2));
            Assert.IsFalse(act2.Equals(act1));
        }
Esempio n. 3
0
        public async Task TestWriteOnce()
        {
            var bb = new WriteOnceBlock <int>(null);

            bb.LinkTo(new ActionBlock <int>(i =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("Receiver1:" + i);
            }, new ExecutionDataflowBlockOptions()
            {
                BoundedCapacity = 1
            }));

            bb.LinkTo(new ActionBlock <int>(i =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("Receiver2:" + i);
            }));

            Assert.IsTrue(bb.Post(1));

            Assert.IsFalse(bb.Post(2));
            Assert.IsFalse(await bb.SendAsync(3));
            Assert.IsFalse(bb.Post(4));
            Assert.IsFalse(await bb.SendAsync(5));
        }
Esempio n. 4
0
		public void BasicUsageTest ()
		{
			bool act1 = false, act2 = false;
			var evt = new CountdownEvent (2);

			var block = new WriteOnceBlock<int> (null);
			var action1 = new ActionBlock<int> (i =>
			{
				act1 = i == 42;
				evt.Signal ();
			});
			var action2 = new ActionBlock<int> (i =>
			{
				act2 = i == 42;
				evt.Signal ();
			});

			block.LinkTo (action1);
			block.LinkTo (action2);

			Assert.IsTrue (block.Post (42));
			Assert.IsFalse (block.Post (43));

			Assert.IsTrue (evt.Wait (100));

			Assert.IsTrue (act1);
			Assert.IsTrue (act2);
		}
        public void DontOfferTwiceTest()
        {
            var scheduler = new TestScheduler();
            var block     = new WriteOnceBlock <int> (null,
                                                      new DataflowBlockOptions {
                TaskScheduler = scheduler
            });
            var target =
                new TestTargetBlock <int> {
                Postpone = true
            };

            block.LinkTo(target);

            Assert.IsFalse(target.HasPostponed);

            Assert.IsTrue(block.Post(1));

            scheduler.ExecuteAll();

            Assert.IsTrue(target.HasPostponed);

            target.Postpone = false;

            int value;

            Assert.IsTrue(target.RetryPostponed(out value));
            Assert.AreEqual(1, value);

            block.LinkTo(new BufferBlock <int> ());

            scheduler.ExecuteAll();

            Assert.AreEqual(default(int), target.DirectlyAccepted);
        }
        public void WriteOnceBehaviorTest()
        {
            bool act1 = false, act2 = false;
            var  evt = new CountdownEvent(2);

            var broadcast = new WriteOnceBlock <int> (null);
            var action1   = new ActionBlock <int> (i =>
            {
                act1 = i == 42;
                evt.Signal();
            });
            var action2 = new ActionBlock <int> (i =>
            {
                act2 = i == 42;
                evt.Signal();
            });

            broadcast.LinkTo(action1);
            broadcast.LinkTo(action2);

            Assert.IsTrue(broadcast.Post(42));

            Assert.IsTrue(evt.Wait(100));

            Assert.IsTrue(act1);
            Assert.IsTrue(act2);

            Assert.IsFalse(broadcast.Post(24));
            Thread.Sleep(300);

            Assert.IsTrue(act1);
            Assert.IsTrue(act2);
        }
        public void BasicUsageTest()
        {
            bool act1 = false, act2 = false;
            var  evt = new CountdownEvent(2);

            var block   = new WriteOnceBlock <int> (null);
            var action1 = new ActionBlock <int> (i =>
            {
                act1 = i == 42;
                evt.Signal();
            });
            var action2 = new ActionBlock <int> (i =>
            {
                act2 = i == 42;
                evt.Signal();
            });

            block.LinkTo(action1);
            block.LinkTo(action2);

            Assert.IsTrue(block.Post(42));
            Assert.IsFalse(block.Post(43));

            Assert.IsTrue(evt.Wait(100));

            Assert.IsTrue(act1);
            Assert.IsTrue(act2);
        }
Esempio n. 8
0
 public static void TestSync()
 {
     bb.LinkTo(displayBlock);
     bb.LinkTo(saveBlock);
     bb.LinkTo(sendBlock);
     for (int i = 0; i < 4; i++)
     {
         bb.Post(i);
     }
     Console.WriteLine("Post finished");
 }
        public IEnumerable <string> WriteOnceBlockUsage(int numberOfIteration, int minValue)
        {
            Console.WriteLine($"Inside {nameof(TplDataflow2BufferingBlocksController)} - {nameof(WriteOnceBlockUsage)}");

            var strings = new BlockingCollection <string>();

            // Create the members of the pipeline.
            var WriteOnceBlockGivenInputToASubscriber = new WriteOnceBlock <string>(null);
            var actionBlockSubscriber = new ActionBlock <string>(stringInput =>
                                                                 Functions.AddInputIntoTheGivenList(strings, stringInput, "Subscriber")
                                                                 );

            // Connect the dataflow blocks to form a pipeline.
            WriteOnceBlockGivenInputToASubscriber.LinkTo(actionBlockSubscriber, DataflowOptions.LinkOptions);

            // Start WriteOnceBlockUsage pipeline with the input values.
            for (var i = minValue; i <= minValue + numberOfIteration; i++)
            {
                WriteOnceBlockGivenInputToASubscriber.Post($"Value = {i}");
            }

            // Mark the head of the pipeline as complete.
            WriteOnceBlockGivenInputToASubscriber.Complete();

            // Wait for the last block in the pipeline to process all messages.
            actionBlockSubscriber.Completion.Wait();

            return(strings);
        }
Esempio n. 10
0
        static void Main(string[] args)
        {
            var writeOnceBlock = new WriteOnceBlock <int>(a => a);
            var actionBlock    = new ActionBlock <int>(a => Console.WriteLine($"ActionBlock received {a}"));

            writeOnceBlock.LinkTo(actionBlock);

            for (int i = 0; i < 5; i++)
            {
                if (writeOnceBlock.Post(i))
                {
                    Console.WriteLine($"Accepted {i}");
                }
                else
                {
                    Console.WriteLine($"Rejected {i}");
                }
            }

            for (int i = 0; i < 10; i++) // Receive more than Post
            {
                if (writeOnceBlock.TryReceive(out int result))
                {
                    Console.WriteLine($"Received {result}");
                }
                else
                {
                    Console.WriteLine($"Warning {result}");
                }
            }

            Console.WriteLine("Finished!");
            Console.ReadKey();
        }
        public async Task WriteOnceWithAction()
        {
            var block = new WriteOnceBlock <int>(a => a);
            var print = new ActionBlock <int>(a => Console.WriteLine($"Message: {a}"));

            block.LinkTo(print);

            for (int i = 0; i < 10; i++)
            {
                if (block.Post(i))
                {
                    Console.WriteLine($"Acceped {i}");
                }
                else
                {
                    Console.WriteLine($"Rejected {i}");
                }
            }

            block.Complete();
            await block.Completion;

            print.Complete();
            await print.Completion;

            Console.WriteLine("Done!");
        }
Esempio n. 12
0
        public async Task TestCancellationBeforeAndAfterCtor()
        {
            foreach (bool before in DataflowTestHelpers.BooleanValues)
            {
                var cts = new CancellationTokenSource();
                if (before)
                {
                    cts.Cancel();
                }
                var wob = new WriteOnceBlock <int>(null, new DataflowBlockOptions {
                    CancellationToken = cts.Token
                });
                if (!before)
                {
                    cts.Cancel();
                }

                int         ignoredValue;
                IList <int> ignoredValues;

                Assert.NotNull(wob.LinkTo(DataflowBlock.NullTarget <int>()));
                Assert.False(wob.Post(42));
                Task <bool> sendTask = wob.SendAsync(43);
                Assert.True(sendTask.IsCompleted);
                Assert.False(sendTask.Result);
                Assert.False(wob.TryReceive(out ignoredValue));
                Assert.False(((IReceivableSourceBlock <int>)wob).TryReceiveAll(out ignoredValues));
                Assert.NotNull(wob.Completion);

                await Assert.ThrowsAnyAsync <OperationCanceledException>(() => wob.Completion);
            }
        }
Esempio n. 13
0
        public void TestCanceledLinking()
        {
            bool passed = true;

            var cts = new CancellationTokenSource();

            cts.Cancel();
            var options = new DataflowBlockOptions {
                CancellationToken = cts.Token
            };
            var writeOnce = new WriteOnceBlock <int>(x => x, options);
            var target    = new ActionBlock <int>(x => { });

            try
            {
                writeOnce.LinkTo(target);
                Console.WriteLine("Completed without exception - Passed");
            }
            catch (Exception)
            {
                passed = false;
                Console.WriteLine("Completed without exception - FAILED");
            }

            Assert.True(passed, "Test failed.");
        }
Esempio n. 14
0
        private static void TestWriteOnceBlock()
        {
            var bb = new WriteOnceBlock <int>(i => { return(i); });

            var displayBlock = new ActionBlock <int>(i => Console.WriteLine("Displayed " + i));
            var saveBlock    = new ActionBlock <int>(i => Console.WriteLine("Saved " + i));
            var sendBlock    = new ActionBlock <int>(i => Console.WriteLine("Send " + i));

            bb.LinkTo(displayBlock);
            bb.LinkTo(saveBlock);
            bb.LinkTo(sendBlock);

            for (int i = 0; i < 4; i++)
            {
                bb.Post(i);
            }
        }
Esempio n. 15
0
        private static void TestSync4()
        {
            wb.LinkTo(displayBlock);
            wb.LinkTo(saveBlock);
            wb.LinkTo(sendBlock);

            for (int i = 0; i < 4; i++)
            {
                wb.Post(i);
            }

            wb.Complete();
            Console.WriteLine("Post Finished");
            wb.Completion.Wait();
            Console.WriteLine("Process Finished");
            Console.WriteLine("Recive:" + wb.Receive());
        }
Esempio n. 16
0
        public async Task TestFaultyTarget()
        {
            var wob = new WriteOnceBlock <int>(null);

            wob.LinkTo(new DelegatePropagator <int, int> {
                OfferMessageDelegate = delegate {
                    throw new FormatException();
                }
            });
            wob.Post(42);
            await Assert.ThrowsAsync <FormatException>(() => wob.Completion);
        }
Esempio n. 17
0
        public async Task TestFaultyScheduler()
        {
            var wob = new WriteOnceBlock <int>(null, new DataflowBlockOptions {
                TaskScheduler = new DelegateTaskScheduler {
                    QueueTaskDelegate = delegate {
                        throw new InvalidCastException();
                    }
                }
            });

            wob.LinkTo(DataflowBlock.NullTarget <int>());
            wob.Post(42);
            await Assert.ThrowsAsync <TaskSchedulerException>(() => wob.Completion);
        }
Esempio n. 18
0
        public async Task TestBroadcasting()
        {
            var wob     = new WriteOnceBlock <int>(i => i + 1);
            var targets = Enumerable.Range(0, 3).Select(_ => new TransformBlock <int, int>(i => i)).ToArray();

            foreach (var target in targets)
            {
                wob.LinkTo(target);
            }
            wob.Post(42);
            foreach (var target in targets)
            {
                Assert.Equal(expected: 43, actual: await target.ReceiveAsync());
            }
        }
Esempio n. 19
0
		public void CloningTest ()
		{
			object act1 = null, act2 = null;
			var evt = new CountdownEvent (2);

			object source = new object ();
			var broadcast = new WriteOnceBlock<object> (o => new object ());
			var action1 = new ActionBlock<object> (i => { act1 = i; evt.Signal (); });
			var action2 = new ActionBlock<object> (i => { act2 = i; evt.Signal (); });

			broadcast.LinkTo (action1);
			broadcast.LinkTo (action2);

			Assert.IsTrue (broadcast.Post (source));

			evt.Wait ();

			Assert.IsNotNull (act1);
			Assert.IsNotNull (act2);

			Assert.IsFalse (source.Equals (act1));
			Assert.IsFalse (source.Equals (act2));
			Assert.IsFalse (act2.Equals (act1));
		}
        public DataAggregator()
        {
            source1.LinkTo(batchBlock, new DataflowLinkOptions()
            {
                PropagateCompletion = true
            });
            source2.LinkTo(batchBlock, new DataflowLinkOptions()
            {
                PropagateCompletion = true
            });
            source3.LinkTo(batchBlock, new DataflowLinkOptions()
            {
                PropagateCompletion = true
            });
            source4.LinkTo(batchBlock, new DataflowLinkOptions()
            {
                PropagateCompletion = true
            });
            source5.LinkTo(batchBlock, new DataflowLinkOptions()
            {
                PropagateCompletion = true
            });

            //batchBlock.LinkTo(transformBlock1, new DataflowLinkOptions() { PropagateCompletion = true });
            //transformBlock1.LinkTo(writer, new DataflowLinkOptions() { PropagateCompletion = true });


            var broadcastBlock = new BroadcastBlock <MarketDataUpdate[]>(null);

            new Timer(x => {
                batchBlock.TriggerBatch();
            }).Change(1000, 200);

            batchBlock.LinkTo(broadcastBlock); //{ PropagateCompletion = true }


            broadcastBlock.LinkTo(transformBlock1);
            broadcastBlock.LinkTo(transformBlock2);
            var writeOnceBlock = new WriteOnceBlock <List <MarketDataUpdate> >(null);

            transformBlock1.LinkTo(writeOnceBlock);
            transformBlock2.LinkTo(writeOnceBlock);

            writeOnceBlock.LinkTo(writer, new DataflowLinkOptions()
            {
                PropagateCompletion = true
            });
        }
        public void PostponedTest()
        {
            var block  = new WriteOnceBlock <int> (null);
            var target = new BufferBlock <int> (
                new DataflowBlockOptions {
                BoundedCapacity = 1
            });

            block.LinkTo(target);

            Assert.IsTrue(target.Post(1));

            Assert.IsTrue(block.Post(2));

            Assert.AreEqual(1, target.Receive(TimeSpan.FromMilliseconds(100)));
            Assert.AreEqual(2, target.Receive(TimeSpan.FromMilliseconds(100)));
        }
Esempio n. 22
0
        public void Run()
        {
            var block = new WriteOnceBlock <int>(a => a);
            var print = new ActionBlock <int>(a => Console.WriteLine($"Mesaj {a} kabul edildi."));

            for (int i = 0; i < 10; i++)
            {
                if (block.Post(i))
                {
                    Console.WriteLine($"Mesaj {i} kabul edildi");
                }
                else
                {
                    Console.WriteLine($"Mesaj {i} reddedildi");
                }
            }
            block.LinkTo(print);
        }
Esempio n. 23
0
		public void LinkAfterPostTest ()
		{
			bool act = false;
			var evt = new ManualResetEventSlim ();

			var block = new WriteOnceBlock<int> (null);
			var action = new ActionBlock<int> (i =>
			{
				act = i == 42;
				evt.Set ();
			});

			Assert.IsTrue (block.Post (42));

			block.LinkTo (action);

			Assert.IsTrue (evt.Wait (100));

			Assert.IsTrue (act);
		}
        public void LinkAfterPostTest()
        {
            bool act = false;
            var  evt = new ManualResetEventSlim();

            var block  = new WriteOnceBlock <int> (null);
            var action = new ActionBlock <int> (i =>
            {
                act = i == 42;
                evt.Set();
            });

            Assert.IsTrue(block.Post(42));

            block.LinkTo(action);

            Assert.IsTrue(evt.Wait(100));

            Assert.IsTrue(act);
        }
Esempio n. 25
0
        public void TestWriteOnceCloning()
        {
            // Test cloning when a clone function is provided
            {
                var writeOnce = new WriteOnceBlock <int>(x => - x);
                Assert.True(writeOnce.Post(42), "Expected initial post on cloning WriteOnce to succeed");
                Assert.False(writeOnce.Post(43), "Expected secondary post on cloning WriteOnce to fail");
                Assert.True(writeOnce.Receive() == -42, "Expected Receive'd data to be a clone");
                int item;
                Assert.True(writeOnce.TryReceive(out item) && item == -42, "Expected TryReceive'd data to be a clone");
                IList <int> items;
                Assert.True(((IReceivableSourceBlock <int>)writeOnce).TryReceiveAll(out items) && items.Count == 1 && items[0] == -42, "Expected TryReceiveAll'd data to be a clone");
                var ab = new ActionBlock <int>(i =>
                {
                    Assert.True(i == -42, "Expected propagated data to be a clone.");
                });
                writeOnce.LinkTo(ab);
                ab.Complete();
                Assert.True(ab.Completion.Wait(4000), "Expected action block to complete after cloned data flowed to it");
            }

            // Test successful processing when no clone function exists
            {
                var data      = new object();
                var writeOnce = new WriteOnceBlock <object>(null);
                Assert.True(writeOnce.Post(data), "Expected initial post on non-cloning WriteOnce to succeed");
                Assert.False(writeOnce.Post(new object()), "Expected secondary post on non-cloning WriteOnce to fail");
                Assert.True(writeOnce.Receive() == data, "Expected Receive'd data to be original data");
                object item;
                Assert.True(writeOnce.TryReceive(out item) && item == data, "Expected TryReceive'd data to be original data");
                IList <object> items;
                Assert.True(((IReceivableSourceBlock <object>)writeOnce).TryReceiveAll(out items) && items.Count == 1 && items[0] == data, "Expected TryReceiveAll'd data to be original data");
                var ab = new ActionBlock <object>(i =>
                {
                    Assert.True(i == data, "Expected propagated data to be original data.");
                });
                writeOnce.LinkTo(ab);
                ab.Complete();
                Assert.True(ab.Completion.Wait(4000), "Expected action block to complete after original data flowed to it");
            }
        }
Esempio n. 26
0
        static void Main(string[] args)
        {
            var block = new WriteOnceBlock <int>(a => a);
            var print = new ActionBlock <int>(a => Console.WriteLine($"Messgae {a} was recived"));

            for (int i = 0; i < 10; i++)
            {
                if (block.Post(i))
                {
                    Console.WriteLine($"Messgae was {i} accepted");
                }
                else
                {
                    Console.WriteLine($"Messgae was {i} REJECTED");
                }
            }

            block.LinkTo(print);

            Console.WriteLine("done");
            Console.ReadKey();
        }
Esempio n. 27
0
        public async Task WriteOnceToAction()
        {
            int completedCount = 0;
            var c = new ActionBlock <int>(i => completedCount++);
            var singleAssignments = Enumerable.Range(0, Iterations).Select(_ =>
            {
                var s = new WriteOnceBlock <int>(i => i);
                s.LinkTo(c);
                return(s);
            }).ToList();
            var ignored = Task.WhenAll(singleAssignments.Select(s => s.Completion)).ContinueWith(
                _ => c.Complete(), CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default);

            foreach (var s in singleAssignments)
            {
                s.Post(1);
            }

            await c.Completion;

            Assert.Equal(expected: Iterations, actual: completedCount);
        }
Esempio n. 28
0
        static void Main(string[] args)
        {
            var block = new WriteOnceBlock <int>(a => a);

            var actionBlock = new ActionBlock <int>(i =>
            {
                Console.WriteLine($"Message {i}");
            });

            block.LinkTo(actionBlock);

            for (int i = 0; i < 10; i++)
            {
                if (!block.Post(i))
                {
                    Console.WriteLine($"{i} not written!");
                }
            }

            Console.WriteLine("Finished!");
            Console.ReadKey();
        }
Esempio n. 29
0
        // Demo of it being used with other blocks.
        //
        // Only one push message propagates to the ActionBlock so only one message is received.
        private static async Task SimpleDemoAsync()
        {
            Console.WriteLine("WriteOneBlockDemo has started!");
            var options = new DataflowLinkOptions {
                PropagateCompletion = true
            };
            var writeBlock  = new WriteOnceBlock <string>(input => input);
            var actionBlock = new ActionBlock <string>(Console.WriteLine);

            writeBlock.LinkTo(actionBlock, options);

            for (int i = 0; i < 5; i++)
            {
                await writeBlock.SendAsync(ProduceTimeData()).ConfigureAwait(false);
            }

            writeBlock.Complete();
            await actionBlock.Completion.ConfigureAwait(false);

            Console.WriteLine("Finished!");
            Console.ReadKey();
        }
Esempio n. 30
0
        internal static bool WriteOnceToAction()
        {
            const int ITERS          = 2;
            int       completedCount = 0;
            var       c = new ActionBlock <int>(i => completedCount++);
            var       singleAssignments = Enumerable.Range(0, ITERS).Select(_ =>
            {
                var s = new WriteOnceBlock <int>(i => i);
                s.LinkTo(c);
                return(s);
            }).ToList();

            Task.Factory.ContinueWhenAll(singleAssignments.Select(s => s.Completion).ToArray(), _ => c.Complete());

            foreach (var s in singleAssignments)
            {
                s.Post(1);
            }
            c.Completion.Wait();

            return(completedCount == ITERS);
        }
Esempio n. 31
0
        public IDisposable LinkTo(ITargetBlock <IEnumerable <T> > target, DataflowLinkOptions linkOptions)
        {
            var emitter = new WriteOnceBlock <IEnumerable <T> >(items => items);

            // When the AccumBlock completes, send all the items to the emitter and complete it.
            AccumBlock.Completion.ContinueWith(async o =>
            {
                if (o.IsFaulted)
                {
                    ((ITargetBlock <IEnumerable <T> >)emitter).Fault(o.Exception);
                }
                else
                {
                    await emitter.SendAsync(Accumulator);
                    emitter.Complete();
                    Logger.LogTrace("emitter complete.");
                }
            });
            Completion = emitter.Completion;
            var disposable = emitter.LinkTo(target, linkOptions);

            return(disposable);
        }
        public void QueuedMessageTest()
        {
            var scheduler = new TestScheduler();
            var block     = new WriteOnceBlock <int> (null,
                                                      new DataflowBlockOptions {
                TaskScheduler = scheduler
            });
            var target = new BufferBlock <int> ();

            block.LinkTo(target);

            Assert.IsTrue(block.Post(1));

            AssertEx.Throws <TimeoutException> (
                () => target.Receive(TimeSpan.FromMilliseconds(100)));

            scheduler.ExecuteAll();

            int item;

            Assert.IsTrue(target.TryReceive(out item));
            Assert.AreEqual(1, item);
        }
Esempio n. 33
0
        public async Task TestCloning()
        {
            // Test cloning when a clone function is provided
            {
                int data = 42;
                var wob = new WriteOnceBlock<int>(x => -x);
                Assert.True(wob.Post(data));

                Assert.False(wob.Post(data + 1));

                for (int i = 0; i < 3; i++)
                {
                    int item;
                    Assert.True(wob.TryReceive(out item));
                    Assert.Equal(expected: -data, actual: item);

                    Assert.Equal(expected: -data, actual: wob.Receive());

                    Assert.Equal(expected: -data, actual: await wob.ReceiveAsync());

                    IList<int> items;
                    Assert.True(((IReceivableSourceBlock<int>)wob).TryReceiveAll(out items));
                    Assert.Equal(expected: items.Count, actual: 1);
                    Assert.Equal(expected: -data, actual: items[0]);
                }

                int result = 0;
                var target = new ActionBlock<int>(i => {
                    Assert.Equal(expected: 0, actual: result);
                    result = i;
                    Assert.Equal(expected: -data, actual: i);
                });
                wob.LinkTo(target, new DataflowLinkOptions { PropagateCompletion = true });
                await target.Completion;
            }

            // Test successful processing when no clone function exists
            {
                var data = new object();
                var wob = new WriteOnceBlock<object>(null);
                Assert.True(wob.Post(data));

                Assert.False(wob.Post(new object()));

                object result;
                for (int i = 0; i < 3; i++)
                {
                    Assert.True(wob.TryReceive(out result));
                    Assert.Equal(expected: data, actual: result);

                    Assert.Equal(expected: data, actual: wob.Receive());
                    Assert.Equal(expected: data, actual: await wob.ReceiveAsync());

                    IList<object> items;
                    Assert.True(((IReceivableSourceBlock<object>)wob).TryReceiveAll(out items));
                    Assert.Equal(expected: 1, actual: items.Count);
                    Assert.Equal(expected: data, actual: items[0]);
                }

                result = null;
                var target = new ActionBlock<object>(o => {
                    Assert.Null(result);
                    result = o;
                    Assert.Equal(expected: data, actual: o);
                });
                wob.LinkTo(target, new DataflowLinkOptions { PropagateCompletion = true });
                await target.Completion;
            }
        }
Esempio n. 34
0
 public async Task TestFaultyTarget()
 {
     var wob = new WriteOnceBlock<int>(null);
     wob.LinkTo(new DelegatePropagator<int, int> {
         OfferMessageDelegate = delegate {
             throw new FormatException();
         }
     });
     wob.Post(42);
     await Assert.ThrowsAsync<FormatException>(() => wob.Completion);
 }
Esempio n. 35
0
 public async Task TestFaultyScheduler()
 {
     var wob = new WriteOnceBlock<int>(null, new DataflowBlockOptions {
         TaskScheduler = new DelegateTaskScheduler {
             QueueTaskDelegate = delegate {
                 throw new InvalidCastException();
             }
         }
     });
     wob.LinkTo(DataflowBlock.NullTarget<int>());
     wob.Post(42);
     await Assert.ThrowsAsync<TaskSchedulerException>(() => wob.Completion);
 }
Esempio n. 36
0
        public async Task TestConsumeToAccept()
        {
            var wob = new WriteOnceBlock<int>(i => i * 2);
            wob.Post(1);
            await wob.Completion;

            var b2 = new BatchedJoinBlock<int, int>(1);
            wob.LinkTo(b2.Target2, new DataflowLinkOptions { PropagateCompletion = true });
            Tuple<IList<int>, IList<int>> item2 = await b2.ReceiveAsync();
            Assert.Equal(expected: 0, actual: item2.Item1.Count);
            Assert.Equal(expected: 1, actual: item2.Item2.Count);
            b2.Target1.Complete();

            var b3 = new BatchedJoinBlock<int, int, int>(1);
            wob.LinkTo(b3.Target3, new DataflowLinkOptions { PropagateCompletion = true });
            Tuple<IList<int>, IList<int>, IList<int>> item3 = await b3.ReceiveAsync();
            Assert.Equal(expected: 0, actual: item3.Item1.Count);
            Assert.Equal(expected: 0, actual: item3.Item2.Count);
            Assert.Equal(expected: 1, actual: item3.Item3.Count);
            b3.Target1.Complete();
            b3.Target2.Complete();

            await Task.WhenAll(b2.Completion, b3.Completion);
        }
Esempio n. 37
0
        internal static bool WriteOnceToAction()
        {
            const int ITERS = 2;
            int completedCount = 0;
            var c = new ActionBlock<int>(i => completedCount++);
            var singleAssignments = Enumerable.Range(0, ITERS).Select(_ =>
            {
                var s = new WriteOnceBlock<int>(i => i);
                s.LinkTo(c);
                return s;
            }).ToList();
            Task.Factory.ContinueWhenAll(singleAssignments.Select(s => s.Completion).ToArray(), _ => c.Complete());

            foreach (var s in singleAssignments) s.Post(1);
            c.Completion.Wait();

            return completedCount == ITERS;
        }
        public void RunWriteOnceBlockConformanceTests()
        {
            bool passed = true, localPassed = true;
            {
                // Test posting then receiving
                localPassed = true;
                var wob = new WriteOnceBlock<int>(i => i);
                int successfulPosts = 0;
                for (int i = 10; i <= 20; i++)
                {
                    successfulPosts += wob.Post(i) ? 1 : 0;
                }
                localPassed |= successfulPosts == 1;
                localPassed |= wob.Receive() == 10;
                Console.WriteLine("{0}: Posting then receiving", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            {
                // Test receiving then posting
                localPassed = true;
                var wob = new WriteOnceBlock<int>(i => i);
                Task.Factory.StartNew(() =>
                {
                    Task.Delay(1000).Wait();
                    wob.Post(42);
                });
                localPassed |= wob.Receive() == 42;
                localPassed |= wob.Post(43) == false;
                wob.Completion.Wait();
                Console.WriteLine("{0}: Receiving then posting", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            {
                // Test broadcasting
                localPassed = true;
                var wob = new WriteOnceBlock<int>(i => i + 1);
                var tb1 = new TransformBlock<int, int>(i => i);
                var tb2 = new TransformBlock<int, int>(i => i);
                var tb3 = new TransformBlock<int, int>(i => i);
                wob.LinkTo(tb1);
                wob.LinkTo(tb2);
                wob.LinkTo(tb3);
                wob.Post(42);
                localPassed |= tb1.Receive() == 43;
                localPassed |= tb2.Receive() == 43;
                localPassed |= tb3.Receive() == 43;
                Console.WriteLine("{0}: Broadcasting", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            {
                // Test using a precanceled token
                localPassed = true;
                try
                {
                    var cts = new CancellationTokenSource();
                    cts.Cancel();
                    var dbo = new DataflowBlockOptions { CancellationToken = cts.Token };
                    var wob = new WriteOnceBlock<int>(i => i, dbo);

                    int ignoredValue;
                    IList<int> ignoredValues;
                    localPassed &= wob.LinkTo(new ActionBlock<int>(delegate { })) != null;
                    localPassed &= wob.SendAsync(42).Result == false;
                    localPassed &= ((IReceivableSourceBlock<int>)wob).TryReceiveAll(out ignoredValues) == false;
                    localPassed &= wob.Post(42) == false;
                    localPassed &= wob.TryReceive(out ignoredValue) == false;
                    localPassed &= wob.Completion != null;
                    wob.Complete();
                }
                catch (Exception)
                {
                    localPassed = false;
                }
                Console.WriteLine("{0}: Precanceled tokens work correctly", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            {
                // Test using token canceled after construction
                localPassed = true;
                try
                {
                    var cts = new CancellationTokenSource();
                    var dbo = new DataflowBlockOptions { CancellationToken = cts.Token };
                    var wob = new WriteOnceBlock<int>(i => i, dbo);
                    cts.Cancel();

                    int ignoredValue;
                    IList<int> ignoredValues;
                    localPassed &= wob.LinkTo(new ActionBlock<int>(delegate { })) != null;
                    localPassed &= wob.SendAsync(42).Result == false;
                    localPassed &= ((IReceivableSourceBlock<int>)wob).TryReceiveAll(out ignoredValues) == false;
                    localPassed &= wob.Post(42) == false;
                    localPassed &= wob.TryReceive(out ignoredValue) == false;
                    localPassed &= wob.Completion != null;
                    wob.Complete();
                }
                catch (Exception)
                {
                    localPassed = false;
                }
                Console.WriteLine("{0}: Precanceled tokens work correctly", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            Assert.True(passed, "Test failed.");
        }
        public void TestWriteOnceCloning()
        {
            // Test cloning when a clone function is provided
            {
                var writeOnce = new WriteOnceBlock<int>(x => -x);
                Assert.True(writeOnce.Post(42), "Expected initial post on cloning WriteOnce to succeed");
                Assert.False(writeOnce.Post(43), "Expected secondary post on cloning WriteOnce to fail");
                Assert.True(writeOnce.Receive() == -42, "Expected Receive'd data to be a clone");
                int item;
                Assert.True(writeOnce.TryReceive(out item) && item == -42, "Expected TryReceive'd data to be a clone");
                IList<int> items;
                Assert.True(((IReceivableSourceBlock<int>)writeOnce).TryReceiveAll(out items) && items.Count == 1 && items[0] == -42, "Expected TryReceiveAll'd data to be a clone");
                var ab = new ActionBlock<int>(i =>
                {
                    Assert.True(i == -42, "Expected propagated data to be a clone.");
                });
                writeOnce.LinkTo(ab);
                ab.Complete();
                Assert.True(ab.Completion.Wait(4000), "Expected action block to complete after cloned data flowed to it");
            }

            // Test successful processing when no clone function exists
            {
                var data = new object();
                var writeOnce = new WriteOnceBlock<object>(null);
                Assert.True(writeOnce.Post(data), "Expected initial post on non-cloning WriteOnce to succeed");
                Assert.False(writeOnce.Post(new object()), "Expected secondary post on non-cloning WriteOnce to fail");
                Assert.True(writeOnce.Receive() == data, "Expected Receive'd data to be original data");
                object item;
                Assert.True(writeOnce.TryReceive(out item) && item == data, "Expected TryReceive'd data to be original data");
                IList<object> items;
                Assert.True(((IReceivableSourceBlock<object>)writeOnce).TryReceiveAll(out items) && items.Count == 1 && items[0] == data, "Expected TryReceiveAll'd data to be original data");
                var ab = new ActionBlock<object>(i =>
                {
                    Assert.True(i == data, "Expected propagated data to be original data.");
                });
                writeOnce.LinkTo(ab);
                ab.Complete();
                Assert.True(ab.Completion.Wait(4000), "Expected action block to complete after original data flowed to it");
            }
        }
Esempio n. 40
0
		public void PostponedTest ()
		{
			var block = new WriteOnceBlock<int> (null);
			var target = new BufferBlock<int> (
				new DataflowBlockOptions { BoundedCapacity = 1 });
			block.LinkTo (target);

			Assert.IsTrue (target.Post (1));

			Assert.IsTrue (block.Post (2));

			Assert.AreEqual (1, target.Receive (TimeSpan.FromMilliseconds (100)));
			Assert.AreEqual (2, target.Receive (TimeSpan.FromMilliseconds (100)));
		}
Esempio n. 41
0
        public async Task TestCancellationBeforeAndAfterCtor()
        {
            foreach (bool before in DataflowTestHelpers.BooleanValues)
            {
                var cts = new CancellationTokenSource();
                if (before)
                {
                    cts.Cancel();
                }
                var wob = new WriteOnceBlock<int>(null, new DataflowBlockOptions { CancellationToken = cts.Token });
                if (!before)
                {
                    cts.Cancel();
                }

                int ignoredValue;
                IList<int> ignoredValues;

                Assert.NotNull(wob.LinkTo(DataflowBlock.NullTarget<int>()));
                Assert.False(wob.Post(42));
                Task<bool> sendTask = wob.SendAsync(43);
                Assert.True(sendTask.IsCompleted);
                Assert.False(sendTask.Result);
                Assert.False(wob.TryReceive(out ignoredValue));
                Assert.False(((IReceivableSourceBlock<int>)wob).TryReceiveAll(out ignoredValues));
                Assert.NotNull(wob.Completion);

                await Assert.ThrowsAnyAsync<OperationCanceledException>(() => wob.Completion);
            }
        }
Esempio n. 42
0
        public async Task WriteOnceToAction()
        {
            int completedCount = 0;
            var c = new ActionBlock<int>(i => completedCount++);
            var singleAssignments = Enumerable.Range(0, Iterations).Select(_ =>
            {
                var s = new WriteOnceBlock<int>(i => i);
                s.LinkTo(c);
                return s;
            }).ToList();
            var ignored = Task.WhenAll(singleAssignments.Select(s => s.Completion)).ContinueWith(
                _ => c.Complete(), CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default);

            foreach (var s in singleAssignments) s.Post(1);

            await c.Completion;
            Assert.Equal(expected: Iterations, actual: completedCount);
        }
Esempio n. 43
0
		public void DontOfferTwiceTest ()
		{
			var scheduler = new TestScheduler ();
			var block = new WriteOnceBlock<int> (null,
				new DataflowBlockOptions { TaskScheduler = scheduler });
			var target =
				new TestTargetBlock<int> { Postpone = true };
			block.LinkTo (target);

			Assert.IsFalse (target.HasPostponed);

			Assert.IsTrue (block.Post (1));

			scheduler.ExecuteAll ();

			Assert.IsTrue (target.HasPostponed);

			target.Postpone = false;

			int value;
			Assert.IsTrue (target.RetryPostponed (out value));
			Assert.AreEqual (1, value);

			block.LinkTo (new BufferBlock<int> ());

			scheduler.ExecuteAll ();

			Assert.AreEqual (default(int), target.DirectlyAccepted);
		}
Esempio n. 44
0
		public void QueuedMessageTest ()
		{
			var scheduler = new TestScheduler ();
			var block = new WriteOnceBlock<int> (null,
				new DataflowBlockOptions { TaskScheduler = scheduler });
			var target = new BufferBlock<int> ();
			block.LinkTo (target);

			Assert.IsTrue (block.Post (1));

			AssertEx.Throws<TimeoutException> (
				() => target.Receive (TimeSpan.FromMilliseconds (100)));

			scheduler.ExecuteAll ();

			int item;
			Assert.IsTrue (target.TryReceive (out item));
			Assert.AreEqual (1, item);
		}
Esempio n. 45
0
        public void RunWriteOnceBlockConformanceTests()
        {
            bool passed = true, localPassed = true;

            {
                // Test posting then receiving
                localPassed = true;
                var wob             = new WriteOnceBlock <int>(i => i);
                int successfulPosts = 0;
                for (int i = 10; i <= 20; i++)
                {
                    successfulPosts += wob.Post(i) ? 1 : 0;
                }
                localPassed |= successfulPosts == 1;
                localPassed |= wob.Receive() == 10;
                Console.WriteLine("{0}: Posting then receiving", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            {
                // Test receiving then posting
                localPassed = true;
                var wob = new WriteOnceBlock <int>(i => i);
                Task.Factory.StartNew(() =>
                {
                    Task.Delay(1000).Wait();
                    wob.Post(42);
                });
                localPassed |= wob.Receive() == 42;
                localPassed |= wob.Post(43) == false;
                wob.Completion.Wait();
                Console.WriteLine("{0}: Receiving then posting", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            {
                // Test broadcasting
                localPassed = true;
                var wob = new WriteOnceBlock <int>(i => i + 1);
                var tb1 = new TransformBlock <int, int>(i => i);
                var tb2 = new TransformBlock <int, int>(i => i);
                var tb3 = new TransformBlock <int, int>(i => i);
                wob.LinkTo(tb1);
                wob.LinkTo(tb2);
                wob.LinkTo(tb3);
                wob.Post(42);
                localPassed |= tb1.Receive() == 43;
                localPassed |= tb2.Receive() == 43;
                localPassed |= tb3.Receive() == 43;
                Console.WriteLine("{0}: Broadcasting", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            {
                // Test using a precanceled token
                localPassed = true;
                try
                {
                    var cts = new CancellationTokenSource();
                    cts.Cancel();
                    var dbo = new DataflowBlockOptions {
                        CancellationToken = cts.Token
                    };
                    var wob = new WriteOnceBlock <int>(i => i, dbo);

                    int         ignoredValue;
                    IList <int> ignoredValues;
                    localPassed &= wob.LinkTo(new ActionBlock <int>(delegate { })) != null;
                    localPassed &= wob.SendAsync(42).Result == false;
                    localPassed &= ((IReceivableSourceBlock <int>)wob).TryReceiveAll(out ignoredValues) == false;
                    localPassed &= wob.Post(42) == false;
                    localPassed &= wob.TryReceive(out ignoredValue) == false;
                    localPassed &= wob.Completion != null;
                    wob.Complete();
                }
                catch (Exception)
                {
                    localPassed = false;
                }
                Console.WriteLine("{0}: Precanceled tokens work correctly", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            {
                // Test using token canceled after construction
                localPassed = true;
                try
                {
                    var cts = new CancellationTokenSource();
                    var dbo = new DataflowBlockOptions {
                        CancellationToken = cts.Token
                    };
                    var wob = new WriteOnceBlock <int>(i => i, dbo);
                    cts.Cancel();

                    int         ignoredValue;
                    IList <int> ignoredValues;
                    localPassed &= wob.LinkTo(new ActionBlock <int>(delegate { })) != null;
                    localPassed &= wob.SendAsync(42).Result == false;
                    localPassed &= ((IReceivableSourceBlock <int>)wob).TryReceiveAll(out ignoredValues) == false;
                    localPassed &= wob.Post(42) == false;
                    localPassed &= wob.TryReceive(out ignoredValue) == false;
                    localPassed &= wob.Completion != null;
                    wob.Complete();
                }
                catch (Exception)
                {
                    localPassed = false;
                }
                Console.WriteLine("{0}: Precanceled tokens work correctly", localPassed ? "Success" : "Failure");
                passed &= localPassed;
            }

            Assert.True(passed, "Test failed.");
        }
        public void TestCanceledLinking()
        {
            bool passed = true;

            var cts = new CancellationTokenSource();
            cts.Cancel();
            var options = new DataflowBlockOptions { CancellationToken = cts.Token };
            var writeOnce = new WriteOnceBlock<int>(x => x, options);
            var target = new ActionBlock<int>(x => { });
            try
            {
                writeOnce.LinkTo(target);
                Console.WriteLine("Completed without exception - Passed");
            }
            catch (Exception)
            {
                passed = false;
                Console.WriteLine("Completed without exception - FAILED");
            }

            Assert.True(passed, "Test failed.");
        }
Esempio n. 47
0
 public async Task TestBroadcasting()
 {
     var wob = new WriteOnceBlock<int>(i => i + 1);
     var targets = Enumerable.Range(0, 3).Select(_ => new TransformBlock<int, int>(i => i)).ToArray();
     foreach (var target in targets)
     {
         wob.LinkTo(target);
     }
     wob.Post(42);
     foreach (var target in targets)
     {
         Assert.Equal(expected: 43, actual: await target.ReceiveAsync());
     }
 }
Esempio n. 48
0
		public void WriteOnceBehaviorTest ()
		{
			bool act1 = false, act2 = false;
			var evt = new CountdownEvent (2);

			var broadcast = new WriteOnceBlock<int> (null);
			var action1 = new ActionBlock<int> (i => { act1 = i == 42; evt.Signal (); });
			var action2 = new ActionBlock<int> (i => { act2 = i == 42; evt.Signal (); });

			broadcast.LinkTo (action1);
			broadcast.LinkTo (action2);

			Assert.IsTrue (broadcast.Post (42));

			evt.Wait ();

			Assert.IsTrue (act1);
			Assert.IsTrue (act2);

			Assert.IsFalse (broadcast.Post (24));
			Thread.Sleep (1600);

			Assert.IsTrue (act1);
			Assert.IsTrue (act2);
		}