File: GivenThatTheUserEnablesThePerfLog.cs
Web Access
Project: ..\..\..\test\dotnet.Tests\dotnet.Tests.csproj (dotnet.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.Diagnostics.Tracing;
 
namespace Microsoft.DotNet.Tests
{
    public class GivenThatTheUserEnablesThePerfLog : SdkTest
    {
        public GivenThatTheUserEnablesThePerfLog(ITestOutputHelper log) : base(log)
        {
        }
 
        [Fact]
        public void WhenPerfLogDisabledDotNetDoesNotWriteToThePerfLog()
        {
            var dir = _testAssetsManager.CreateTestDirectory();
 
            var result = new DotnetCommand(Log, "--help")
                .WithEnvironmentVariable("DOTNET_PERFLOG_DIR", dir.Path)
                .Execute();
 
            result.ExitCode.Should().Be(0);
            Assert.Empty(new DirectoryInfo(dir.Path).GetFiles());
        }
 
        [Fact]
        public void WhenPerfLogEnabledDotNetWritesToThePerfLog()
        {
            var dir = _testAssetsManager.CreateTestDirectory();
 
            var result = new DotnetCommand(Log, "--help")
                .WithEnvironmentVariable("DOTNET_CLI_PERF_LOG", "1")
                .WithEnvironmentVariable("DOTNET_PERFLOG_DIR", dir.Path)
                .Execute();
 
            result.ExitCode.Should().Be(0);
 
            DirectoryInfo logDir = new(dir.Path);
            FileInfo[] logFiles = logDir.GetFiles();
            Assert.NotEmpty(logFiles);
            Assert.All(logFiles, f => Assert.StartsWith("perf-", f.Name));
            Assert.All(logFiles, f => Assert.NotEqual(0, f.Length));
        }
 
        [Fact]
        public void WhenPerfLogEnabledDotNetBuildWritesAPerfLog()
        {
            using (PerfLogTestEventListener listener = new())
            {
                int exitCode = Cli.Program.Main(new string[] { "--help" });
                Assert.Equal(0, exitCode);
                Assert.NotEqual(0, listener.EventCount);
            }
        }
    }
 
    internal sealed class PerfLogTestEventListener : EventListener
    {
        private const string PerfLogEventSourceName = "Microsoft-Dotnet-CLI-Performance";
 
        public int EventCount
        {
            get; private set;
        }
 
        protected override void OnEventSourceCreated(EventSource eventSource)
        {
            if (eventSource.Name.Equals(PerfLogEventSourceName))
            {
                EnableEvents(eventSource, EventLevel.Verbose);
            }
        }
 
        protected override void OnEventWritten(EventWrittenEventArgs eventData)
        {
            Assert.Equal(PerfLogEventSourceName, eventData.EventSource.Name);
            EventCount++;
        }
    }
}