Skip to content

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

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions