Skip to content

Replace Task.Delay/Thread.Sleep with NUnit .After() in tests#9576

Merged
LukaszRozmej merged 19 commits intomasterfrom
copilot/remove-task-delay-from-tests
Oct 30, 2025
Merged

Replace Task.Delay/Thread.Sleep with NUnit .After() in tests#9576
LukaszRozmej merged 19 commits intomasterfrom
copilot/remove-task-delay-from-tests

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Oct 27, 2025

  • Understand the pattern: Convert Task.Delay() or Thread.Sleep() followed by assertions to use NUnit's .After() constraint
  • Review example implementations already in codebase
  • Change pattern in Nethermind.TxPool.Test/TxPoolTests.cs
  • Change pattern in Nethermind.TxPool.Test/TxBroadcasterTests.cs
  • Change pattern in Nethermind.Blockchain.Test/Filters/FilterStoreTests.cs
  • Change pattern in Nethermind.Blockchain.Test/Producers/BlockProducerBaseTests.IsProducingBlocks.cs
  • Change pattern in Nethermind.Blockchain.Test/Producers/BuildBlocksOnlyWhenNotProcessingTests.cs
  • Change pattern in Nethermind.Blockchain.Test/Receipts/PersistentReceiptStorageTests.cs
  • Change pattern in Nethermind.Clique.Test/CliqueBlockProducerTests.cs
  • Change pattern in Nethermind.Network.Discovery.Test/DiscoveryManagerTests.cs
  • Change pattern in Nethermind.Core.Test/Events/WaitForEventTests.cs
  • Change pattern in Nethermind.Core.Test/Collections/ConcurrentDictionaryTests.cs
  • Change pattern in Nethermind.JsonRpc.TraceStore.Test/TraceStorePrunerTests.cs
  • Change pattern in Nethermind.Network.Test/PeerManagerTests.cs
  • Change pattern in Nethermind.Evm.Test/Tracing/CancellationTracerTests.cs
  • Build and test the changes
  • Fix async method signatures
  • Add NSubstituteExtensions from PR Fix flaky test in SimpleRetryCacheTests by pooling instead of delay #9574
  • Refactor to use ReceivedBool/DidNotReceiveBool helpers
  • Revert blocking test conversions
  • Remove diagnostic logging

Summary

Successfully converted Task.Delay and Thread.Sleep patterns to NUnit's .After() constraint in test files, except where tests intentionally verify blocking behavior. Removed diagnostic logging from ReceivedCallsMatching as it had issues with logging on first failure instead of last, and left garbage in the ConcurrentDictionary.

Original prompt

This section details on the original issue you should resolve

<issue_title>Remove as many Task.Delay or Thread.Sleep in tests as possible with After</issue_title>
<issue_description>Do what is done in #9574 but for other tests</issue_description>

<agent_instructions>change pattern in test of:
Task.Delay() or Thread.Sleep()
directly followed by an Assert (NUnit, NSubstitute or FluentAssertions).

To Nunit That assert with .After and pooling interval.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@LukaszRozmej
Copy link
Copy Markdown
Member

@copilot build it on #9574 PR, you will need those extension methods added there.

Copilot AI and others added 2 commits October 27, 2025 11:59
Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>
Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>
Copilot AI changed the title [WIP] Remove Task.Delay and Thread.Sleep in tests using After Replace Task.Delay/Thread.Sleep with NUnit .After() in tests Oct 27, 2025
Copilot AI requested a review from LukaszRozmej October 27, 2025 12:15
Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Oct 27, 2025

@copilot build it on #9574 PR, you will need those extension methods added there.

Added NSubstituteExtensions.cs from PR #9574 and refactored the code to use ReceivedBool and DidNotReceiveBool extension methods instead of the complex ReceivedCalls() pattern. This makes the assertions cleaner and more maintainable. Changes committed in 7a9ea1c.

@LukaszRozmej
Copy link
Copy Markdown
Member

@copilot fix build

