// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Threading;
using System.Threading.Tasks;
using Xunit;

namespace Microsoft.Extensions.Internal;

public class NonCapturingTimerTest
{
    [Fact]
    public async Task NonCapturingTimer_DoesntCaptureExecutionContext()
    {
        // Arrange
        var message = new AsyncLocal<string>();
        message.Value = "Hey, this is a value stored in the execuion context";

        var tcs = new TaskCompletionSource<string>();

        // Act
        var timer = NonCapturingTimer.Create((_) =>
        {
            // Observe the value based on the current execution context
            tcs.SetResult(message.Value);
        }, state: null, dueTime: TimeSpan.FromMilliseconds(1), Timeout.InfiniteTimeSpan);

        // Assert
        var messageFromTimer = await tcs.Task;
        timer.Dispose();

        // ExecutionContext didn't flow to timer callback
        Assert.Null(messageFromTimer);

        // ExecutionContext was restored
        Assert.NotNull(await Task.Run(() => message.Value));
    }
}
