Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

349 lines
11 KiB
C#

// GreedyTest.cs
//
// Copyright (c) 2012 Petr Onderka
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
using System;
using System.Threading.Tasks.Dataflow;
using NUnit.Framework;
namespace MonoTests.System.Threading.Tasks.Dataflow {
[TestFixture]
public class GreedyTest {
[Test]
public void GreedyJoinTest ()
{
var scheduler = new TestScheduler ();
var block =
new JoinBlock<int, int> (new GroupingDataflowBlockOptions
{ TaskScheduler = scheduler });
var source1 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source2 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
Assert.IsNotNull (source1.LinkTo (block.Target1));
Assert.IsNotNull (source2.LinkTo (block.Target2));
Assert.IsTrue (source1.Post (1));
scheduler.ExecuteAll ();
int i;
Assert.IsFalse (source1.TryReceive (out i));
Assert.IsTrue (source2.Post (11));
scheduler.ExecuteAll ();
Assert.IsFalse (source2.TryReceive (out i));
Tuple<int, int> tuple;
Assert.IsTrue (block.TryReceive (out tuple));
Assert.AreEqual (Tuple.Create (1, 11), tuple);
}
[Test]
public void GreedyJoin3Test ()
{
var scheduler = new TestScheduler ();
var block =
new JoinBlock<int, int, int> (new GroupingDataflowBlockOptions
{ TaskScheduler = scheduler });
var source1 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source2 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source3 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
Assert.IsNotNull (source1.LinkTo (block.Target1));
Assert.IsNotNull (source2.LinkTo (block.Target2));
Assert.IsNotNull (source3.LinkTo (block.Target3));
Assert.IsTrue (source1.Post (1));
scheduler.ExecuteAll ();
int i;
Assert.IsFalse (source1.TryReceive (out i));
Assert.IsTrue (source2.Post (11));
Assert.IsTrue (source3.Post (21));
scheduler.ExecuteAll ();
Assert.IsFalse (source2.TryReceive (out i));
Assert.IsFalse (source3.TryReceive (out i));
Tuple<int, int, int> tuple;
Assert.IsTrue (block.TryReceive (out tuple));
Assert.AreEqual (Tuple.Create (1, 11, 21), tuple);
}
[Test]
public void NonGreedyJoinTest ()
{
var scheduler = new TestScheduler ();
var block =
new JoinBlock<int, int> (new GroupingDataflowBlockOptions
{ TaskScheduler = scheduler, Greedy = false });
var source1 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source2 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
Assert.IsNotNull (source1.LinkTo (block.Target1));
Assert.IsNotNull (source2.LinkTo (block.Target2));
Assert.IsTrue (source1.Post (1));
scheduler.ExecuteAll ();
int i;
Assert.IsTrue (source1.TryReceive (out i));
Assert.IsTrue (source1.Post (2));
Assert.IsTrue (source2.Post (11));
scheduler.ExecuteAll ();
Assert.IsFalse (source1.TryReceive (out i));
Assert.IsFalse (source2.TryReceive (out i));
Tuple<int, int> tuple;
Assert.IsTrue (block.TryReceive (out tuple));
Assert.AreEqual (Tuple.Create (2, 11), tuple);
}
[Test]
public void NonGreedyJoin3Test ()
{
var scheduler = new TestScheduler ();
var block =
new JoinBlock<int, int, int> (new GroupingDataflowBlockOptions
{ TaskScheduler = scheduler, Greedy = false });
var source1 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source2 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source3 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
Assert.IsNotNull (source1.LinkTo (block.Target1));
Assert.IsNotNull (source2.LinkTo (block.Target2));
Assert.IsNotNull (source3.LinkTo (block.Target3));
Assert.IsTrue (source1.Post (1));
scheduler.ExecuteAll ();
int i;
Assert.IsTrue (source1.TryReceive (out i));
Assert.IsTrue (source1.Post (2));
Assert.IsTrue (source2.Post (11));
Assert.IsTrue (source3.Post (21));
scheduler.ExecuteAll ();
Assert.IsFalse (source1.TryReceive (out i));
Assert.IsFalse (source2.TryReceive (out i));
Assert.IsFalse (source3.TryReceive (out i));
Tuple<int, int, int> tuple;
Assert.IsTrue (block.TryReceive (out tuple));
Assert.AreEqual (Tuple.Create (2, 11, 21), tuple);
}
[Test]
public void NonGreedyJoinWithPostTest ()
{
var block =
new JoinBlock<int, int> (new GroupingDataflowBlockOptions { Greedy = false });
Assert.IsFalse (block.Target1.Post (42));
}
[Test]
public void NonGreedyBatchTest ()
{
var scheduler = new TestScheduler ();
var block = new BatchBlock<int> (3,
new GroupingDataflowBlockOptions
{ Greedy = false, TaskScheduler = scheduler });
Assert.IsFalse (block.Post (42));
var source =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
Assert.IsNotNull (source.LinkTo (block));
Assert.IsTrue (source.Post (43));
scheduler.ExecuteAll ();
int i;
Assert.IsTrue (source.TryReceive (null, out i));
Assert.AreEqual (43, i);
Assert.IsTrue (source.Post (44));
Assert.IsTrue (source.Post (45));
var source2 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
Assert.IsNotNull (source2.LinkTo (block));
Assert.IsTrue (source2.Post (142));
scheduler.ExecuteAll ();
int[] batch;
Assert.IsFalse (block.TryReceive (null, out batch));
Assert.IsNull (batch);
block.TriggerBatch ();
scheduler.ExecuteAll ();
Assert.IsTrue (block.TryReceive (null, out batch));
CollectionAssert.AreEquivalent (new[] { 44, 142 }, batch);
}
[Test]
public void NonGreedyBatchWithMoreSourcesTest ()
{
var scheduler = new TestScheduler ();
var block = new BatchBlock<int> (2,
new GroupingDataflowBlockOptions
{ Greedy = false, TaskScheduler = scheduler });
var source1 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source2 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
Assert.IsNotNull (source1.LinkTo (block));
Assert.IsNotNull (source2.LinkTo (block));
Assert.IsTrue (source1.Post (43));
scheduler.ExecuteAll ();
int i;
Assert.IsTrue (source1.TryReceive (out i));
Assert.AreEqual (43, i);
Assert.IsTrue (source1.Post (44));
Assert.IsTrue (source2.Post (45));
scheduler.ExecuteAll ();
int[] batch;
Assert.IsTrue (block.TryReceive (out batch));
CollectionAssert.AreEquivalent (new[] { 44, 45 }, batch);
}
[Test]
public void NonGreedyBatchedJoinTest ()
{
AssertEx.Throws<ArgumentException> (
() => new BatchedJoinBlock<int, int> (2,
new GroupingDataflowBlockOptions { Greedy = false }));
}
[Test]
public void NonGreedyBatchedJoin3Test ()
{
AssertEx.Throws<ArgumentException> (
() => new BatchedJoinBlock<int, int, int> (2,
new GroupingDataflowBlockOptions { Greedy = false }));
}
[Test]
public void NonGreedyJoinWithBoundedCapacityTest ()
{
var scheduler = new TestScheduler ();
var block = new JoinBlock<int, int> (
new GroupingDataflowBlockOptions
{ Greedy = false, BoundedCapacity = 1, TaskScheduler = scheduler });
var source1 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source2 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
Assert.IsNotNull (source1.LinkTo (block.Target1));
Assert.IsNotNull (source2.LinkTo (block.Target2));
Assert.IsTrue (source1.Post (11));
Assert.IsTrue (source2.Post (21));
scheduler.ExecuteAll ();
Assert.IsTrue (source1.Post (12));
Assert.IsTrue (source2.Post (22));
scheduler.ExecuteAll ();
int i;
Assert.IsTrue (source1.TryReceive (out i));
Assert.AreEqual (12, i);
Assert.IsTrue (source1.Post (13));
Tuple<int, int> tuple;
Assert.IsTrue (block.TryReceive (out tuple));
Assert.AreEqual (Tuple.Create (11, 21), tuple);
scheduler.ExecuteAll ();
Assert.IsTrue (block.TryReceive (out tuple));
Assert.AreEqual (Tuple.Create (13, 22), tuple);
}
[Test]
public void NonGreedyJoin3WithBoundedCapacityTest ()
{
var scheduler = new TestScheduler ();
var block = new JoinBlock<int, int, int> (
new GroupingDataflowBlockOptions
{ Greedy = false, BoundedCapacity = 1, TaskScheduler = scheduler });
var source1 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source2 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
var source3 =
new BufferBlock<int> (new DataflowBlockOptions { TaskScheduler = scheduler });
Assert.IsNotNull (source1.LinkTo (block.Target1));
Assert.IsNotNull (source2.LinkTo (block.Target2));
Assert.IsNotNull (source3.LinkTo (block.Target3));
Assert.IsTrue (source1.Post (11));
Assert.IsTrue (source2.Post (21));
Assert.IsTrue (source3.Post (31));
scheduler.ExecuteAll ();
Assert.IsTrue (source1.Post (12));
Assert.IsTrue (source2.Post (22));
Assert.IsTrue (source3.Post (32));
scheduler.ExecuteAll ();
int i;
Assert.IsTrue (source1.TryReceive (out i));
Assert.AreEqual (12, i);
Assert.IsTrue (source1.Post (13));
Tuple<int, int, int> tuple;
Assert.IsTrue (block.TryReceive (out tuple));
Assert.AreEqual (Tuple.Create (11, 21, 31), tuple);
scheduler.ExecuteAll ();
Assert.IsTrue (block.TryReceive (out tuple));
Assert.AreEqual (Tuple.Create (13, 22, 32), tuple);
}
}
}