Skip to content

TimerMock does not wait for time to advance before invoking callback #988

@cyungmann

Description

@cyungmann

Sample code (using .NET 10.0 and Testably.Abstractions.Testing 6.1.0):

using Testably.Abstractions.Testing;

var time = new MockTimeSystem(o => o.DisableAutoAdvance());
Console.WriteLine($"original: {time.DateTime.UtcNow}");
using var timer = [time.Timer.New](http://time.timer.new/)(
    _ => Console.WriteLine($"from callback: {time.DateTime.UtcNow}"),
    null,
    TimeSpan.FromSeconds(5),
    Timeout.InfiniteTimeSpan);
await Task.Yield();
Console.WriteLine($"before advance: {time.DateTime.UtcNow}");
time.TimeProvider.AdvanceBy(TimeSpan.FromSeconds(6));
Console.WriteLine($"after advance: {time.DateTime.UtcNow}");

Console.WriteLine("*********************************");

Console.WriteLine($"original: {DateTime.UtcNow}");
using var timer2 = new Timer(
    _ => Console.WriteLine($"from callback: {DateTime.UtcNow}"),
    null,
    TimeSpan.FromSeconds(5),
    Timeout.InfiniteTimeSpan);
await Task.Yield();
Console.WriteLine($"before advance: {DateTime.UtcNow}");
await Task.Delay(TimeSpan.FromSeconds(6));
Console.WriteLine($"after advance: {DateTime.UtcNow}");

Console.ReadKey();

Output:

original: 6/2/2012 7:45:20 AM
from callback: 6/2/2012 7:45:20 AM
before advance: 6/2/2012 7:45:20 AM
after advance: 6/2/2012 7:45:26 AM
*********************************
original: 4/9/2026 5:07:24 PM
before advance: 4/9/2026 5:07:24 PM
from callback: 4/9/2026 5:07:29 PM
after advance: 4/9/2026 5:07:30 PM

If new TimerStrategy(TimerMode.StartOnMockWait) is used, then the callback is never invoked at all.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions