File: Latency\Internal\LatencyContextPoolTests.cs
Web Access
Project: src\test\Libraries\Microsoft.Extensions.Telemetry.Tests\Microsoft.Extensions.Telemetry.Tests.csproj (Microsoft.Extensions.Telemetry.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Extensions.Diagnostics.Latency.Internal;
using Microsoft.Extensions.ObjectPool;
using Microsoft.Extensions.Options;
using Moq;
using Xunit;
 
namespace Microsoft.Extensions.Diagnostics.Latency.Test.Internal;
 
public class LatencyContextPoolTests
{
    private readonly string[] _checkpoints = new[] { "ca", "cb", "cc", "cd" };
    private readonly string[] _tags = new[] { "ta", "tb", "tc", "td" };
    private readonly string[] _measures = new[] { "ma", "mb", "mc", "md" };
 
    [Fact]
    public void LatencyContextPool_GivesInstruments()
    {
        var lcp = GetLatencyContextPool();
        Assert.NotNull(lcp);
        using var lc = lcp.Pool.Get();
        Assert.NotNull(lc);
    }
 
    [Fact]
    public void LatencyContextPool_DoesNotGive_ContextInUse()
    {
        var lcp = GetLatencyContextPool();
 
        using var lc = lcp.Pool.Get();
        using var lc1 = lcp.Pool.Get();
        using var lc2 = lcp.Pool.Get();
 
        Assert.NotEqual(lc, lc1);
        Assert.NotEqual(lc, lc2);
        Assert.NotEqual(lc1, lc2);
    }
 
    [Fact]
    public void LatencyContextPool_Get_LatencyContextCorrectState()
    {
        var lcp = GetLatencyContextPool();
 
        var o = lcp.Pool.Get();
        Assert.True(o.IsRunning);
        Assert.False(o.IsDisposed);
        o.Dispose();
        Assert.False(o.IsRunning);
        Assert.True(o.IsDisposed);
        var o1 = lcp.Pool.Get();
        Assert.True(o1.IsRunning);
        Assert.False(o.IsDisposed);
    }
 
    [Fact]
    public void RestOnGetPool_Get_CallsReset()
    {
        var p = new ResetOnGetObjectPool<Resettable>(
            new NoResetPolicy());
 
        var o = p.Get();
        Assert.True(o.ResetCalled == 1);
        p.Return(o);
        o = p.Get();
        Assert.True(o.ResetCalled == 1);
    }
 
    private class NoResetPolicy : PooledObjectPolicy<Resettable>
    {
        public override Resettable Create()
        {
            return new Resettable();
        }
 
        public override bool Return(Resettable obj) => false;
    }
 
    private class Resettable : IResettable
    {
        public int ResetCalled;
 
        public bool TryReset()
        {
            ResetCalled++;
            return true;
        }
    }
 
    private LatencyContextPool GetLatencyContextPool()
    {
        return new LatencyContextPool(new LatencyInstrumentProvider(GetRegistry()));
    }
 
    private LatencyContextRegistrySet GetRegistry()
    {
        var option = MockLatencyContextRegistrationOptions.GetLatencyContextRegistrationOptions(
            _checkpoints, _measures, _tags);
 
        var lco = new Mock<IOptions<LatencyContextOptions>>();
        lco.Setup(a => a.Value).Returns(new LatencyContextOptions { ThrowOnUnregisteredNames = false });
 
        var r = new LatencyContextRegistrySet(lco.Object, option);
 
        return r;
    }
}