Use TestApplication (#1118)
This commit is contained in:
parent
ff0a5bbbdf
commit
4b5a32d3b9
|
|
@ -4,38 +4,38 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Label="Package Versions">
|
<PropertyGroup Label="Package Versions">
|
||||||
<BenchmarkDotNetPackageVersion>0.10.13</BenchmarkDotNetPackageVersion>
|
<BenchmarkDotNetPackageVersion>0.10.13</BenchmarkDotNetPackageVersion>
|
||||||
<InternalAspNetCoreSdkPackageVersion>2.2.0-preview1-17102</InternalAspNetCoreSdkPackageVersion>
|
<InternalAspNetCoreSdkPackageVersion>2.2.0-preview1-17099</InternalAspNetCoreSdkPackageVersion>
|
||||||
<MicrosoftAspNetCoreAllPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreAllPackageVersion>
|
<MicrosoftAspNetCoreAllPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreAllPackageVersion>
|
||||||
<MicrosoftAspNetCoreAuthenticationCorePackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreAuthenticationCorePackageVersion>
|
<MicrosoftAspNetCoreAuthenticationCorePackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreAuthenticationCorePackageVersion>
|
||||||
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
|
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
|
||||||
<MicrosoftAspNetCoreHostingAbstractionsPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreHostingAbstractionsPackageVersion>
|
<MicrosoftAspNetCoreHostingAbstractionsPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreHostingAbstractionsPackageVersion>
|
||||||
<MicrosoftAspNetCoreHostingPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreHostingPackageVersion>
|
<MicrosoftAspNetCoreHostingPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreHostingPackageVersion>
|
||||||
<MicrosoftAspNetCoreHttpExtensionsPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreHttpExtensionsPackageVersion>
|
<MicrosoftAspNetCoreHttpExtensionsPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreHttpExtensionsPackageVersion>
|
||||||
<MicrosoftAspNetCoreHttpOverridesPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreHttpOverridesPackageVersion>
|
<MicrosoftAspNetCoreHttpOverridesPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreHttpOverridesPackageVersion>
|
||||||
<MicrosoftAspNetCoreHttpPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreHttpPackageVersion>
|
<MicrosoftAspNetCoreHttpPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreHttpPackageVersion>
|
||||||
<MicrosoftAspNetCoreHttpSysSourcesPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreHttpSysSourcesPackageVersion>
|
<MicrosoftAspNetCoreHttpSysSourcesPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreHttpSysSourcesPackageVersion>
|
||||||
<MicrosoftAspNetCoreServerIntegrationTestingPackageVersion>0.6.0-preview1-34823</MicrosoftAspNetCoreServerIntegrationTestingPackageVersion>
|
<MicrosoftAspNetCoreServerIntegrationTestingPackageVersion>0.6.0-a-preview1-test-application-17108</MicrosoftAspNetCoreServerIntegrationTestingPackageVersion>
|
||||||
<MicrosoftAspNetCoreServerKestrelPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreServerKestrelPackageVersion>
|
<MicrosoftAspNetCoreServerKestrelPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreServerKestrelPackageVersion>
|
||||||
<MicrosoftAspNetCoreTestHostPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreTestHostPackageVersion>
|
<MicrosoftAspNetCoreTestHostPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreTestHostPackageVersion>
|
||||||
<MicrosoftAspNetCoreTestingPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreTestingPackageVersion>
|
<MicrosoftAspNetCoreTestingPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreTestingPackageVersion>
|
||||||
<MicrosoftAspNetCoreWebUtilitiesPackageVersion>2.2.0-preview1-34823</MicrosoftAspNetCoreWebUtilitiesPackageVersion>
|
<MicrosoftAspNetCoreWebUtilitiesPackageVersion>2.2.0-preview1-34825</MicrosoftAspNetCoreWebUtilitiesPackageVersion>
|
||||||
<MicrosoftBuildFrameworkPackageVersion>15.6.82</MicrosoftBuildFrameworkPackageVersion>
|
<MicrosoftBuildFrameworkPackageVersion>15.6.82</MicrosoftBuildFrameworkPackageVersion>
|
||||||
<MicrosoftBuildUtilitiesCorePackageVersion>15.6.82</MicrosoftBuildUtilitiesCorePackageVersion>
|
<MicrosoftBuildUtilitiesCorePackageVersion>15.6.82</MicrosoftBuildUtilitiesCorePackageVersion>
|
||||||
<MicrosoftExtensionsBuffersMemoryPoolSourcesPackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsBuffersMemoryPoolSourcesPackageVersion>
|
<MicrosoftExtensionsBuffersMemoryPoolSourcesPackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsBuffersMemoryPoolSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
|
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
|
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationJsonPackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsConfigurationJsonPackageVersion>
|
<MicrosoftExtensionsConfigurationJsonPackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsConfigurationJsonPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
|
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingConsolePackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsLoggingConsolePackageVersion>
|
<MicrosoftExtensionsLoggingConsolePackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsLoggingConsolePackageVersion>
|
||||||
<MicrosoftExtensionsLoggingDebugPackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsLoggingDebugPackageVersion>
|
<MicrosoftExtensionsLoggingDebugPackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsLoggingDebugPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingPackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsLoggingPackageVersion>
|
<MicrosoftExtensionsLoggingPackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsLoggingPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingTestingPackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsLoggingTestingPackageVersion>
|
<MicrosoftExtensionsLoggingTestingPackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsLoggingTestingPackageVersion>
|
||||||
<MicrosoftExtensionsOptionsPackageVersion>2.2.0-preview1-34823</MicrosoftExtensionsOptionsPackageVersion>
|
<MicrosoftExtensionsOptionsPackageVersion>2.2.0-preview1-34825</MicrosoftExtensionsOptionsPackageVersion>
|
||||||
<MicrosoftNETCoreApp20PackageVersion>2.0.9</MicrosoftNETCoreApp20PackageVersion>
|
<MicrosoftNETCoreApp20PackageVersion>2.0.9</MicrosoftNETCoreApp20PackageVersion>
|
||||||
<MicrosoftNETCoreApp21PackageVersion>2.1.2</MicrosoftNETCoreApp21PackageVersion>
|
<MicrosoftNETCoreApp21PackageVersion>2.1.2</MicrosoftNETCoreApp21PackageVersion>
|
||||||
<MicrosoftNETCoreApp22PackageVersion>2.2.0-preview1-26618-02</MicrosoftNETCoreApp22PackageVersion>
|
<MicrosoftNETCoreApp22PackageVersion>2.2.0-preview1-26618-02</MicrosoftNETCoreApp22PackageVersion>
|
||||||
<MicrosoftNETCoreWindowsApiSetsPackageVersion>1.0.1</MicrosoftNETCoreWindowsApiSetsPackageVersion>
|
<MicrosoftNETCoreWindowsApiSetsPackageVersion>1.0.1</MicrosoftNETCoreWindowsApiSetsPackageVersion>
|
||||||
<MicrosoftNetHttpHeadersPackageVersion>2.2.0-preview1-34823</MicrosoftNetHttpHeadersPackageVersion>
|
<MicrosoftNetHttpHeadersPackageVersion>2.2.0-preview1-34825</MicrosoftNetHttpHeadersPackageVersion>
|
||||||
<MicrosoftNETTestSdkPackageVersion>15.6.1</MicrosoftNETTestSdkPackageVersion>
|
<MicrosoftNETTestSdkPackageVersion>15.6.1</MicrosoftNETTestSdkPackageVersion>
|
||||||
<MicrosoftWebAdministrationPackageVersion>11.1.0</MicrosoftWebAdministrationPackageVersion>
|
<MicrosoftWebAdministrationPackageVersion>11.1.0</MicrosoftWebAdministrationPackageVersion>
|
||||||
<NETStandardLibrary20PackageVersion>2.0.3</NETStandardLibrary20PackageVersion>
|
<NETStandardLibrary20PackageVersion>2.0.3</NETStandardLibrary20PackageVersion>
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
<IISAppHostConfig>$(MSBuildThisFileDirectory)applicationhost.iis.config</IISAppHostConfig>
|
<IISAppHostConfig>$(MSBuildThisFileDirectory)applicationhost.iis.config</IISAppHostConfig>
|
||||||
<NativePlatform Condition="'$(Platform)' == 'AnyCPU'">x64</NativePlatform>
|
<NativePlatform Condition="'$(Platform)' == 'AnyCPU'">x64</NativePlatform>
|
||||||
<NativePlatform Condition="'$(NativePlatform)' == ''">$(Platform)</NativePlatform>
|
<NativePlatform Condition="'$(NativePlatform)' == ''">$(Platform)</NativePlatform>
|
||||||
|
<PreserveCompilationContext>false</PreserveCompilationContext>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(NativePlatform)' == 'x86'">
|
<PropertyGroup Condition="'$(NativePlatform)' == 'x86'">
|
||||||
|
|
@ -51,7 +52,7 @@
|
||||||
|
|
||||||
<Target Name="CopyLaunchSettings" AfterTargets="CoreBuild">
|
<Target Name="CopyLaunchSettings" AfterTargets="CoreBuild">
|
||||||
<!-- This would always override launch settings files in test projects by the default one -->
|
<!-- This would always override launch settings files in test projects by the default one -->
|
||||||
<Copy SourceFiles="$(MSBuildThisFileDirectory)launchSettings.json" DestinationFolder="$(MSBuildProjectDirectory)\Properties" />
|
<Copy SourceFiles="$(MSBuildThisFileDirectory)launchSettings.json" DestinationFolder="$(MSBuildProjectDirectory)\Properties" SkipUnchangedFiles="true" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<!-- Deps file injection-->
|
<!-- Deps file injection-->
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,18 @@ using Microsoft.Extensions.Logging;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.Inprocess
|
namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class AppOfflineTests : IISFunctionalTestBase
|
public class AppOfflineTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public AppOfflineTests(PublishedSitesFixture fixture)
|
||||||
|
{
|
||||||
|
_fixture = fixture;
|
||||||
|
}
|
||||||
|
|
||||||
[ConditionalTheory]
|
[ConditionalTheory]
|
||||||
[InlineData(HostingModel.InProcess)]
|
[InlineData(HostingModel.InProcess)]
|
||||||
[InlineData(HostingModel.OutOfProcess)]
|
[InlineData(HostingModel.OutOfProcess)]
|
||||||
|
|
@ -36,8 +44,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.Inprocess
|
||||||
[InlineData(HostingModel.OutOfProcess, 502, "502.5")]
|
[InlineData(HostingModel.OutOfProcess, 502, "502.5")]
|
||||||
public async Task AppOfflineDroppedWhileSiteFailedToStartInShim_AppOfflineServed(HostingModel hostingModel, int statusCode, string content)
|
public async Task AppOfflineDroppedWhileSiteFailedToStartInShim_AppOfflineServed(HostingModel hostingModel, int statusCode, string content)
|
||||||
{
|
{
|
||||||
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel: hostingModel, publish: true);
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(hostingModel: hostingModel, publish: true);
|
|
||||||
deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "nonexistent"));
|
deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "nonexistent"));
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
@ -193,10 +200,9 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.Inprocess
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private async Task<IISDeploymentResult> DeployApp(HostingModel hostingModel = HostingModel.InProcess)
|
private async Task<IISDeploymentResult> DeployApp(HostingModel hostingModel = HostingModel.InProcess)
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(hostingModel: hostingModel, publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel: hostingModel, publish: true);
|
||||||
|
|
||||||
return await DeployAsync(deploymentParameters);
|
return await DeployAsync(deploymentParameters);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,20 @@ using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class EventLogTests : IISFunctionalTestBase
|
public class EventLogTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public EventLogTests(PublishedSitesFixture fixture)
|
||||||
|
{
|
||||||
|
_fixture = fixture;
|
||||||
|
}
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task CheckStartupEventLogMessage()
|
public async Task CheckStartupEventLogMessage()
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
await Helpers.AssertStarts(deploymentResult);
|
await Helpers.AssertStarts(deploymentResult);
|
||||||
|
|
||||||
|
|
@ -26,7 +34,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task CheckShutdownEventLogMessage()
|
public async Task CheckShutdownEventLogMessage()
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
deploymentParameters.GracefulShutdown = true;
|
deploymentParameters.GracefulShutdown = true;
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
await Helpers.AssertStarts(deploymentResult);
|
await Helpers.AssertStarts(deploymentResult);
|
||||||
|
|
|
||||||
|
|
@ -14,14 +14,22 @@ using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class LoggingTests : IISFunctionalTestBase
|
public class LoggingTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public LoggingTests(PublishedSitesFixture fixture)
|
||||||
|
{
|
||||||
|
_fixture = fixture;
|
||||||
|
}
|
||||||
|
|
||||||
[ConditionalTheory]
|
[ConditionalTheory]
|
||||||
[InlineData("CheckErrLogFile")]
|
[InlineData("CheckErrLogFile")]
|
||||||
[InlineData("CheckLogFile")]
|
[InlineData("CheckLogFile")]
|
||||||
public async Task CheckStdoutLoggingToFile(string path)
|
public async Task CheckStdoutLoggingToFile(string path)
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
|
|
||||||
deploymentParameters.WebConfigActionList.Add(
|
deploymentParameters.WebConfigActionList.Add(
|
||||||
WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true"));
|
WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true"));
|
||||||
|
|
@ -63,7 +71,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task InvalidFilePathForLogs_ServerStillRuns()
|
public async Task InvalidFilePathForLogs_ServerStillRuns()
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
|
|
||||||
deploymentParameters.WebConfigActionList.Add(
|
deploymentParameters.WebConfigActionList.Add(
|
||||||
WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true"));
|
WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true"));
|
||||||
|
|
@ -82,7 +90,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
var tempFile = Path.GetTempFileName();
|
var tempFile = Path.GetTempFileName();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_DEBUG_FILE"] = tempFile;
|
deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_DEBUG_FILE"] = tempFile;
|
||||||
deploymentParameters.AddDebugLogToWebConfig(tempFile);
|
deploymentParameters.AddDebugLogToWebConfig(tempFile);
|
||||||
|
|
||||||
|
|
@ -107,7 +115,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[InlineData("CheckLogFile")]
|
[InlineData("CheckLogFile")]
|
||||||
public async Task CheckStdoutLoggingToPipe_DoesNotCrashProcess(string path)
|
public async Task CheckStdoutLoggingToPipe_DoesNotCrashProcess(string path)
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
deploymentParameters.GracefulShutdown = true;
|
deploymentParameters.GracefulShutdown = true;
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
||||||
|
|
@ -126,7 +134,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[InlineData("CheckLogFile")]
|
[InlineData("CheckLogFile")]
|
||||||
public async Task CheckStdoutLoggingToPipeWithFirstWrite(string path)
|
public async Task CheckStdoutLoggingToPipeWithFirstWrite(string path)
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
deploymentParameters.GracefulShutdown = true;
|
deploymentParameters.GracefulShutdown = true;
|
||||||
|
|
||||||
var firstWriteString = path + path;
|
var firstWriteString = path + path;
|
||||||
|
|
@ -156,7 +164,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_DEBUG_FILE"] = firstTempFile;
|
deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_DEBUG_FILE"] = firstTempFile;
|
||||||
deploymentParameters.AddDebugLogToWebConfig(secondTempFile);
|
deploymentParameters.AddDebugLogToWebConfig(secondTempFile);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,16 @@ using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class StartupExceptionTests : IISFunctionalTestBase
|
public class StartupExceptionTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public StartupExceptionTests(PublishedSitesFixture fixture)
|
||||||
|
{
|
||||||
|
_fixture = fixture;
|
||||||
|
}
|
||||||
|
|
||||||
[ConditionalTheory]
|
[ConditionalTheory]
|
||||||
[InlineData("CheckLogFile")]
|
[InlineData("CheckLogFile")]
|
||||||
[InlineData("CheckErrLogFile")]
|
[InlineData("CheckErrLogFile")]
|
||||||
|
|
@ -21,7 +29,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
// Reason is because by default for IISExpress, we expect there to not be a web.config file.
|
// Reason is because by default for IISExpress, we expect there to not be a web.config file.
|
||||||
// However, for IIS, we need a web.config file because the default on generated on publish
|
// However, for IIS, we need a web.config file because the default on generated on publish
|
||||||
// doesn't include V2. We can remove the publish flag once IIS supports non-publish running
|
// doesn't include V2. We can remove the publish flag once IIS supports non-publish running
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters("StartupExceptionWebsite", publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.StartupExceptionWebsite, publish: true);
|
||||||
|
|
||||||
var randomNumberString = new Random(Guid.NewGuid().GetHashCode()).Next(10000000).ToString();
|
var randomNumberString = new Random(Guid.NewGuid().GetHashCode()).Next(10000000).ToString();
|
||||||
deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_INPROCESS_STARTUP_VALUE"] = path;
|
deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_INPROCESS_STARTUP_VALUE"] = path;
|
||||||
|
|
@ -45,7 +53,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[InlineData("CheckOversizedStdOutWrites")]
|
[InlineData("CheckOversizedStdOutWrites")]
|
||||||
public async Task CheckStdoutWithLargeWrites(string path)
|
public async Task CheckStdoutWithLargeWrites(string path)
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters("StartupExceptionWebsite", publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.StartupExceptionWebsite, publish: true);
|
||||||
deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_INPROCESS_STARTUP_VALUE"] = path;
|
deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_INPROCESS_STARTUP_VALUE"] = path;
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
@ -62,7 +70,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task Gets500_30_ErrorPage()
|
public async Task Gets500_30_ErrorPage()
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters("StartupExceptionWebsite", publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.StartupExceptionWebsite, publish: true);
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,21 +2,22 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
|
using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
|
||||||
using Microsoft.AspNetCore.Server.IntegrationTesting;
|
using Microsoft.AspNetCore.Server.IntegrationTesting;
|
||||||
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
|
||||||
using Microsoft.AspNetCore.Testing.xunit;
|
using Microsoft.AspNetCore.Testing.xunit;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Xunit.Abstractions;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class HelloWorldTests : IISFunctionalTestBase
|
public class HelloWorldTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
public HelloWorldTests(ITestOutputHelper output = null) : base(output)
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public HelloWorldTests(PublishedSitesFixture fixture)
|
||||||
{
|
{
|
||||||
|
_fixture = fixture;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TestMatrix TestVariants
|
public static TestMatrix TestVariants
|
||||||
|
|
@ -31,10 +32,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
// The default in hosting sets windows auth to true.
|
// The default in hosting sets windows auth to true.
|
||||||
// Set it to the IISExpress.config file
|
// Set it to the IISExpress.config file
|
||||||
var deploymentParameters = new IISDeploymentParameters(variant)
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
|
||||||
{
|
|
||||||
ApplicationPath = Helpers.GetOutOfProcessTestSitesPath()
|
|
||||||
};
|
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using Microsoft.AspNetCore.Server.IntegrationTesting;
|
||||||
|
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This type just maps collection names to available fixtures
|
||||||
|
/// </summary>
|
||||||
|
[CollectionDefinition(Name)]
|
||||||
|
public class PublishedSitesCollection : ICollectionFixture<PublishedSitesFixture>
|
||||||
|
{
|
||||||
|
public const string Name = nameof(PublishedSitesCollection);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PublishedSitesFixture : IDisposable
|
||||||
|
{
|
||||||
|
public CachingApplicationPublisher InProcessTestSite { get; } = new CachingApplicationPublisher(Helpers.GetInProcessTestSitesPath());
|
||||||
|
public CachingApplicationPublisher OutOfProcessTestSite { get; } = new CachingApplicationPublisher(Helpers.GetOutOfProcessTestSitesPath());
|
||||||
|
public CachingApplicationPublisher StartupExceptionWebsite { get; } = new CachingApplicationPublisher(Helpers.GetTestWebSitePath("StartupExceptionWebsite"));
|
||||||
|
public CachingApplicationPublisher OverriddenServerWebSite { get; } = new CachingApplicationPublisher(Helpers.GetTestWebSitePath("OverriddenServerWebSite"));
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
InProcessTestSite.Dispose();
|
||||||
|
OutOfProcessTestSite.Dispose();
|
||||||
|
StartupExceptionWebsite.Dispose();
|
||||||
|
OverriddenServerWebSite.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IISDeploymentParameters GetBaseDeploymentParameters(HostingModel hostingModel = HostingModel.InProcess, bool publish = false)
|
||||||
|
{
|
||||||
|
var publisher = hostingModel == HostingModel.InProcess ? InProcessTestSite : OutOfProcessTestSite;
|
||||||
|
return GetBaseDeploymentParameters(publisher, hostingModel, publish);
|
||||||
|
}
|
||||||
|
public IISDeploymentParameters GetBaseDeploymentParameters(TestVariant variant, bool publish = false)
|
||||||
|
{
|
||||||
|
var publisher = variant.HostingModel == HostingModel.InProcess ? InProcessTestSite : OutOfProcessTestSite;
|
||||||
|
return GetBaseDeploymentParameters(publisher, new DeploymentParameters(variant), publish);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IISDeploymentParameters GetBaseDeploymentParameters(ApplicationPublisher publisher, HostingModel hostingModel = HostingModel.InProcess, bool publish = false)
|
||||||
|
{
|
||||||
|
return GetBaseDeploymentParameters(
|
||||||
|
publisher,
|
||||||
|
new DeploymentParameters(publisher.ApplicationPath, DeployerSelector.ServerType, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64)
|
||||||
|
{
|
||||||
|
HostingModel = hostingModel
|
||||||
|
},
|
||||||
|
publish);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IISDeploymentParameters GetBaseDeploymentParameters(ApplicationPublisher publisher, DeploymentParameters baseParameters, bool publish = false)
|
||||||
|
{
|
||||||
|
return new IISDeploymentParameters(baseParameters)
|
||||||
|
{
|
||||||
|
ApplicationPublisher = publisher,
|
||||||
|
ApplicationPath = publisher.ApplicationPath,
|
||||||
|
TargetFramework = Tfm.NetCoreApp22,
|
||||||
|
ApplicationType = ApplicationType.Portable,
|
||||||
|
AncmVersion = AncmVersion.AspNetCoreModuleV2,
|
||||||
|
PublishApplicationBeforeDeployment = publish,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
||||||
|
|
@ -31,6 +32,10 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
||||||
parameters.ServerConfigTemplateContent = parameters.ServerConfigTemplateContent ?? File.ReadAllText("IISExpress.config");
|
parameters.ServerConfigTemplateContent = parameters.ServerConfigTemplateContent ?? File.ReadAllText("IISExpress.config");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parameters.ApplicationPublisher == null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("All tests should use ApplicationPublisher");
|
||||||
|
}
|
||||||
|
|
||||||
_deployer = IISApplicationDeployerFactory.Create(parameters, LoggerFactory);
|
_deployer = IISApplicationDeployerFactory.Create(parameters, LoggerFactory);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,24 +25,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
public static string GetInProcessTestSitesPath() => GetTestWebSitePath("InProcessWebSite");
|
public static string GetInProcessTestSitesPath() => GetTestWebSitePath("InProcessWebSite");
|
||||||
|
|
||||||
public static string GetOutOfProcessTestSitesPath() => GetTestWebSitePath("OutOfProcessWebSite");
|
public static string GetOutOfProcessTestSitesPath() => GetTestWebSitePath("OutOfProcessWebSite");
|
||||||
|
|
||||||
// Defaults to inprocess specific deployment parameters
|
|
||||||
public static IISDeploymentParameters GetBaseDeploymentParameters(string site = null, HostingModel hostingModel = HostingModel.InProcess, bool publish = false)
|
|
||||||
{
|
|
||||||
if (site == null)
|
|
||||||
{
|
|
||||||
site = hostingModel == HostingModel.InProcess ? "InProcessWebSite" : "OutOfProcessWebSite";
|
|
||||||
}
|
|
||||||
|
|
||||||
return new IISDeploymentParameters(GetTestWebSitePath(site), DeployerSelector.ServerType, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64)
|
|
||||||
{
|
|
||||||
TargetFramework = Tfm.NetCoreApp22,
|
|
||||||
ApplicationType = ApplicationType.Portable,
|
|
||||||
AncmVersion = AncmVersion.AspNetCoreModuleV2,
|
|
||||||
HostingModel = hostingModel,
|
|
||||||
PublishApplicationBeforeDeployment = publish,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task AssertStarts(IISDeploymentResult deploymentResult, string path = "/HelloWorld")
|
public static async Task AssertStarts(IISDeploymentResult deploymentResult, string path = "/HelloWorld")
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,20 @@ using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class AuthenticationTests : IISFunctionalTestBase
|
public class AuthenticationTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public AuthenticationTests(PublishedSitesFixture fixture)
|
||||||
|
{
|
||||||
|
_fixture = fixture;
|
||||||
|
}
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task Authentication_InProcess()
|
public async Task Authentication_InProcess()
|
||||||
{
|
{
|
||||||
var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
deploymentParameters.AddWindowsAuthToServerConfig();
|
deploymentParameters.AddWindowsAuthToServerConfig();
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
|
||||||
|
|
@ -9,21 +9,23 @@ using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities;
|
||||||
using Microsoft.AspNetCore.Server.IntegrationTesting;
|
using Microsoft.AspNetCore.Server.IntegrationTesting;
|
||||||
using Microsoft.AspNetCore.Testing.xunit;
|
using Microsoft.AspNetCore.Testing.xunit;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Xunit.Abstractions;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class ShutdownTests : IISFunctionalTestBase
|
public class ShutdownTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
public ShutdownTests(ITestOutputHelper output) : base(output)
|
public ShutdownTests(PublishedSitesFixture fixture)
|
||||||
{
|
{
|
||||||
|
_fixture = fixture;
|
||||||
}
|
}
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task ServerShutsDownWhenMainExits()
|
public async Task ServerShutsDownWhenMainExits()
|
||||||
{
|
{
|
||||||
var parameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var parameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
var result = await DeployAsync(parameters);
|
var result = await DeployAsync(parameters);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -39,7 +41,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task GracefulShutdown_DoesNotCrashProcess()
|
public async Task GracefulShutdown_DoesNotCrashProcess()
|
||||||
{
|
{
|
||||||
var parameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var parameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
parameters.GracefulShutdown = true;
|
parameters.GracefulShutdown = true;
|
||||||
var result = await DeployAsync(parameters);
|
var result = await DeployAsync(parameters);
|
||||||
|
|
||||||
|
|
@ -51,7 +53,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task ForcefulShutdown_DoesrashProcess()
|
public async Task ForcefulShutdown_DoesrashProcess()
|
||||||
{
|
{
|
||||||
var parameters = Helpers.GetBaseDeploymentParameters(publish: true);
|
var parameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
var result = await DeployAsync(parameters);
|
var result = await DeployAsync(parameters);
|
||||||
|
|
||||||
var response = await result.RetryingHttpClient.GetAsync("/HelloWorld");
|
var response = await result.RetryingHttpClient.GetAsync("/HelloWorld");
|
||||||
|
|
|
||||||
|
|
@ -11,18 +11,21 @@ using Microsoft.AspNetCore.Server.IntegrationTesting;
|
||||||
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
||||||
using Microsoft.AspNetCore.Testing.xunit;
|
using Microsoft.AspNetCore.Testing.xunit;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Xunit.Abstractions;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class StartupTests : IISFunctionalTestBase
|
public class StartupTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
private readonly string _dotnetLocation = DotNetCommands.GetDotNetExecutable(RuntimeArchitecture.x64);
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
public StartupTests(ITestOutputHelper output) : base(output)
|
public StartupTests(PublishedSitesFixture fixture)
|
||||||
{
|
{
|
||||||
|
_fixture = fixture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly string _dotnetLocation = DotNetCommands.GetDotNetExecutable(RuntimeArchitecture.x64);
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task ExpandEnvironmentVariableInWebConfig()
|
public async Task ExpandEnvironmentVariableInWebConfig()
|
||||||
{
|
{
|
||||||
|
|
@ -42,7 +45,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[InlineData(".\\dotnet.exe")]
|
[InlineData(".\\dotnet.exe")]
|
||||||
public async Task InvalidProcessPath_ExpectServerError(string path)
|
public async Task InvalidProcessPath_ExpectServerError(string path)
|
||||||
{
|
{
|
||||||
var deploymentParameters = GetBaseDeploymentParameters();
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path));
|
deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path));
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -99,7 +102,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
private async Task AssertStarts(Action<IISDeploymentParameters> preDeploy = null)
|
private async Task AssertStarts(Action<IISDeploymentParameters> preDeploy = null)
|
||||||
{
|
{
|
||||||
var deploymentParameters = GetBaseDeploymentParameters();
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
|
|
||||||
preDeploy?.Invoke(deploymentParameters);
|
preDeploy?.Invoke(deploymentParameters);
|
||||||
|
|
||||||
|
|
@ -121,11 +124,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[MemberData(nameof(TestVariants))]
|
[MemberData(nameof(TestVariants))]
|
||||||
public async Task HelloWorld(TestVariant variant)
|
public async Task HelloWorld(TestVariant variant)
|
||||||
{
|
{
|
||||||
var deploymentParameters = new IISDeploymentParameters(variant)
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true);
|
||||||
{
|
|
||||||
ApplicationPath = Helpers.GetInProcessTestSitesPath(),
|
|
||||||
PublishApplicationBeforeDeployment = true
|
|
||||||
};
|
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
||||||
|
|
@ -138,7 +137,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task DetectsOveriddenServer()
|
public async Task DetectsOveriddenServer()
|
||||||
{
|
{
|
||||||
var deploymentResult = await DeployAsync(GetBaseDeploymentParameters("OverriddenServerWebSite"));
|
var deploymentResult = await DeployAsync(_fixture.GetBaseDeploymentParameters(_fixture.OverriddenServerWebSite, publish: true));
|
||||||
var response = await deploymentResult.HttpClient.GetAsync("/");
|
var response = await deploymentResult.HttpClient.GetAsync("/");
|
||||||
Assert.False(response.IsSuccessStatusCode);
|
Assert.False(response.IsSuccessStatusCode);
|
||||||
|
|
||||||
|
|
@ -150,7 +149,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task CheckInvalidHostingModelParameter()
|
public async Task CheckInvalidHostingModelParameter()
|
||||||
{
|
{
|
||||||
var deploymentParameters = GetBaseDeploymentParameters();
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("hostingModel", "bogus"));
|
deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("hostingModel", "bogus"));
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
@ -161,18 +160,5 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
EventLogHelpers.VerifyEventLogEvent(TestSink, "Unknown hosting model 'bogus'. Please specify either hostingModel=\"inprocess\" or hostingModel=\"outofprocess\" in the web.config file.");
|
EventLogHelpers.VerifyEventLogEvent(TestSink, "Unknown hosting model 'bogus'. Please specify either hostingModel=\"inprocess\" or hostingModel=\"outofprocess\" in the web.config file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Defaults to inprocess specific deployment parameters
|
|
||||||
public static IISDeploymentParameters GetBaseDeploymentParameters(string site = "InProcessWebSite")
|
|
||||||
{
|
|
||||||
return new IISDeploymentParameters(Helpers.GetTestWebSitePath(site), DeployerSelector.ServerType, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64)
|
|
||||||
{
|
|
||||||
TargetFramework = Tfm.NetCoreApp22,
|
|
||||||
ApplicationType = ApplicationType.Portable,
|
|
||||||
AncmVersion = AncmVersion.AspNetCoreModuleV2,
|
|
||||||
HostingModel = HostingModel.InProcess,
|
|
||||||
PublishApplicationBeforeDeployment = site == "InProcessWebSite",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,13 +13,20 @@ using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class GlobalVersionTests : IISFunctionalTestBase
|
public class GlobalVersionTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public GlobalVersionTests(PublishedSitesFixture fixture)
|
||||||
|
{
|
||||||
|
_fixture = fixture;
|
||||||
|
}
|
||||||
|
|
||||||
private const string _aspNetCoreDll = "aspnetcorev2_outofprocess.dll";
|
private const string _aspNetCoreDll = "aspnetcorev2_outofprocess.dll";
|
||||||
private const string _handlerVersion20 = "2.0.0";
|
private const string _handlerVersion20 = "2.0.0";
|
||||||
private const string _helloWorldRequest = "HelloWorld";
|
private const string _helloWorldRequest = "HelloWorld";
|
||||||
private const string _helloWorldResponse = "Hello World";
|
private const string _helloWorldResponse = "Hello World";
|
||||||
private const string _outOfProcessVersionVariable = "/p:AspNetCoreModuleOutOfProcessVersion=";
|
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
public async Task GlobalVersion_DefaultWorks()
|
public async Task GlobalVersion_DefaultWorks()
|
||||||
|
|
@ -65,11 +72,14 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
public async Task GlobalVersion_NewVersionNumber(string version)
|
public async Task GlobalVersion_NewVersionNumber(string version)
|
||||||
{
|
{
|
||||||
var deploymentParameters = GetGlobalVersionBaseDeploymentParameters();
|
var deploymentParameters = GetGlobalVersionBaseDeploymentParameters();
|
||||||
deploymentParameters.AdditionalPublishParameters = $"{_outOfProcessVersionVariable}{version}";
|
|
||||||
deploymentParameters.HandlerSettings["handlerVersion"] = version;
|
deploymentParameters.HandlerSettings["handlerVersion"] = version;
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
||||||
|
var originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20);
|
||||||
|
var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version);
|
||||||
|
Directory.Move(originalANCMPath, newANCMPath);
|
||||||
|
|
||||||
var response = await deploymentResult.RetryingHttpClient.GetAsync(_helloWorldRequest);
|
var response = await deploymentResult.RetryingHttpClient.GetAsync(_helloWorldRequest);
|
||||||
var responseText = await response.Content.ReadAsStringAsync();
|
var responseText = await response.Content.ReadAsStringAsync();
|
||||||
Assert.Equal(_helloWorldResponse, responseText);
|
Assert.Equal(_helloWorldResponse, responseText);
|
||||||
|
|
@ -89,9 +99,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version);
|
var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version);
|
||||||
|
|
||||||
var di = Directory.CreateDirectory(Path.GetDirectoryName(newANCMPath));
|
CopyDirectory(originalANCMPath, newANCMPath);
|
||||||
|
|
||||||
File.Copy(originalANCMPath, newANCMPath, true);
|
|
||||||
|
|
||||||
deploymentResult.RetryingHttpClient.DefaultRequestHeaders.Add("ANCMRHPath", newANCMPath);
|
deploymentResult.RetryingHttpClient.DefaultRequestHeaders.Add("ANCMRHPath", newANCMPath);
|
||||||
var response = await deploymentResult.RetryingHttpClient.GetAsync("CheckRequestHandlerVersion");
|
var response = await deploymentResult.RetryingHttpClient.GetAsync("CheckRequestHandlerVersion");
|
||||||
|
|
@ -125,9 +133,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version);
|
var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version);
|
||||||
|
|
||||||
var di = Directory.CreateDirectory(Path.GetDirectoryName(newANCMPath));
|
CopyDirectory(originalANCMPath, newANCMPath);
|
||||||
|
|
||||||
File.Copy(originalANCMPath, newANCMPath, true);
|
|
||||||
|
|
||||||
deploymentResult.RetryingHttpClient.DefaultRequestHeaders.Add("ANCMRHPath", newANCMPath);
|
deploymentResult.RetryingHttpClient.DefaultRequestHeaders.Add("ANCMRHPath", newANCMPath);
|
||||||
response = await deploymentResult.RetryingHttpClient.GetAsync("CheckRequestHandlerVersion");
|
response = await deploymentResult.RetryingHttpClient.GetAsync("CheckRequestHandlerVersion");
|
||||||
|
|
@ -139,23 +145,25 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
private IISDeploymentParameters GetGlobalVersionBaseDeploymentParameters()
|
private IISDeploymentParameters GetGlobalVersionBaseDeploymentParameters()
|
||||||
{
|
{
|
||||||
return new IISDeploymentParameters(Helpers.GetOutOfProcessTestSitesPath(), DeployerSelector.ServerType, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64)
|
return _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CopyDirectory(string from, string to)
|
||||||
|
{
|
||||||
|
var toInfo = new DirectoryInfo(to);
|
||||||
|
toInfo.Create();
|
||||||
|
|
||||||
|
foreach (var file in new DirectoryInfo(from).GetFiles())
|
||||||
{
|
{
|
||||||
TargetFramework = Tfm.NetCoreApp22,
|
file.CopyTo(Path.Combine(toInfo.FullName, file.Name));
|
||||||
ApplicationType = ApplicationType.Portable,
|
}
|
||||||
AncmVersion = AncmVersion.AspNetCoreModuleV2,
|
|
||||||
HostingModel = HostingModel.OutOfProcess,
|
|
||||||
PublishApplicationBeforeDeployment = true,
|
|
||||||
AdditionalPublishParameters = $"{_outOfProcessVersionVariable}{_handlerVersion20}"
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetANCMRequestHandlerPath(IISDeploymentResult deploymentResult, string version)
|
private string GetANCMRequestHandlerPath(IISDeploymentResult deploymentResult, string version)
|
||||||
{
|
{
|
||||||
return Path.Combine(deploymentResult.ContentRoot,
|
return Path.Combine(deploymentResult.ContentRoot,
|
||||||
deploymentResult.DeploymentParameters.RuntimeArchitecture.ToString(),
|
deploymentResult.DeploymentParameters.RuntimeArchitecture.ToString(),
|
||||||
version,
|
version);
|
||||||
_aspNetCoreDll);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AssertLoadedVersion(string version)
|
private void AssertLoadedVersion(string version)
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,14 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
// So these tests always have to use ports in this range, and we can't rely on OS-allocated ports without a whole lot of ceremony around
|
// So these tests always have to use ports in this range, and we can't rely on OS-allocated ports without a whole lot of ceremony around
|
||||||
// creating self-signed certificates and registering SSL bindings with HTTP.sys
|
// creating self-signed certificates and registering SSL bindings with HTTP.sys
|
||||||
// Test specific to IISExpress
|
// Test specific to IISExpress
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class HttpsTest : IISFunctionalTestBase
|
public class HttpsTest : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
public HttpsTest(ITestOutputHelper output) : base(output)
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public HttpsTest(PublishedSitesFixture fixture)
|
||||||
{
|
{
|
||||||
|
_fixture = fixture;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TestMatrix TestVariants
|
public static TestMatrix TestVariants
|
||||||
|
|
@ -34,12 +38,8 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
public async Task HttpsHelloWorld(TestVariant variant)
|
public async Task HttpsHelloWorld(TestVariant variant)
|
||||||
{
|
{
|
||||||
var port = TestPortHelper.GetNextSSLPort();
|
var port = TestPortHelper.GetNextSSLPort();
|
||||||
var deploymentParameters = new IISDeploymentParameters(variant)
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
|
||||||
{
|
deploymentParameters.ApplicationBaseUriHint = $"https://localhost:{port}/";
|
||||||
ApplicationPath = Helpers.GetOutOfProcessTestSitesPath(),
|
|
||||||
ApplicationBaseUriHint = $"https://localhost:{port}/"
|
|
||||||
};
|
|
||||||
|
|
||||||
deploymentParameters.AddHttpsToServerConfig();
|
deploymentParameters.AddHttpsToServerConfig();
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
@ -73,12 +73,8 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
private async Task HttpsHelloWorldCerts(TestVariant variant, bool sendClientCert)
|
private async Task HttpsHelloWorldCerts(TestVariant variant, bool sendClientCert)
|
||||||
{
|
{
|
||||||
var port = TestPortHelper.GetNextSSLPort();
|
var port = TestPortHelper.GetNextSSLPort();
|
||||||
var deploymentParameters = new IISDeploymentParameters(variant)
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
|
||||||
{
|
deploymentParameters.ApplicationBaseUriHint = $"https://localhost:{port}/";
|
||||||
ApplicationPath = Helpers.GetOutOfProcessTestSitesPath(),
|
|
||||||
ApplicationBaseUriHint = $"https://localhost:{port}/",
|
|
||||||
};
|
|
||||||
|
|
||||||
deploymentParameters.AddHttpsToServerConfig();
|
deploymentParameters.AddHttpsToServerConfig();
|
||||||
|
|
||||||
var deploymentResult = await DeployAsync(deploymentParameters);
|
var deploymentResult = await DeployAsync(deploymentParameters);
|
||||||
|
|
|
||||||
|
|
@ -13,14 +13,19 @@ using Xunit.Abstractions;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class NtlmAuthenticationTests : IISFunctionalTestBase
|
public class NtlmAuthenticationTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
// Test only runs on IISExpress today as our CI machines do not have
|
// Test only runs on IISExpress today as our CI machines do not have
|
||||||
// Windows auth installed globally.
|
// Windows auth installed globally.
|
||||||
// TODO either enable windows auth on our CI or use containers to test this
|
// TODO either enable windows auth on our CI or use containers to test this
|
||||||
// behavior
|
// behavior
|
||||||
public NtlmAuthenticationTests(ITestOutputHelper output) : base(output)
|
|
||||||
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public NtlmAuthenticationTests(PublishedSitesFixture fixture)
|
||||||
{
|
{
|
||||||
|
_fixture = fixture;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TestMatrix TestVariants
|
public static TestMatrix TestVariants
|
||||||
|
|
@ -32,11 +37,8 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[MemberData(nameof(TestVariants))]
|
[MemberData(nameof(TestVariants))]
|
||||||
public async Task NtlmAuthentication(TestVariant variant)
|
public async Task NtlmAuthentication(TestVariant variant)
|
||||||
{
|
{
|
||||||
var deploymentParameters = new IISDeploymentParameters(variant)
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
|
||||||
{
|
deploymentParameters.ApplicationBaseUriHint = $"https://localhost:0/";
|
||||||
ApplicationPath = Helpers.GetOutOfProcessTestSitesPath(),
|
|
||||||
ApplicationBaseUriHint = $"http://localhost:0/"
|
|
||||||
};
|
|
||||||
|
|
||||||
deploymentParameters.AddWindowsAuthToServerConfig();
|
deploymentParameters.AddWindowsAuthToServerConfig();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,14 @@ using Xunit.Abstractions;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class WindowsAuthTests : IISFunctionalTestBase
|
public class WindowsAuthTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
public WindowsAuthTests(ITestOutputHelper output = null) : base(output)
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
|
public WindowsAuthTests(PublishedSitesFixture fixture)
|
||||||
{
|
{
|
||||||
|
_fixture = fixture;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TestMatrix TestVariants
|
public static TestMatrix TestVariants
|
||||||
|
|
@ -28,10 +32,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
[MemberData(nameof(TestVariants))]
|
[MemberData(nameof(TestVariants))]
|
||||||
public async Task WindowsAuthTest(TestVariant variant)
|
public async Task WindowsAuthTest(TestVariant variant)
|
||||||
{
|
{
|
||||||
var deploymentParameters = new IISDeploymentParameters(variant)
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant);
|
||||||
{
|
|
||||||
ApplicationPath = Helpers.GetOutOfProcessTestSitesPath(),
|
|
||||||
};
|
|
||||||
deploymentParameters.AddWindowsAuthToServerConfig();
|
deploymentParameters.AddWindowsAuthToServerConfig();
|
||||||
|
|
||||||
// The default in hosting sets windows auth to true.
|
// The default in hosting sets windows auth to true.
|
||||||
|
|
|
||||||
|
|
@ -9,16 +9,18 @@ using Microsoft.AspNetCore.Server.IntegrationTesting;
|
||||||
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
|
||||||
using Microsoft.AspNetCore.Testing.xunit;
|
using Microsoft.AspNetCore.Testing.xunit;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Xunit.Abstractions;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
{
|
{
|
||||||
|
[Collection(PublishedSitesCollection.Name)]
|
||||||
public class UpgradeFeatureDetectionTests : IISFunctionalTestBase
|
public class UpgradeFeatureDetectionTests : IISFunctionalTestBase
|
||||||
{
|
{
|
||||||
private readonly string _isWebsocketsSupported = Environment.OSVersion.Version >= new Version(6, 2) ? "Enabled" : "Disabled";
|
private readonly string _isWebsocketsSupported = Environment.OSVersion.Version >= new Version(6, 2) ? "Enabled" : "Disabled";
|
||||||
|
private readonly PublishedSitesFixture _fixture;
|
||||||
|
|
||||||
public UpgradeFeatureDetectionTests(ITestOutputHelper output) : base(output)
|
public UpgradeFeatureDetectionTests(PublishedSitesFixture fixture)
|
||||||
{
|
{
|
||||||
|
_fixture = fixture;
|
||||||
}
|
}
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
|
|
@ -60,14 +62,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
private async Task UpgradeFeatureDetectionDeployer(bool disableWebSocket, string sitePath, string expected, HostingModel hostingModel)
|
private async Task UpgradeFeatureDetectionDeployer(bool disableWebSocket, string sitePath, string expected, HostingModel hostingModel)
|
||||||
{
|
{
|
||||||
var deploymentParameters = new IISDeploymentParameters(sitePath, DeployerSelector.ServerType, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64)
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel, publish: true);
|
||||||
{
|
|
||||||
TargetFramework = Tfm.NetCoreApp22,
|
|
||||||
ApplicationType = ApplicationType.Portable,
|
|
||||||
AncmVersion = AncmVersion.AspNetCoreModuleV2,
|
|
||||||
HostingModel = hostingModel,
|
|
||||||
PublishApplicationBeforeDeployment = hostingModel == HostingModel.InProcess
|
|
||||||
};
|
|
||||||
|
|
||||||
if (disableWebSocket)
|
if (disableWebSocket)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue