From 8705e222009ea371ea1ab768e2c3f83ab45e3d16 Mon Sep 17 00:00:00 2001 From: Jimmy Byrd Date: Sun, 7 Apr 2024 20:21:33 -0400 Subject: [PATCH] Try fix parallelism tests (#45) * Try fix parallelism tests * attempt 2 * attempt 3 * attempt 4 --- Directory.Build.props | 2 + .../CancellablePoolingValueTaskTests.fs | 53 ++++++++++++------- tests/IcedTasks.Tests/CancellableTaskTests.fs | 52 +++++++++++------- .../CancellableValueTaskTests.fs | 52 +++++++++++------- .../IcedTasks.Tests/PoolingValueTaskTests.fs | 52 +++++++++++------- tests/IcedTasks.Tests/TaskTests.fs | 52 ++++++++++++------ tests/IcedTasks.Tests/ValueTaskTests.fs | 52 ++++++++++++------ 7 files changed, 208 insertions(+), 107 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 5dfbb65..20c0b98 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,6 +10,8 @@ $(OtherFlags) --test:GraphBasedChecking --test:ParallelIlxGen --test:ParallelOptimization false + $(NoWarn);FS2003; NU1903; NU1904 + true diff --git a/tests/IcedTasks.Tests/CancellablePoolingValueTaskTests.fs b/tests/IcedTasks.Tests/CancellablePoolingValueTaskTests.fs index 17c24de..cf1a03a 100644 --- a/tests/IcedTasks.Tests/CancellablePoolingValueTaskTests.fs +++ b/tests/IcedTasks.Tests/CancellablePoolingValueTaskTests.fs @@ -956,32 +956,47 @@ module CancellablePoolingValueTaskTests = } ] - - testList "MergeSourcesParallel" [ + testSequencedGroup "MergeSourcesParallel - cancellablePoolingValueTask" + <| testList "MergeSourcesParallel" [ testPropertyWithConfig Expecto.fsCheckConfig "parallelism" <| fun () -> asyncEx { - let! ct = Async.CancellationToken let sequencedList = ResizeArray<_>() let parallelList = ResizeArray<_>() - let doOtherStuff (l: ResizeArray<_>) x = + let fakeWork id yieldTimes (l: ResizeArray<_>) = cancellablePoolingValueTask { - lock l (fun () -> l.Add(x)) - do! Task.yieldMany 1000 + lock l (fun () -> l.Add(id)) + do! Task.yieldMany yieldTimes let dt = DateTimeOffset.UtcNow - lock l (fun () -> l.Add(x)) + lock l (fun () -> l.Add(id)) return dt } + // Have earlier tasks take longer to complete + // so we can see if they are sequenced or not + let fakeWork1 l = + cancellablePoolingValueTask { + do! Task.Delay 15 + let! x = fakeWork 1 10000 l + do! Task.Delay 15 + return x + } + + let fakeWork2 = fakeWork 2 750 + let fakeWork3 = fakeWork 3 500 + let fakeWork4 = fakeWork 4 250 + let fakeWork5 = fakeWork 5 100 + let fakeWork6 = fakeWork 6 1 + let! sequenced = cancellablePoolingValueTask { - let! a = doOtherStuff sequencedList 1 - let! b = doOtherStuff sequencedList 2 - let! c = doOtherStuff sequencedList 3 - let! d = doOtherStuff sequencedList 4 - let! e = doOtherStuff sequencedList 5 - let! f = doOtherStuff sequencedList 6 + let! a = fakeWork1 sequencedList + let! b = fakeWork2 sequencedList + let! c = fakeWork3 sequencedList + let! d = fakeWork4 sequencedList + let! e = fakeWork5 sequencedList + let! f = fakeWork6 sequencedList return [ a @@ -995,12 +1010,12 @@ module CancellablePoolingValueTaskTests = let! paralleled = cancellablePoolingValueTask { - let! a = doOtherStuff parallelList 1 - and! b = doOtherStuff parallelList 2 - and! c = doOtherStuff parallelList 3 - and! d = doOtherStuff parallelList 4 - and! e = doOtherStuff parallelList 5 - and! f = doOtherStuff parallelList 6 + let! a = fakeWork1 parallelList + and! b = fakeWork2 parallelList + and! c = fakeWork3 parallelList + and! d = fakeWork4 parallelList + and! e = fakeWork5 parallelList + and! f = fakeWork6 parallelList return [ a diff --git a/tests/IcedTasks.Tests/CancellableTaskTests.fs b/tests/IcedTasks.Tests/CancellableTaskTests.fs index d4c57a3..1aad93f 100644 --- a/tests/IcedTasks.Tests/CancellableTaskTests.fs +++ b/tests/IcedTasks.Tests/CancellableTaskTests.fs @@ -915,8 +915,8 @@ module CancellableTaskTests = } ] - - testList "MergeSourcesParallel" [ + testSequencedGroup "MergeSourcesParallel - cancellableTask" + <| testList "MergeSourcesParallel" [ testPropertyWithConfig Expecto.fsCheckConfig "parallelism" <| fun () -> asyncEx { @@ -924,23 +924,39 @@ module CancellableTaskTests = let sequencedList = ResizeArray<_>() let parallelList = ResizeArray<_>() - let doOtherStuff (l: ResizeArray<_>) x = + let fakeWork id yieldTimes (l: ResizeArray<_>) = cancellableTask { - lock l (fun () -> l.Add(x)) - do! Task.yieldMany 1000 + lock l (fun () -> l.Add(id)) + do! Task.yieldMany yieldTimes let dt = DateTimeOffset.UtcNow - lock l (fun () -> l.Add(x)) + lock l (fun () -> l.Add(id)) return dt } + // Have earlier tasks take longer to complete + // so we can see if they are sequenced or not + let fakeWork1 l = + cancellableTask { + do! Task.Delay 15 + let! x = fakeWork 1 10000 l + do! Task.Delay 15 + return x + } + + let fakeWork2 = fakeWork 2 750 + let fakeWork3 = fakeWork 3 500 + let fakeWork4 = fakeWork 4 250 + let fakeWork5 = fakeWork 5 100 + let fakeWork6 = fakeWork 6 1 + let! sequenced = cancellableTask { - let! a = doOtherStuff sequencedList 1 - let! b = doOtherStuff sequencedList 2 - let! c = doOtherStuff sequencedList 3 - let! d = doOtherStuff sequencedList 4 - let! e = doOtherStuff sequencedList 5 - let! f = doOtherStuff sequencedList 6 + let! a = fakeWork1 sequencedList + let! b = fakeWork2 sequencedList + let! c = fakeWork3 sequencedList + let! d = fakeWork4 sequencedList + let! e = fakeWork5 sequencedList + let! f = fakeWork6 sequencedList return [ a @@ -954,12 +970,12 @@ module CancellableTaskTests = let! paralleled = cancellableTask { - let! a = doOtherStuff parallelList 1 - and! b = doOtherStuff parallelList 2 - and! c = doOtherStuff parallelList 3 - and! d = doOtherStuff parallelList 4 - and! e = doOtherStuff parallelList 5 - and! f = doOtherStuff parallelList 6 + let! a = fakeWork1 parallelList + and! b = fakeWork2 parallelList + and! c = fakeWork3 parallelList + and! d = fakeWork4 parallelList + and! e = fakeWork5 parallelList + and! f = fakeWork6 parallelList return [ a diff --git a/tests/IcedTasks.Tests/CancellableValueTaskTests.fs b/tests/IcedTasks.Tests/CancellableValueTaskTests.fs index 0f33263..d9b2b3b 100644 --- a/tests/IcedTasks.Tests/CancellableValueTaskTests.fs +++ b/tests/IcedTasks.Tests/CancellableValueTaskTests.fs @@ -953,31 +953,47 @@ module CancellableValueTaskTests = Expect.equal actual 6 "" } ] - - testList "MergeSourcesParallel" [ + testSequencedGroup "MergeSourcesParallel - cancellableValueTask" + <| testList "MergeSourcesParallel" [ testPropertyWithConfig Expecto.fsCheckConfig "parallelism" <| fun () -> asyncEx { let sequencedList = ResizeArray<_>() let parallelList = ResizeArray<_>() - let doOtherStuff (l: ResizeArray<_>) x = + let fakeWork id yieldTimes (l: ResizeArray<_>) = cancellableValueTask { - lock l (fun () -> l.Add(x)) - do! Task.yieldMany 1000 + lock l (fun () -> l.Add(id)) + do! Task.yieldMany yieldTimes let dt = DateTimeOffset.UtcNow - lock l (fun () -> l.Add(x)) + lock l (fun () -> l.Add(id)) return dt } + // Have earlier tasks take longer to complete + // so we can see if they are sequenced or not + let fakeWork1 l = + cancellableValueTask { + do! Task.Delay 15 + let! x = fakeWork 1 10000 l + do! Task.Delay 15 + return x + } + + let fakeWork2 = fakeWork 2 750 + let fakeWork3 = fakeWork 3 500 + let fakeWork4 = fakeWork 4 250 + let fakeWork5 = fakeWork 5 100 + let fakeWork6 = fakeWork 6 1 + let! sequenced = cancellableValueTask { - let! a = doOtherStuff sequencedList 1 - let! b = doOtherStuff sequencedList 2 - let! c = doOtherStuff sequencedList 3 - let! d = doOtherStuff sequencedList 4 - let! e = doOtherStuff sequencedList 5 - let! f = doOtherStuff sequencedList 6 + let! a = fakeWork1 sequencedList + let! b = fakeWork2 sequencedList + let! c = fakeWork3 sequencedList + let! d = fakeWork4 sequencedList + let! e = fakeWork5 sequencedList + let! f = fakeWork6 sequencedList return [ a @@ -991,12 +1007,12 @@ module CancellableValueTaskTests = let! paralleled = cancellableValueTask { - let! a = doOtherStuff parallelList 1 - and! b = doOtherStuff parallelList 2 - and! c = doOtherStuff parallelList 3 - and! d = doOtherStuff parallelList 4 - and! e = doOtherStuff parallelList 5 - and! f = doOtherStuff parallelList 6 + let! a = fakeWork1 parallelList + and! b = fakeWork2 parallelList + and! c = fakeWork3 parallelList + and! d = fakeWork4 parallelList + and! e = fakeWork5 parallelList + and! f = fakeWork6 parallelList return [ a diff --git a/tests/IcedTasks.Tests/PoolingValueTaskTests.fs b/tests/IcedTasks.Tests/PoolingValueTaskTests.fs index 99d6b45..6fbaef2 100644 --- a/tests/IcedTasks.Tests/PoolingValueTaskTests.fs +++ b/tests/IcedTasks.Tests/PoolingValueTaskTests.fs @@ -679,8 +679,8 @@ module PoolingValueTaskTests = } ] - - testList "MergeSourcesParallel" [ + testSequencedGroup "MergeSourcesParallel - poolingValueTask" + <| testList "MergeSourcesParallel" [ testPropertyWithConfig Expecto.fsCheckConfig "parallelism" <| fun () -> asyncEx { @@ -688,23 +688,39 @@ module PoolingValueTaskTests = let sequencedList = ResizeArray<_>() let parallelList = ResizeArray<_>() - let doOtherStuff (l: ResizeArray<_>) x = + let fakeWork id yieldTimes (l: ResizeArray<_>) = poolingValueTask { - lock l (fun () -> l.Add(x)) - do! Task.yieldMany 1000 + lock l (fun () -> l.Add(id)) + do! Task.yieldMany yieldTimes let dt = DateTimeOffset.UtcNow - lock l (fun () -> l.Add(x)) + lock l (fun () -> l.Add(id)) return dt } + // Have earlier tasks take longer to complete + // so we can see if they are sequenced or not + let fakeWork1 l = + poolingValueTask { + do! Task.Delay 15 + let! x = fakeWork 1 10000 l + do! Task.Delay 15 + return x + } + + let fakeWork2 = fakeWork 2 750 + let fakeWork3 = fakeWork 3 500 + let fakeWork4 = fakeWork 4 250 + let fakeWork5 = fakeWork 5 100 + let fakeWork6 = fakeWork 6 1 + let! sequenced = poolingValueTask { - let! a = doOtherStuff sequencedList 1 - let! b = doOtherStuff sequencedList 2 - let! c = doOtherStuff sequencedList 3 - let! d = doOtherStuff sequencedList 4 - let! e = doOtherStuff sequencedList 5 - let! f = doOtherStuff sequencedList 6 + let! a = fakeWork1 sequencedList + let! b = fakeWork2 sequencedList + let! c = fakeWork3 sequencedList + let! d = fakeWork4 sequencedList + let! e = fakeWork5 sequencedList + let! f = fakeWork6 sequencedList return [ a @@ -718,12 +734,12 @@ module PoolingValueTaskTests = let! paralleled = poolingValueTask { - let! a = doOtherStuff parallelList 1 - and! b = doOtherStuff parallelList 2 - and! c = doOtherStuff parallelList 3 - and! d = doOtherStuff parallelList 4 - and! e = doOtherStuff parallelList 5 - and! f = doOtherStuff parallelList 6 + let! a = fakeWork1 parallelList + and! b = fakeWork2 parallelList + and! c = fakeWork3 parallelList + and! d = fakeWork4 parallelList + and! e = fakeWork5 parallelList + and! f = fakeWork6 parallelList return [ a diff --git a/tests/IcedTasks.Tests/TaskTests.fs b/tests/IcedTasks.Tests/TaskTests.fs index 0f533bb..57f38d5 100644 --- a/tests/IcedTasks.Tests/TaskTests.fs +++ b/tests/IcedTasks.Tests/TaskTests.fs @@ -683,7 +683,8 @@ module TaskTests = ] - testList "MergeSourcesParallel" [ + testSequencedGroup "MergeSourcesParallel - task" + <| testList "MergeSourcesParallel" [ testPropertyWithConfig Expecto.fsCheckConfig "parallelism" <| fun () -> asyncEx { @@ -691,23 +692,40 @@ module TaskTests = let sequencedList = ResizeArray<_>() let parallelList = ResizeArray<_>() - let doOtherStuff (l: ResizeArray<_>) x = + + let fakeWork id yieldTimes (l: ResizeArray<_>) = task { - lock l (fun () -> l.Add(x)) - do! Task.yieldMany 1000 + lock l (fun () -> l.Add(id)) + do! Task.yieldMany yieldTimes let dt = DateTimeOffset.UtcNow - lock l (fun () -> l.Add(x)) + lock l (fun () -> l.Add(id)) return dt } + // Have earlier tasks take longer to complete + // so we can see if they are sequenced or not + let fakeWork1 l = + task { + do! Task.Delay 15 + let! x = fakeWork 1 10000 l + do! Task.Delay 15 + return x + } + + let fakeWork2 = fakeWork 2 750 + let fakeWork3 = fakeWork 3 500 + let fakeWork4 = fakeWork 4 250 + let fakeWork5 = fakeWork 5 100 + let fakeWork6 = fakeWork 6 1 + let! sequenced = task { - let! a = doOtherStuff sequencedList 1 - let! b = doOtherStuff sequencedList 2 - let! c = doOtherStuff sequencedList 3 - let! d = doOtherStuff sequencedList 4 - let! e = doOtherStuff sequencedList 5 - let! f = doOtherStuff sequencedList 6 + let! a = fakeWork1 sequencedList + let! b = fakeWork2 sequencedList + let! c = fakeWork3 sequencedList + let! d = fakeWork4 sequencedList + let! e = fakeWork5 sequencedList + let! f = fakeWork6 sequencedList return [ a @@ -721,12 +739,12 @@ module TaskTests = let! paralleled = task { - let! a = doOtherStuff parallelList 1 - and! b = doOtherStuff parallelList 2 - and! c = doOtherStuff parallelList 3 - and! d = doOtherStuff parallelList 4 - and! e = doOtherStuff parallelList 5 - and! f = doOtherStuff parallelList 6 + let! a = fakeWork1 parallelList + and! b = fakeWork2 parallelList + and! c = fakeWork3 parallelList + and! d = fakeWork4 parallelList + and! e = fakeWork5 parallelList + and! f = fakeWork6 parallelList return [ a diff --git a/tests/IcedTasks.Tests/ValueTaskTests.fs b/tests/IcedTasks.Tests/ValueTaskTests.fs index 7839f6a..95cb520 100644 --- a/tests/IcedTasks.Tests/ValueTaskTests.fs +++ b/tests/IcedTasks.Tests/ValueTaskTests.fs @@ -680,7 +680,8 @@ module ValueTaskTests = } ] - testList "MergeSourcesParallel" [ + testSequencedGroup "MergeSourcesParallel - valueTask" + <| testList "MergeSourcesParallel" [ testPropertyWithConfig Expecto.fsCheckConfig "parallelism" <| fun () -> asyncEx { @@ -688,23 +689,40 @@ module ValueTaskTests = let sequencedList = ResizeArray<_>() let parallelList = ResizeArray<_>() - let doOtherStuff (l: ResizeArray<_>) x = + + let fakeWork id yieldTimes (l: ResizeArray<_>) = valueTask { - lock l (fun () -> l.Add(x)) - do! Task.yieldMany 1000 + lock l (fun () -> l.Add(id)) + do! Task.yieldMany yieldTimes let dt = DateTimeOffset.UtcNow - lock l (fun () -> l.Add(x)) + lock l (fun () -> l.Add(id)) return dt } + // Have earlier tasks take longer to complete + // so we can see if they are sequenced or not + let fakeWork1 l = + valueTask { + do! Task.Delay 15 + let! x = fakeWork 1 10000 l + do! Task.Delay 15 + return x + } + + let fakeWork2 = fakeWork 2 750 + let fakeWork3 = fakeWork 3 500 + let fakeWork4 = fakeWork 4 250 + let fakeWork5 = fakeWork 5 100 + let fakeWork6 = fakeWork 6 1 + let! sequenced = valueTask { - let! a = doOtherStuff sequencedList 1 - let! b = doOtherStuff sequencedList 2 - let! c = doOtherStuff sequencedList 3 - let! d = doOtherStuff sequencedList 4 - let! e = doOtherStuff sequencedList 5 - let! f = doOtherStuff sequencedList 6 + let! a = fakeWork1 sequencedList + let! b = fakeWork2 sequencedList + let! c = fakeWork3 sequencedList + let! d = fakeWork4 sequencedList + let! e = fakeWork5 sequencedList + let! f = fakeWork6 sequencedList return [ a @@ -718,12 +736,12 @@ module ValueTaskTests = let! paralleled = valueTask { - let! a = doOtherStuff parallelList 1 - and! b = doOtherStuff parallelList 2 - and! c = doOtherStuff parallelList 3 - and! d = doOtherStuff parallelList 4 - and! e = doOtherStuff parallelList 5 - and! f = doOtherStuff parallelList 6 + let! a = fakeWork1 parallelList + and! b = fakeWork2 parallelList + and! c = fakeWork3 parallelList + and! d = fakeWork4 parallelList + and! e = fakeWork5 parallelList + and! f = fakeWork6 parallelList return [ a