public async Task StartsWithDotnetInstallLocation(RuntimeArchitecture runtimeArchitecture) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); deploymentParameters.RuntimeArchitecture = runtimeArchitecture; // IIS doesn't allow empty PATH deploymentParameters.EnvironmentVariables["PATH"] = "."; deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "dotnet")); // Key is always in 32bit view using (var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)) { var installDir = DotNetCommands.GetDotNetInstallDir(runtimeArchitecture); using (new TestRegistryKey( localMachine, "SOFTWARE\\dotnet\\Setup\\InstalledVersions\\" + runtimeArchitecture, "InstallLocation", installDir)) { var deploymentResult = await DeployAsync(deploymentParameters); await deploymentResult.AssertStarts(); StopServer(); // Verify that in this scenario dotnet.exe was found using InstallLocation lookup // I would've liked to make a copy of dotnet directory in this test and use it for verification // but dotnet roots are usually very large on dev machines so this test would take disproportionally long time and disk space Assert.Equal(1, TestSink.Writes.Count(w => w.Message.Contains($"Found dotnet.exe in InstallLocation at '{installDir}\\dotnet.exe'"))); } } }
public async Task StartupTimeoutIsApplied() { // From what I can tell, this failure is due to ungraceful shutdown. // The error could be the same as https://github.com/dotnet/core-setup/issues/4646 // But can't be certain without another repro. using (AppVerifier.Disable(DeployerSelector.ServerType, 0x300)) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(Fixture.InProcessTestSite); deploymentParameters.TransformArguments((a, _) => $"{a} Hang"); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("startupTimeLimit", "1")); var deploymentResult = await DeployAsync(deploymentParameters); var response = await deploymentResult.HttpClient.GetAsync("/"); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); StopServer(); EventLogHelpers.VerifyEventLogEvents(deploymentResult, EventLogHelpers.InProcessFailedToStart(deploymentResult, "Managed server didn't initialize after 1000 ms.") ); } }
protected override IEnumerable <Action <XElement, string> > GetWebConfigActions() { if (IISDeploymentParameters.PublishApplicationBeforeDeployment) { // For published apps, prefer the content in the web.config, but update it. yield return(WebConfigHelpers.AddOrModifyAspNetCoreSection( key: "hostingModel", value: DeploymentParameters.HostingModel.ToString())); yield return(WebConfigHelpers.AddOrModifyHandlerSection( key: "modules", value: AspNetCoreModuleV2ModuleName)); // We assume the x64 dotnet.exe is on the path so we need to provide an absolute path for x86 scenarios. // Only do it for scenarios that rely on dotnet.exe (Core, portable, etc.). if (DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr && DeploymentParameters.ApplicationType == ApplicationType.Portable && DotNetCommands.IsRunningX86OnX64(DeploymentParameters.RuntimeArchitecture)) { var executableName = DotNetCommands.GetDotNetExecutable(DeploymentParameters.RuntimeArchitecture); if (!File.Exists(executableName)) { throw new Exception($"Unable to find '{executableName}'.'"); } yield return(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", executableName)); } } foreach (var action in base.GetWebConfigActions()) { yield return(action); } }
public static void EnableLogging(this IISDeploymentParameters deploymentParameters, string path) { deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true")); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogFile", Path.Combine(path, "std"))); }
public async Task ExpandEnvironmentVariableInWebConfig() { // Point to dotnet installed in user profile. var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); deploymentParameters.EnvironmentVariables["DotnetPath"] = _dotnetLocation; deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "%DotnetPath%")); await StartAsync(deploymentParameters); }
public async Task EnvironmentVariableForLauncherPathIsPreferred(HostingModel hostingModel) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(hostingModel); deploymentParameters.EnvironmentVariables["ANCM_LAUNCHER_PATH"] = _dotnetLocation; deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "nope")); await StartAsync(deploymentParameters); }
public async Task StartsWithDotnetLocationUppercase() { var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); var dotnetLocationWithoutExtension = _dotnetLocation.Substring(0, _dotnetLocation.LastIndexOf(".")).ToUpperInvariant(); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", dotnetLocationWithoutExtension)); await StartAsync(deploymentParameters); }
public async Task EnvironmentVariableForLauncherArgsIsPreferred(HostingModel hostingModel) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(hostingModel); using var publishedApp = await deploymentParameters.ApplicationPublisher.Publish(deploymentParameters, LoggerFactory.CreateLogger("test")); deploymentParameters.EnvironmentVariables["ANCM_LAUNCHER_ARGS"] = Path.ChangeExtension(Path.Combine(publishedApp.Path, deploymentParameters.ApplicationPublisher.ApplicationPath), ".dll"); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("arguments", "nope")); await StartAsync(deploymentParameters); }
public async Task StartsWithDotnetLocationUppercase() { var dotnetLocationWithoutExtension = _dotnetLocation.Substring(0, _dotnetLocation.LastIndexOf(".")).ToUpperInvariant(); await AssertStarts( deploymentParameters => { deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", dotnetLocationWithoutExtension)); } ); }
public async Task ExpandEnvironmentVariableInWebConfig() { // Point to dotnet installed in user profile. await AssertStarts( deploymentParameters => { deploymentParameters.EnvironmentVariables["DotnetPath"] = _dotnetLocation; deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "%DotnetPath%")); } ); }
private async Task <HttpResponseMessage> DeployAppWithStartupFailure(IISDeploymentParameters deploymentParameters) { deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "doesnot")); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("arguments", "start")); deploymentParameters.EnvironmentVariables["ANCM_ADDITIONAL_ERROR_PAGE_LINK"] = "http://example"; var deploymentResult = await DeployAsync(deploymentParameters); return(await deploymentResult.HttpClient.GetAsync("HelloWorld")); }
public async Task InvalidFilePathForLogs_ServerStillRuns() { var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true")); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogFile", Path.Combine("Q:", "std"))); var deploymentResult = await DeployAsync(deploymentParameters); await Helpers.AssertStarts(deploymentResult, "HelloWorld"); }
public async Task StartsWithDotnetOnThePath(string path) { await AssertStarts( deploymentParameters => { deploymentParameters.EnvironmentVariables["PATH"] = Path.GetDirectoryName(_dotnetLocation); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path)); } ); // Verify that in this scenario where.exe was invoked only once by shim and request handler uses cached value Assert.Equal(1, TestSink.Writes.Count(w => w.Message.Contains("Invoking where.exe to find dotnet.exe"))); }
public async Task CheckInvalidHostingModelParameter() { var deploymentParameters = GetBaseDeploymentParameters(); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("hostingModel", "bogus")); var deploymentResult = await DeployAsync(deploymentParameters); var response = await deploymentResult.RetryingHttpClient.GetAsync("HelloWorld"); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); EventLogHelpers.VerifyEventLogEvent(TestSink, "Unknown hosting model 'bogus'. Please specify either hostingModel=\"inprocess\" or hostingModel=\"outofprocess\" in the web.config file."); }
public async Task InvalidProcessPath_ExpectServerError(string path) { var deploymentParameters = GetBaseDeploymentParameters(); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path)); var deploymentResult = await DeployAsync(deploymentParameters); var response = await deploymentResult.RetryingHttpClient.GetAsync("HelloWorld"); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); EventLogHelpers.VerifyEventLogEvent(TestSink, @"Invalid or unknown processPath provided in web\.config: processPath = '.+', ErrorCode = '0x80070002'\."); }
public async Task InvalidProcessPath_ExpectServerError(string path, string arguments, string subError) { var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path)); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("arguments", arguments)); var deploymentResult = await DeployAsync(deploymentParameters); var response = await deploymentResult.HttpClient.GetAsync("HelloWorld"); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); StopServer(); EventLogHelpers.VerifyEventLogEvent(deploymentResult, TestSink, $@"Application '{Regex.Escape(deploymentResult.ContentRoot)}\\' wasn't able to start. {subError}"); }
public async Task ShutdownTimeoutIsApplied() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(Fixture.InProcessTestSite); deploymentParameters.TransformArguments((a, _) => $"{a} HangOnStop"); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("shutdownTimeLimit", "1")); var deploymentResult = await DeployAsync(deploymentParameters); Assert.Equal("Hello World", await deploymentResult.HttpClient.GetStringAsync("/HelloWorld")); StopServer(); EventLogHelpers.VerifyEventLogEvents(deploymentResult, EventLogHelpers.InProcessStarted(deploymentResult), EventLogHelpers.InProcessFailedToStop(deploymentResult, "")); }
public async Task AppOfflineDroppedWhileSiteFailedToStartInShim_AppOfflineServed(HostingModel hostingModel, int statusCode, string content) { var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel: hostingModel); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "nonexistent")); var deploymentResult = await DeployAsync(deploymentParameters); var result = await deploymentResult.HttpClient.GetAsync("/"); Assert.Equal(statusCode, (int)result.StatusCode); Assert.Contains(content, await result.Content.ReadAsStringAsync()); AddAppOffline(deploymentResult.ContentRoot); await AssertAppOffline(deploymentResult); DeletePublishOutput(deploymentResult); }
public async Task InvalidProcessPath_ExpectServerError(string path, string arguments, string subError) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path)); deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("arguments", arguments)); var deploymentResult = await DeployAsync(deploymentParameters); var response = await deploymentResult.HttpClient.GetAsync("HelloWorld"); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); StopServer(); EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.UnableToStart(deploymentResult, subError), Logger); Assert.Contains("HTTP Error 500.0 - ANCM In-Process Handler Load Failure", await response.Content.ReadAsStringAsync()); }
public async Task InvalidFilePathForLogs_ServerStillRuns(TestVariant variant) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(variant); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true")); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogFile", Path.Combine("Q:", "std"))); var deploymentResult = await DeployAsync(deploymentParameters); await Helpers.AssertStarts(deploymentResult, "HelloWorld"); StopServer(); if (variant.HostingModel == HostingModel.InProcess) { // Error is getting logged twice, from shim and handler EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.CouldNotStartStdoutFileRedirection("Q:\\std", deploymentResult), Logger, allowMultiple: true); } }
public async Task StartupTimeoutIsApplied() { var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); deploymentParameters.TransformArguments((a, _) => $"{a} Hang"); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("startupTimeLimit", "1")); var deploymentResult = await DeployAsync(deploymentParameters); var response = await deploymentResult.HttpClient.GetAsync("/"); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); StopServer(); EventLogHelpers.VerifyEventLogEvents(deploymentResult, EventLogHelpers.InProcessFailedToStart(deploymentResult, "Managed server didn't initialize after 1000 ms.") ); }
public async Task InvalidFilePathForLogs_ServerStillRuns(TestVariant variant) { var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true")); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogFile", Path.Combine("Q:", "std"))); var deploymentResult = await DeployAsync(deploymentParameters); await Helpers.AssertStarts(deploymentResult, "HelloWorld"); StopServer(); if (variant.HostingModel == HostingModel.InProcess) { EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Could not start stdout redirection in (.*)aspnetcorev2.dll. Exception message: HRESULT 0x80070003"); EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Could not stop stdout redirection in (.*)aspnetcorev2.dll. Exception message: HRESULT 0x80070002"); } }
public async Task CheckStdoutLoggingToFile(string path) { var deploymentParameters = Helpers.GetBaseDeploymentParameters(publish: true); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true")); var pathToLogs = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); deploymentParameters.WebConfigActionList.Add( WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogFile", Path.Combine(pathToLogs, "std"))); var deploymentResult = await DeployAsync(deploymentParameters); try { await Helpers.AssertStarts(deploymentResult, path); StopServer(); var fileInDirectory = Directory.GetFiles(pathToLogs).Single(); var contents = File.ReadAllText(fileInDirectory); Assert.NotNull(contents); Assert.Contains("TEST MESSAGE", contents); Assert.DoesNotContain(TestSink.Writes, context => context.Message.Contains("TEST MESSAGE")); // TODO we should check that debug logs are restored during graceful shutdown. // The IIS Express deployer doesn't support graceful shutdown. //Assert.Contains(TestSink.Writes, context => context.Message.Contains("Restoring original stdout: ")); } finally { RetryHelper.RetryOperation( () => Directory.Delete(pathToLogs, true), e => Logger.LogWarning($"Failed to delete directory : {e.Message}"), retryCount: 3, retryDelayMilliseconds: 100); } }