public void First_call_to_meter_returns_zero()
        {
            var meter = new HostCpuUsageMeterFast();
            var usage = meter.GetHostCpuUsage();

            usage.Should().Be(0);
        }
        public void Measures_total_CPU_usage()
        {
            using (var testProcess = new TestProcessHandle())
            {
                var meter = new HostCpuUsageMeterFast();
                var cores = ProcessorInfo.LogicalCores;

                var observationsCount = 10;
                var lowValues         = TestHelpers.GetMeterValues(
                    () => meter.GetHostCpuUsage() * cores,
                    TimeSpan.FromMilliseconds(255),
                    observationsCount);

                testProcess.EatCpu(cores - 1);

                var highValues = TestHelpers.GetMeterValues(
                    () => meter.GetHostCpuUsage() * cores,
                    TimeSpan.FromMilliseconds(255),
                    observationsCount);

                Console.WriteLine($"Low values: {string.Join(", ", lowValues)}");
                Console.WriteLine($"High values: {string.Join(", ", highValues)}");

                highValues
                .Count(h => lowValues.Count(l => l < h) > observationsCount * 0.75)
                .Should()
                .BeGreaterOrEqualTo((int)(observationsCount * 0.75));
            }
        }
        public void Value_is_cached_for_next_250_milliseconds()
        {
            var cachePeriod = 250.Milliseconds();
            var meter       = new HostCpuUsageMeterFast();

            // warmup meter
            TestHelpers.GetMeterValues(() => meter.GetHostCpuUsage(), cachePeriod, 2);
            var results = TestHelpers.GetMeterValues(
                () => meter.GetHostCpuUsage(),
                ((cachePeriod - 20.Milliseconds()).Ticks / 5).Ticks(),
                5);

            results.Should().AllBeEquivalentTo(results[0]);
        }