// 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); } } } |