File: src\Servers\IIS\IIS\test\Common.FunctionalTests\Infrastructure\AppVerifier.cs
Web Access
Project: src\src\Servers\IIS\IIS\test\IIS.LongTests\IIS.LongTests.csproj (IIS.LongTests)
// 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.Diagnostics;
using System.Globalization;
using System.Linq;
 
namespace Microsoft.AspNetCore.Server.IntegrationTesting;
 
public class AppVerifier
{
    private static readonly TimeSpan AppVerifierCommandTimeout = TimeSpan.FromSeconds(5);
 
    public static IDisposable Disable(ServerType serverType, int code)
    {
        // Set in SetupTestEnvironment.ps1
        var enabledCodes = (Environment.GetEnvironmentVariable("APPVERIFIER_ENABLED_CODES") ?? "").Split(' ');
        string processName;
        switch (serverType)
        {
            case ServerType.IISExpress:
                processName = "iisexpress.exe";
                break;
            case ServerType.IIS:
                processName = "w3wp.exe";
                break;
            default:
                throw new ArgumentOutOfRangeException(nameof(serverType), serverType, null);
        }
 
        if (!enabledCodes.Contains(code.ToString(CultureInfo.InvariantCulture)))
        {
            return null;
        }
 
        RunProcessAndWaitForExit("appverif.exe", $"-configure {code} -for {processName} -with ErrorReport=0", AppVerifierCommandTimeout);
        return new AppVerifierToken(processName, code.ToString(CultureInfo.InvariantCulture));
    }
 
    private static void RunProcessAndWaitForExit(string fileName, string arguments, TimeSpan timeout)
    {
        var startInfo = new ProcessStartInfo
        {
            FileName = fileName,
            Arguments = arguments,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false,
        };
 
        var process = Process.Start(startInfo);
 
        if (!process.WaitForExit((int)timeout.TotalMilliseconds))
        {
            process.Kill();
        }
 
        if (process.ExitCode != 0)
        {
            throw new InvalidOperationException($"Exit code {process.ExitCode} when running {fileName} {arguments}. Stdout: {process.StandardOutput.ReadToEnd()} Stderr: {process.StandardError.ReadToEnd()}");
        }
    }
 
    public class AppVerifierToken : IDisposable
    {
        private readonly string _processName;
 
        private readonly string _codes;
 
        public AppVerifierToken(string processName, string codes)
        {
            _processName = processName;
            _codes = codes;
        }
 
        public void Dispose()
        {
            //
            RunProcessAndWaitForExit("appverif.exe", $"-configure {_codes} -for {_processName} -with ErrorReport={Environment.GetEnvironmentVariable("APPVERIFIER_LEVEL")}", AppVerifierCommandTimeout);
        }
    }
}