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)); }
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)); }
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); }
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); }
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!"); }
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); } }
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."); }
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); } }
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()); }
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); }
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); }
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()); } }
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))); }
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); }
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); }
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"); } }
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(); }
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); }
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(); }
// 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(); }
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 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); }
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; } }
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); }
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); }
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); }
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"); } }
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))); }
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); } }
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); }
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 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); }
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."); }
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()); } }
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); }