File: src\Servers\IIS\IIS\test\Common.FunctionalTests\Infrastructure\IISFunctionalTestBase.cs
Web Access
Project: src\src\Servers\IIS\IIS\test\IIS.FunctionalTests\IIS.FunctionalTests.csproj (IIS.FunctionalTests)
// 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.IO;
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Server.IIS.FunctionalTests;
using Microsoft.AspNetCore.Server.IntegrationTesting;
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
using Microsoft.Extensions.Logging;
using Xunit;
using Xunit.Abstractions;
 
namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
 
public class IISFunctionalTestBase : FunctionalTestsBase
{
    protected static readonly TimeSpan RetryDelay = TimeSpan.FromMilliseconds(100);
 
    public IISFunctionalTestBase(PublishedSitesFixture fixture, ITestOutputHelper output = null) : base(output)
    {
        Fixture = fixture;
        LogFolderPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
    }
 
    protected PublishedSitesFixture Fixture { get; set; }
    public string LogFolderPath { get; }
 
    public async Task<IISDeploymentResult> DeployApp(HostingModel hostingModel = HostingModel.InProcess)
    {
        var deploymentParameters = Fixture.GetBaseDeploymentParameters(hostingModel: hostingModel);
 
        return await DeployAsync(deploymentParameters);
    }
 
    public void AddAppOffline(string appPath, string content = "The app is offline.")
    {
        File.WriteAllText(Path.Combine(appPath, "app_offline.htm"), content);
    }
 
    public void RemoveAppOffline(string appPath)
    {
        RetryHelper.RetryOperation(
            () => File.Delete(Path.Combine(appPath, "app_offline.htm")),
            e => Logger.LogError($"Failed to remove app_offline : {e.Message}"),
            retryCount: 3,
            retryDelayMilliseconds: RetryDelay.Milliseconds);
    }
 
    public async Task AssertAppOffline(IISDeploymentResult deploymentResult, string expectedResponse = "The app is offline.")
    {
        var response = await deploymentResult.HttpClient.RetryRequestAsync("HelloWorld", r => r.StatusCode == HttpStatusCode.ServiceUnavailable);
        Assert.Equal(expectedResponse, await response.Content.ReadAsStringAsync());
    }
 
    public async Task<IISDeploymentResult> AssertStarts(HostingModel hostingModel)
    {
        var deploymentResult = await DeployApp(hostingModel);
 
        await AssertRunning(deploymentResult);
 
        return deploymentResult;
    }
 
    public static async Task AssertRunning(IISDeploymentResult deploymentResult)
    {
        var response = await deploymentResult.HttpClient.RetryRequestAsync("HelloWorld", r => r.IsSuccessStatusCode);
        var responseText = await response.Content.ReadAsStringAsync();
        Assert.Equal("Hello World", responseText);
    }
 
    public void DeletePublishOutput(IISDeploymentResult deploymentResult)
    {
        foreach (var file in Directory.GetFiles(deploymentResult.ContentRoot, "*", SearchOption.AllDirectories))
        {
            // Out of process module dll is allowed to be locked
            var name = Path.GetFileName(file);
            if (name == "aspnetcore.dll" || name == "aspnetcorev2.dll" || name == "aspnetcorev2_outofprocess.dll")
            {
                continue;
            }
            File.Delete(file);
        }
    }
 
    public string GetLogFileContent(IISDeploymentResult deploymentResult)
    {
        return Helpers.ReadAllTextFromFile(Helpers.GetExpectedLogName(deploymentResult, LogFolderPath), Logger);
    }
 
    public override void Dispose()
    {
        base.Dispose();
        if (Directory.Exists(LogFolderPath))
        {
            Directory.Delete(LogFolderPath, true);
        }
    }
}