// Copyright (c) Microsoft. All rights reserved. using System.Threading; using System.Threading.Tasks; namespace Microsoft.Agents.AI.Hosting.UnitTests; /// /// Unit tests for and its contract. /// public class SessionIsolationKeyProviderTests { /// /// Verify that a concrete provider can return a non-null isolation key. /// [Fact] public async Task GetSessionIsolationKeyAsyncReturnsNonNullKeyAsync() { // Arrange const string ExpectedKey = "test-key"; var provider = new TestSessionIsolationKeyProvider(ExpectedKey); // Act string? result = await provider.GetSessionIsolationKeyAsync(); // Assert Assert.Equal(ExpectedKey, result); } /// /// Verify that a concrete provider can return null when no key is available. /// [Fact] public async Task GetSessionIsolationKeyAsyncReturnsNullWhenNoKeyAvailableAsync() { // Arrange var provider = new TestSessionIsolationKeyProvider(null); // Act string? result = await provider.GetSessionIsolationKeyAsync(); // Assert Assert.Null(result); } /// /// Verify that cancellation token is passed through to the provider implementation. /// [Fact] public async Task GetSessionIsolationKeyAsyncPassesCancellationTokenAsync() { // Arrange var provider = new TestCancellableSessionIsolationKeyProvider(); using var cts = new CancellationTokenSource(); cts.Cancel(); // Act & Assert await Assert.ThrowsAsync( async () => await provider.GetSessionIsolationKeyAsync(cts.Token)); } #region Test Implementations /// /// Test implementation of for testing purposes. /// private sealed class TestSessionIsolationKeyProvider : SessionIsolationKeyProvider { private readonly string? _key; public TestSessionIsolationKeyProvider(string? key) { this._key = key; } public override ValueTask GetSessionIsolationKeyAsync(CancellationToken cancellationToken = default) { return new ValueTask(this._key); } } /// /// Test implementation that respects cancellation tokens. /// private sealed class TestCancellableSessionIsolationKeyProvider : SessionIsolationKeyProvider { public override async ValueTask GetSessionIsolationKeyAsync(CancellationToken cancellationToken = default) { await Task.Delay(1000, cancellationToken); return "key"; } } #endregion }