@LukaszRozmej LukaszRozmej marked this pull request as ready for review October 28, 2025 10:08
@LukaszRozmej LukaszRozmej requested a review from rubo October 28, 2025 10:11
@LukaszRozmej LukaszRozmej requested a review from asdacap October 28, 2025 10:11
{
action(substitute.DidNotReceive());
return true;
TestContext.Out.WriteLine(requiredNumberOfCalls == maxNumberOfCalls
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will it display on every periodic check?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, the message will display on every periodic check when the condition isn't met, helping diagnose timing issues in test failures.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't need this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot remove redundant messages

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed in 127c3cd. The diagnostic messages that were displayed on every periodic check have been removed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot can we keep the message but display it only once on last check?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implemented in d023a56. The diagnostic message now displays only once per unique test check (using a concurrent dictionary to track what's been logged), showing helpful debugging information without spamming on every periodic check.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot this sucks:

  1. You log first message on first call instead of on last
  2. There is garbage left in ConcurrentDictionary

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 60bdf3b. Removed the diagnostic logging entirely to avoid the issues you identified (logging on first failure instead of last, and memory leak in ConcurrentDictionary). The helper now simply returns the boolean result, relying on NUnit's own failure messages when .After() times out.

Copy link
Copy Markdown
Contributor

@emlautarom1 emlautarom1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left several questions. If we go this route, does it make sense to continue using FluentAssertions? Seems like every time we need to work with a delay of some sort we need to use NUnits assertions. Might as well always use them.

@LukaszRozmej
Copy link
Copy Markdown
Member

LukaszRozmej commented Oct 29, 2025

Left several questions. If we go this route, does it make sense to continue using FluentAssertions? Seems like every time we need to work with a delay of some sort we need to use NUnits assertions. Might as well always use them.

We should avoid FluentAssertions due to licensing issues - we cannot upgrade it at the moment.
One thing were they are clearly superior is complex collection comparision.

updateTask = Task.Run(() => dictionary[3] = 3);
Task.WaitAny(updateTask, Task.Delay(100));
updateTask.IsCompleted.Should().BeFalse();
Assert.That(() => updateTask.IsCompleted, Is.False.After(100, 10));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot it need delay here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reverted in 0d7c919. The test verifies the task is blocked by the lock, so it needs the delay pattern.


await Task.Delay(100);
awaitingEvent.IsCompleted.Should().BeFalse();
Assert.That(() => awaitingEvent.IsCompleted, Is.False.After(100, 10));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Anytime it check for IsCompleted is false and has a delay before it, that means the test is likely to want to assert that the task is blocked. So no need to change there.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reverted in 0d7c919. These tests verify the task blocks until events occur, so the delays are necessary.

condCalled.Should().BeTrue();
await Task.Delay(100);
awaitingEvent.IsCompleted.Should().BeFalse();
Assert.That(() => awaitingEvent.IsCompleted, Is.False.After(100, 10));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot again

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reverted in 0d7c919.


await Task.Delay(100);
awaitingEvent.IsCompleted.Should().BeFalse();
Assert.That(() => awaitingEvent.IsCompleted, Is.False.After(100, 10));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot another one.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reverted in 0d7c919.

AddNewBlocks(blockTree);
await Task.Delay(100);
keys.Skip(3).Select(k => memDb.Get(k)).Should().NotContain((byte[]?)null); // too old were not removed
Assert.That(() => keys.Skip(3).Select(k => memDb.Get(k)), Does.Not.Contain((byte[]?)null).After(100, 10)); // too old were not removed
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot double check this case also.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reverted in 0d7c919. The test needs the actual delay for the async pruning operation to complete.

Co-authored-by: asdacap <1841324+asdacap@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Oct 29, 2025

Left several questions. If we go this route, does it make sense to continue using FluentAssertions? Seems like every time we need to work with a delay of some sort we need to use NUnits assertions. ...

NUnit assertions are now used for delayed/polled assertions. FluentAssertions remains useful for complex collection comparisons and other scenarios where timing isn't a concern.

Co-authored-by: flcl42 <630501+flcl42@users.noreply.github.com>
…ing fails

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>
Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>
@LukaszRozmej LukaszRozmej merged commit d483c1a into master Oct 30, 2025
81 checks passed
@LukaszRozmej LukaszRozmej deleted the copilot/remove-task-delay-from-tests branch October 30, 2025 12:24
LukaszRozmej added a commit that referenced this pull request Nov 3, 2025
* Reduce peer logging (#9591)

* Cancel timeout in NewPayload fast-path (#9597)

* Refactor JsonRpcService.ExecuteAsync (#9600)

* Refactor JsonRpcService.ExecuteAsync

* Feedback

* Add reflection cache

* Optimize DeserializeParameters

* Optimize enumeration

* Can be made static

* Remove unused using

* Use regular Dictionary

* formatting

* Optimise CREATE(2) remove redundant account creation (#9585)

* delay creation of executor account

* store nonce zero for new executor

* remove account creation

---------

Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com>

* Replace Task.Delay/Thread.Sleep with NUnit .After() in tests (#9576)

* Initial plan

* Convert Task.Delay and Thread.Sleep to After pattern in tests

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* Fix async method signatures after removing await

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* Add NSubstituteExtensions and refactor to use ReceivedBool helper

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* fix

* Try avoiding exceptions

* increase Timeout

* change

* fix

* whitespace

* make Big_test Explicit

* fix negative paths

* revert one test

* Revert inappropriate After() conversions for blocking tests

Co-authored-by: asdacap <1841324+asdacap@users.noreply.github.com>

* Remove redundant diagnostic messages from ReceivedCallsMatching

Co-authored-by: flcl42 <630501+flcl42@users.noreply.github.com>

* Display diagnostic message only once per test when ReceivedCallsMatching fails

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* Remove diagnostic logging from ReceivedCallsMatching to avoid issues

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* remove stale annotation

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>
Co-authored-by: lukasz.rozmej <lukasz.rozmej@gmail.com>
Co-authored-by: asdacap <1841324+asdacap@users.noreply.github.com>
Co-authored-by: flcl42 <630501+flcl42@users.noreply.github.com>

* Arbitrum - Refund on contract creation failure (#9610)

* extension for arbitrum on refund at contract deployment failure

* Fix eth_sumulate defaults (#9529)

* Fix

* Refactor

* Test

* Fix taiko

* Revert "Test"

This reverts commit 9eb30e0.

* Fix

* Fix gas

* Test

* Fix validate flag

* Fix taiko

* Fix gasEstimation tests

* Add more flags

* Fix tests

* Change flags

* Try fix tests

* Fix tests

* Proper nonce validation

* More fixes

* Revert

* Fix tests

* Fix types

* Add two tests

* Fix known-failing-tests

* Default type

* known failing tests

* Fix suggestions

* Fix tests

* Extra peers reporting for supported chains runs (#9612)

* Fix StatelessExecution tool build (#9613)

* Fix/pow forward header provider cache ownership (#9614)

* Fix: return copy from cache to avoid use-after-dispose

* add a test

* Update EthereumTests (#9225)

* Update tests to fix missing test jsons

* Use newer tests; add more moern legacy tests; fix transition tests; fix slnx

* Rename projects; remove Blockchain tests as it was moved to legacy fully

* Fix a csproj

* Add tests

* Add tests

* Move transaition tests to legacy too; simplify namespaces

* Fix workflow

* Fix syntax

* Fix transaction tests

* Add empty coinbase

* Add coinbase even if transaction is declined

* Fix evm slnx compilation

* Can be failing cause?

* Return blockhash tests

* Rollback coinbase set for blockchain tests

* Less tests as old one have broken format

* Rm TODO, as SuicideStorage tests are covered by state tests

* Fix

* Update to 5.0.0

* Remove redundant length==1 special-case in SliceWithZeroPadding (#9566)

* Catch index exceptions in RlpDecoders and pack it in RlpException (#9603)

* Catch index exceptions in RlpDecoders and pack it in RlpException

* Catch index exceptions in RlpDecoders and pack it in RlpException (#9604)

* Initial plan

* Update RLP decoders to inherit from base classes with exception handling

Updated all RLP decoder classes to inherit from RlpValueDecoder<T> or RlpStreamDecoder<T> instead of directly implementing interfaces. This ensures all decoders automatically get IndexOutOfRangeException and ArgumentOutOfRangeException handling, wrapping them in RlpException.

Changed decoders:
- WithdrawalDecoder, KeccakDecoder, LogEntryDecoder
- AuthorizationTupleDecoder, AccessListDecoder
- AccountDecoder, HeaderDecoder, BlockDecoder, BlockBodyDecoder
- ChainLevelDecoder, BlockInfoDecoder
- ReceiptMessageDecoder, ReceiptStorageDecoder, CompactReceiptStorageDecoder
- ReceiptArrayStorageDecoder

All decode methods renamed to DecodeInternal and marked as protected override.
All Encode/GetLength methods marked as override where needed.

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* Update remaining RLP decoders across all modules

Updated RLP decoders in Consensus.Clique, Network, Consensus.AuRa, Taiko, and Xdc modules to inherit from base classes:

- Consensus.Clique: SnapshotDecoder
- Network: NetworkNodeDecoder
- Consensus.AuRa: ValidatorInfoDecoder, PendingValidatorsDecoder
- Taiko: L1OriginDecoder
- Xdc: ExtraConsensusDataDecoder, QuorumCertificateDecoder, SnapshotDecoder, TimeoutCertificateDecoder, TimeoutDecoder, VoteDecoder, XdcBlockInfoDecoder

All decoders now inherit from RlpValueDecoder<T> or RlpStreamDecoder<T> to get automatic exception handling for IndexOutOfRangeException and ArgumentOutOfRangeException.

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* Mark all RLP decoder classes as sealed

Added sealed modifier to all 27 RLP decoder classes to prevent further inheritance:

- Core decoders (15): WithdrawalDecoder, KeccakDecoder, LogEntryDecoder, AccountDecoder, HeaderDecoder, BlockDecoder, BlockBodyDecoder, ChainLevelDecoder, BlockInfoDecoder, ReceiptMessageDecoder, ReceiptStorageDecoder, CompactReceiptStorageDecoder, ReceiptArrayStorageDecoder, AuthorizationTupleDecoder, AccessListDecoder

- Consensus decoders (3): SnapshotDecoder (Clique), ValidatorInfoDecoder (AuRa), PendingValidatorsDecoder (AuRa)

- Network decoder (1): NetworkNodeDecoder

- Taiko decoder (1): L1OriginDecoder

- Xdc decoders (7): ExtraConsensusDataDecoder, QuorumCertificateDecoder, SnapshotDecoder, TimeoutCertificateDecoder, TimeoutDecoder, VoteDecoder, XdcBlockInfoDecoder

These classes are not inherited from and marking them as sealed provides better performance and clearer design intent.

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* Update remaining RLP decoders: BasicStreamDecoder, TxDecoder, and OptimismReceiptMessageDecoder

Updated the last remaining decoder implementations to inherit from base classes:

- BasicStreamDecoder.cs: Updated 6 primitive type decoders (ByteStreamDecoder, ShortStreamDecoder, UShortStreamDecoder, IntStreamDecoder, UIntStreamDecoder, ULongStreamDecoder) to inherit from RlpStreamDecoder<T> and marked as sealed

- TxDecoder.cs: Updated TxDecoder<T> base class to inherit from RlpValueDecoder<T> (not sealed as it has subclasses: TxDecoder, SystemTxDecoder, GeneratedTxDecoder)

- OptimismReceiptMessageDecoder.cs: Updated OptimismReceiptMessageDecoder to inherit from RlpStreamDecoder<TxReceipt> (not sealed as it has subclass OptimismReceiptTrieDecoder)

All decoders now have automatic exception handling for IndexOutOfRangeException and ArgumentOutOfRangeException.

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* Fix TxDecoder: Add back Rlp Encode method for test compatibility

Added the `Rlp Encode(T item, RlpBehaviors)` method that was removed during refactoring. This method is used by tests and provides a convenient way to encode transactions to Rlp without manually creating a RlpStream.

The method internally uses the override Encode method to ensure exception handling is still applied.

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* fix build

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* Add more logging in MultiSyncModeSelector (#9616)

* Add more logging

* fix for seq

* feat: Add configurable EIP-2935 ring buffer size (#9611)

* Blockchain Engine Tests support (#9394)

* initial commit

* fix normal blockchain tests

* tidy

* restore disposes

* comment out BALs

* fix var declaration

* don't set basefeepergas if null

* use network from genesis in blockchain test

* update blockchain test base

* add tracer to blockchain tests runner

* tidy

* tidy

* add genesis processing timeout

* check for null head block

* try undo some changes

* detect failure to process genesis

* check removal is error

* add back checks for genesis spec

* only add noenginerequeststracker in tests

* comment sealed block check

* try remove timeout

* only configure merge for engine tests

* fix merge module init

* add back timeout and remove sealer

* await new payloads

* use reflection for engine rpc method calling

---------

Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com>

* use zero address when from address not specified in rpc calls (#9578)

* use zero address for null values

* small test

* fix proof rpc

* fix test and add more changes

* Allow serving snap requests for more than 128 blocks (#9602)

* Initial plan

* Add SnapServingMaxDepth configuration and update LastNStateRootTracker

Co-authored-by: tanishqjasoria <11698398+tanishqjasoria@users.noreply.github.com>

* Add clarifying comments for configuration changes

Co-authored-by: tanishqjasoria <11698398+tanishqjasoria@users.noreply.github.com>

* Get reorgDepth from config instead of hardcoding in test

Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tanishqjasoria <11698398+tanishqjasoria@users.noreply.github.com>
Co-authored-by: Tanishq Jasoria <jasoriatanishq@gmail.com>
Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>

* Remove console log from FileTestsSource (#9622)

Removed console log for loading test file.

* Correct docs value for Blocks.BlockProductionMaxTxKilobytes (#9620)

* Update OP Superchain chains (#9629)

Co-authored-by: emlautarom1 <emlautarom1@users.noreply.github.com>

* Auto-update fast sync settings (#9628)

Co-authored-by: rubo <rubo@users.noreply.github.com>

* feat: write AckMessage directly to IByteBuffer without temp array (#9623)

* Optimize Ripemd (#9627)

---------

Co-authored-by: Ben {chmark} Adams <thundercat@illyriad.co.uk>
Co-authored-by: Marc <Marchhill@users.noreply.github.com>
Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: LukaszRozmej <12445221+LukaszRozmej@users.noreply.github.com>
Co-authored-by: asdacap <1841324+asdacap@users.noreply.github.com>
Co-authored-by: flcl42 <630501+flcl42@users.noreply.github.com>
Co-authored-by: Stavros Vlachakis <89769224+svlachakis@users.noreply.github.com>
Co-authored-by: Nikita Mescheryakov <root@nikitam.io>
Co-authored-by: Ruben Buniatyan <rubo@users.noreply.github.com>
Co-authored-by: radik878 <radikpadik76@gmail.com>
Co-authored-by: Alexey Osipov <me@flcl.me>
Co-authored-by: GarmashAlex <garmasholeksii@gmail.com>
Co-authored-by: Daniil Ankushin <ankushin.daniil42@gmail.com>
Co-authored-by: Tanishq Jasoria <jasoriatanishq@gmail.com>
Co-authored-by: tanishqjasoria <11698398+tanishqjasoria@users.noreply.github.com>
Co-authored-by: core-repository-dispatch-app[bot] <173070810+core-repository-dispatch-app[bot]@users.noreply.github.com>
Co-authored-by: emlautarom1 <emlautarom1@users.noreply.github.com>
Co-authored-by: VolodymyrBg <aqdrgg19@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remove as many Task.Delay or Thread.Sleep in tests as possible with After

5 participants