File: CancellationTokenRegistryTests.cs
Web Access
Project: src\tests\Aspire.Hosting.RemoteHost.Tests\Aspire.Hosting.RemoteHost.Tests.csproj (Aspire.Hosting.RemoteHost.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Xunit;
 
namespace Aspire.Hosting.RemoteHost.Tests;
 
public class CancellationTokenRegistryTests
{
    [Fact]
    public void Create_ReturnsUniqueTokenId()
    {
        using var registry = new CancellationTokenRegistry();
 
        var (id1, _) = registry.Create();
        var (id2, _) = registry.Create();
 
        Assert.NotEqual(id1, id2);
        Assert.StartsWith("ct_", id1);
        Assert.StartsWith("ct_", id2);
    }
 
    [Fact]
    public void Create_ReturnsValidCancellationToken()
    {
        using var registry = new CancellationTokenRegistry();
 
        var (_, token) = registry.Create();
 
        Assert.False(token.IsCancellationRequested);
        Assert.True(token.CanBeCanceled);
    }
 
    [Fact]
    public void CreateLinked_TokenIsCancelledWhenLinkedTokenCancels()
    {
        using var registry = new CancellationTokenRegistry();
        using var cts = new CancellationTokenSource();
 
        var (_, token) = registry.CreateLinked(cts.Token);
 
        Assert.False(token.IsCancellationRequested);
 
        cts.Cancel();
 
        Assert.True(token.IsCancellationRequested);
    }
 
    [Fact]
    public void Cancel_CancelsRegisteredToken()
    {
        using var registry = new CancellationTokenRegistry();
        var (tokenId, token) = registry.Create();
 
        Assert.False(token.IsCancellationRequested);
 
        var result = registry.Cancel(tokenId);
 
        Assert.True(result);
        Assert.True(token.IsCancellationRequested);
    }
 
    [Fact]
    public void Cancel_ReturnsFalseForUnknownId()
    {
        using var registry = new CancellationTokenRegistry();
 
        var result = registry.Cancel("ct_unknown");
 
        Assert.False(result);
    }
 
    [Fact]
    public void TryGetToken_ReturnsTrueAndTokenForRegisteredId()
    {
        using var registry = new CancellationTokenRegistry();
        var (tokenId, originalToken) = registry.Create();
 
        var found = registry.TryGetToken(tokenId, out var retrievedToken);
 
        Assert.True(found);
        Assert.Equal(originalToken, retrievedToken);
    }
 
    [Fact]
    public void TryGetToken_ReturnsFalseForUnknownId()
    {
        using var registry = new CancellationTokenRegistry();
 
        var found = registry.TryGetToken("ct_unknown", out var token);
 
        Assert.False(found);
        Assert.Equal(default, token);
    }
 
    [Fact]
    public void Unregister_RemovesTokenAndReturnsTrue()
    {
        using var registry = new CancellationTokenRegistry();
        var (tokenId, _) = registry.Create();
 
        var result = registry.Unregister(tokenId);
 
        Assert.True(result);
        Assert.False(registry.TryGetToken(tokenId, out _));
    }
 
    [Fact]
    public void Unregister_ReturnsFalseForUnknownId()
    {
        using var registry = new CancellationTokenRegistry();
 
        var result = registry.Unregister("ct_unknown");
 
        Assert.False(result);
    }
 
    [Fact]
    public void Dispose_ClearsAllRegisteredTokens()
    {
        var registry = new CancellationTokenRegistry();
        var (tokenId1, _) = registry.Create();
        var (tokenId2, _) = registry.Create();
 
        registry.Dispose();
 
        // After dispose, TryGetToken should return false
        Assert.False(registry.TryGetToken(tokenId1, out _));
        Assert.False(registry.TryGetToken(tokenId2, out _));
    }
 
    [Fact]
    public void Create_ThrowsAfterDispose()
    {
        var registry = new CancellationTokenRegistry();
        registry.Dispose();
 
        Assert.Throws<ObjectDisposedException>(() => registry.Create());
    }
 
    [Fact]
    public void CreateLinked_ThrowsAfterDispose()
    {
        var registry = new CancellationTokenRegistry();
        registry.Dispose();
 
        Assert.Throws<ObjectDisposedException>(() => registry.CreateLinked(CancellationToken.None));
    }
}