diff --git a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/ConcurrentTests.cs b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/ConcurrentTests.cs index 1f8ed5777074f3..88c9f4b30b83b4 100644 --- a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/ConcurrentTests.cs +++ b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/ConcurrentTests.cs @@ -163,7 +163,7 @@ private static BufferBlock ConstructBufferNewWithNMessages(int messagesCoun { var block = new BufferBlock(); block.PostRange(0, messagesCount); - SpinWait.SpinUntil(() => block.Count == messagesCount); // spin until messages available + Assert.True(SpinWait.SpinUntil(() => block.Count == messagesCount, DataflowTestHelpers.SpinTimeoutMs)); // spin until messages available return block; } @@ -171,7 +171,7 @@ private static TransformBlock ConstructTransformWithNMessages(int m { var block = new TransformBlock(i => i.ToString()); block.PostRange(0, messagesCount); - SpinWait.SpinUntil(() => block.OutputCount == messagesCount); + Assert.True(SpinWait.SpinUntil(() => block.OutputCount == messagesCount, DataflowTestHelpers.SpinTimeoutMs)); return block; } @@ -179,7 +179,7 @@ private static TransformManyBlock ConstructTransformManyWithNMessages( { var block = new TransformManyBlock(i => new int[] { i }); block.PostRange(0, messagesCount); - SpinWait.SpinUntil(() => block.OutputCount == messagesCount); // spin until messages available + Assert.True(SpinWait.SpinUntil(() => block.OutputCount == messagesCount, DataflowTestHelpers.SpinTimeoutMs)); // spin until messages available return block; } @@ -187,7 +187,7 @@ private static BatchBlock ConstructBatchNewWithNMessages(int messagesCount) { var block = new BatchBlock(1); block.PostRange(0, messagesCount); - SpinWait.SpinUntil(() => block.OutputCount == messagesCount); // spin until messages available + Assert.True(SpinWait.SpinUntil(() => block.OutputCount == messagesCount, DataflowTestHelpers.SpinTimeoutMs)); // spin until messages available return block; } @@ -199,7 +199,7 @@ private static BatchedJoinBlock ConstructBatchedJoin2NewWithNMessages( block.Target1.Post(i); block.Target2.Post(i); } - SpinWait.SpinUntil(() => block.OutputCount == messagesCount); // spin until messages available + Assert.True(SpinWait.SpinUntil(() => block.OutputCount == messagesCount, DataflowTestHelpers.SpinTimeoutMs)); // spin until messages available return block; } @@ -223,7 +223,7 @@ private static JoinBlock ConstructJoinNewWithNMessages(int messagesCou var block = new JoinBlock(); block.Target1.PostRange(0, messagesCount); block.Target2.PostRange(0, messagesCount); - SpinWait.SpinUntil(() => block.OutputCount == messagesCount); // spin until messages available + Assert.True(SpinWait.SpinUntil(() => block.OutputCount == messagesCount, DataflowTestHelpers.SpinTimeoutMs)); // spin until messages available return block; } diff --git a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/DataflowTestHelper.cs b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/DataflowTestHelper.cs index 3dbabb20246d74..8679d3908bb071 100644 --- a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/DataflowTestHelper.cs +++ b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/DataflowTestHelper.cs @@ -12,6 +12,9 @@ internal static partial class DataflowTestHelpers internal static bool[] BooleanValues = { true, false }; internal static Func> ToEnumerable = item => Enumerable.Repeat(item, 1); + /// Timeout in milliseconds for spin-wait operations in tests, to avoid indefinite hangs under stress. + internal const int SpinTimeoutMs = 30_000; + internal static ITargetBlock PostRange(this ITargetBlock target, int lowerBoundInclusive, int upperBoundExclusive) { return PostRange(target, lowerBoundInclusive, upperBoundExclusive, i => i); diff --git a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformBlockTests.cs b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformBlockTests.cs index 069abcee3c745c..6934cc51bb52cf 100644 --- a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformBlockTests.cs +++ b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformBlockTests.cs @@ -324,7 +324,7 @@ public async Task TestCount() Assert.Equal(expected: 0, actual: tb.OutputCount); tb.PostRange(1, 11); - await Task.Run(() => SpinWait.SpinUntil(() => tb.OutputCount == 10)); + Assert.True(await Task.Run(() => SpinWait.SpinUntil(() => tb.OutputCount == 10, DataflowTestHelpers.SpinTimeoutMs))); for (int i = 10; i > 0; i--) { int item; diff --git a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformManyBlockTests.IAsyncEnumerable.cs b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformManyBlockTests.IAsyncEnumerable.cs index 73205b6057341f..f92413c804bb7c 100644 --- a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformManyBlockTests.IAsyncEnumerable.cs +++ b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformManyBlockTests.IAsyncEnumerable.cs @@ -339,7 +339,7 @@ public async Task TestCountAsyncEnumerable() Assert.Equal(expected: 0, actual: tb.OutputCount); tb.PostRange(1, 11); - await Task.Run(() => SpinWait.SpinUntil(() => tb.OutputCount == 10)); + Assert.True(await Task.Run(() => SpinWait.SpinUntil(() => tb.OutputCount == 10, DataflowTestHelpers.SpinTimeoutMs))); for (int i = 10; i > 0; i--) { Assert.True(tb.TryReceive(out int item)); diff --git a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformManyBlockTests.cs b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformManyBlockTests.cs index 53e4bf816a4d40..6f32a0d246fbeb 100644 --- a/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformManyBlockTests.cs +++ b/src/libraries/System.Threading.Tasks.Dataflow/tests/Dataflow/TransformManyBlockTests.cs @@ -352,7 +352,7 @@ public async Task TestCount() Assert.Equal(expected: 0, actual: tb.OutputCount); tb.PostRange(1, 11); - await Task.Run(() => SpinWait.SpinUntil(() => tb.OutputCount == 10)); + Assert.True(await Task.Run(() => SpinWait.SpinUntil(() => tb.OutputCount == 10, DataflowTestHelpers.SpinTimeoutMs))); for (int i = 10; i > 0; i--) { int item;