File: Windows\Disk\WindowsDiskIoRatePerfCounterTests.cs
Web Access
Project: src\test\Libraries\Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests\Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests.csproj (Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests)
// 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.Runtime.Versioning;
using Microsoft.Extensions.Diagnostics.ResourceMonitoring.Windows.Test;
using Microsoft.Extensions.Time.Testing;
using Microsoft.TestUtilities;
using Moq;
using Xunit;
 
namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring.Windows.Disk.Test;
 
[SupportedOSPlatform("windows")]
[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX, SkipReason = "Windows specific.")]
public class WindowsDiskIoRatePerfCounterTests
{
    private const string CategoryName = "LogicalDisk";
 
    [ConditionalFact]
    public void DiskReadsPerfCounter_Per60Seconds()
    {
        const string CounterName = WindowsDiskPerfCounterNames.DiskReadsCounter;
        var performanceCounterFactory = new Mock<IPerformanceCounterFactory>();
        var fakeTimeProvider = new FakeTimeProvider { AutoAdvanceAmount = TimeSpan.FromSeconds(60) };
 
        var ratePerfCounters = new WindowsDiskIoRatePerfCounter(
            performanceCounterFactory.Object,
            fakeTimeProvider,
            CategoryName,
            CounterName,
            instanceNames: ["C:", "D:"]);
 
        // Set up
        var counterC = new FakePerformanceCounter("C:", [0, 1, 1.5f, 2, 2.5f]);
        var counterD = new FakePerformanceCounter("D:", [0, 2, 2.5f, 3, 3.5f]);
        performanceCounterFactory.Setup(x => x.Create(CategoryName, CounterName, "C:")).Returns(counterC);
        performanceCounterFactory.Setup(x => x.Create(CategoryName, CounterName, "D:")).Returns(counterD);
 
        // Initialize the counters
        ratePerfCounters.InitializeDiskCounters();
        Assert.Equal(2, ratePerfCounters.TotalCountDict.Count);
        Assert.Equal(0, ratePerfCounters.TotalCountDict["C:"]);
        Assert.Equal(0, ratePerfCounters.TotalCountDict["D:"]);
 
        // Simulate the first tick
        ratePerfCounters.UpdateDiskCounters();
        Assert.Equal(60, ratePerfCounters.TotalCountDict["C:"]); // 1 * 60 = 60
        Assert.Equal(120, ratePerfCounters.TotalCountDict["D:"]); // 2 * 60 = 120
 
        // Simulate the second tick
        ratePerfCounters.UpdateDiskCounters();
        Assert.Equal(150, ratePerfCounters.TotalCountDict["C:"]); // 60 + 1.5 * 60 = 150
        Assert.Equal(270, ratePerfCounters.TotalCountDict["D:"]); // 120 + 2.5 * 60 = 270
 
        // Simulate the third tick
        ratePerfCounters.UpdateDiskCounters();
        Assert.Equal(270, ratePerfCounters.TotalCountDict["C:"]); // 150 + 2 * 60 = 270
        Assert.Equal(450, ratePerfCounters.TotalCountDict["D:"]); // 270 + 3 * 60 = 450
 
        // Simulate the fourth tick
        ratePerfCounters.UpdateDiskCounters();
        Assert.Equal(420, ratePerfCounters.TotalCountDict["C:"]); // 270 + 2.5 * 60 = 420
        Assert.Equal(660, ratePerfCounters.TotalCountDict["D:"]); // 450 + 3.5 * 60 = 660
    }
 
    [ConditionalFact]
    public void DiskWriteBytesPerfCounter_Per30Seconds()
    {
        const string CounterName = WindowsDiskPerfCounterNames.DiskWriteBytesCounter;
        var performanceCounterFactory = new Mock<IPerformanceCounterFactory>();
        var fakeTimeProvider = new FakeTimeProvider { AutoAdvanceAmount = TimeSpan.FromSeconds(30) };
        var ratePerfCounters = new WindowsDiskIoRatePerfCounter(
            performanceCounterFactory.Object,
            fakeTimeProvider,
            CategoryName,
            counterName: CounterName,
            instanceNames: ["C:", "D:"]);
 
        // Set up
        var counterC = new FakePerformanceCounter("C:", [0, 100, 150.5f, 20, 3.1416f]);
        var counterD = new FakePerformanceCounter("D:", [0, 2000, 2025, 0, 2.7183f]);
        performanceCounterFactory.Setup(x => x.Create(CategoryName, CounterName, "C:")).Returns(counterC);
        performanceCounterFactory.Setup(x => x.Create(CategoryName, CounterName, "D:")).Returns(counterD);
 
        // Initialize the counters
        ratePerfCounters.InitializeDiskCounters();
        Assert.Equal(2, ratePerfCounters.TotalCountDict.Count);
        Assert.Equal(0, ratePerfCounters.TotalCountDict["C:"]);
        Assert.Equal(0, ratePerfCounters.TotalCountDict["D:"]);
 
        // Simulate the first tick
        ratePerfCounters.UpdateDiskCounters();
        Assert.Equal(3000, ratePerfCounters.TotalCountDict["C:"]); // 100 * 30 = 3000
        Assert.Equal(60000, ratePerfCounters.TotalCountDict["D:"]); // 2000 * 30 = 60000
 
        // Simulate the second tick
        ratePerfCounters.UpdateDiskCounters();
        Assert.Equal(7515, ratePerfCounters.TotalCountDict["C:"]); // 3000 + 150.5 * 30 = 7515
        Assert.Equal(120750, ratePerfCounters.TotalCountDict["D:"]); // 60000 + 2.5 * 30 = 120750
 
        // Simulate the third tick
        ratePerfCounters.UpdateDiskCounters();
        Assert.Equal(8115, ratePerfCounters.TotalCountDict["C:"]); // 7515 + 20 * 30 = 8115
        Assert.Equal(120750, ratePerfCounters.TotalCountDict["D:"]); // 120750 + 0 * 30 = 120750
 
        // Simulate the fourth tick
        ratePerfCounters.UpdateDiskCounters();
        Assert.Equal(8209, ratePerfCounters.TotalCountDict["C:"]); // 8115 + 3.1416 * 30 = 8209
        Assert.Equal(120831, ratePerfCounters.TotalCountDict["D:"]); // 120750 + 3.5 * 30 = 120831
    }
}