public Process StartDotnetTestSample(MockTracerAgent agent, string arguments, string packageVersion, int aspNetCorePort, string framework = "") { // get path to sample app that the profiler will attach to string sampleAppPath = EnvironmentHelper.GetTestCommandForSampleApplicationPath(packageVersion, framework); if (!File.Exists(sampleAppPath)) { throw new Exception($"application not found: {sampleAppPath}"); } Output.WriteLine($"Starting Application: {sampleAppPath}"); string testCli = EnvironmentHelper.GetDotNetTest(); string exec = testCli; string appPath = testCli.StartsWith("dotnet") ? $"vstest {sampleAppPath}" : sampleAppPath; Output.WriteLine("Executable: " + exec); Output.WriteLine("ApplicationPath: " + appPath); return(ProfilerHelper.StartProcessWithProfiler( exec, EnvironmentHelper, agent, $"{appPath} {arguments ?? string.Empty}", aspNetCorePort: aspNetCorePort, processToProfile: exec + ";testhost.exe")); }
public Process StartSample(MockTracerAgent agent, string arguments, string packageVersion, int aspNetCorePort, string framework = "") { // get path to sample app that the profiler will attach to string sampleAppPath = EnvironmentHelper.GetSampleApplicationPath(packageVersion, framework); if (!File.Exists(sampleAppPath)) { throw new Exception($"application not found: {sampleAppPath}"); } Output.WriteLine($"Starting Application: {sampleAppPath}"); var executable = EnvironmentHelper.IsCoreClr() ? EnvironmentHelper.GetSampleExecutionSource() : sampleAppPath; var args = EnvironmentHelper.IsCoreClr() ? $"{sampleAppPath} {arguments ?? string.Empty}" : arguments; return(ProfilerHelper.StartProcessWithProfiler( executable, EnvironmentHelper, agent, args, aspNetCorePort: aspNetCorePort, processToProfile: executable)); }
public (Process Process, string ConfigFile) StartIISExpress(MockTracerAgent agent, int iisPort, IisAppType appType) { var iisExpress = EnvironmentHelper.GetIisExpressPath(); var appPool = appType switch { IisAppType.AspNetClassic => "Clr4ClassicAppPool", IisAppType.AspNetIntegrated => "Clr4IntegratedAppPool", IisAppType.AspNetCoreInProcess => "UnmanagedClassicAppPool", IisAppType.AspNetCoreOutOfProcess => "UnmanagedClassicAppPool", _ => throw new InvalidOperationException($"Unknown {nameof(IisAppType)} '{appType}'"), }; var appPath = appType switch { IisAppType.AspNetClassic => EnvironmentHelper.GetSampleProjectDirectory(), IisAppType.AspNetIntegrated => EnvironmentHelper.GetSampleProjectDirectory(), IisAppType.AspNetCoreInProcess => EnvironmentHelper.GetSampleApplicationOutputDirectory(), IisAppType.AspNetCoreOutOfProcess => EnvironmentHelper.GetSampleApplicationOutputDirectory(), _ => throw new InvalidOperationException($"Unknown {nameof(IisAppType)} '{appType}'"), }; var configTemplate = File.ReadAllText("applicationHost.config"); var newConfig = Path.GetTempFileName(); configTemplate = configTemplate .Replace("[PATH]", appPath) .Replace("[PORT]", iisPort.ToString()) .Replace("[POOL]", appPool); var isAspNetCore = appType == IisAppType.AspNetCoreInProcess || appType == IisAppType.AspNetCoreOutOfProcess; if (isAspNetCore) { var hostingModel = appType == IisAppType.AspNetCoreInProcess ? "inprocess" : "outofprocess"; configTemplate = configTemplate .Replace("[DOTNET]", EnvironmentHelper.GetDotnetExe()) .Replace("[RELATIVE_SAMPLE_PATH]", $".\\{EnvironmentHelper.GetSampleApplicationFileName()}") .Replace("[HOSTING_MODEL]", hostingModel); } File.WriteAllText(newConfig, configTemplate); var args = new[] { "/site:sample", $"/config:{newConfig}", "/systray:false", "/trace:info" }; Output.WriteLine($"[webserver] starting {iisExpress} {string.Join(" ", args)}"); var process = ProfilerHelper.StartProcessWithProfiler( iisExpress, EnvironmentHelper, agent, arguments: string.Join(" ", args), redirectStandardInput: true, processToProfile: appType == IisAppType.AspNetCoreOutOfProcess ? "dotnet.exe" : iisExpress); var wh = new EventWaitHandle(false, EventResetMode.AutoReset); Task.Run(() => { string line; while ((line = process.StandardOutput.ReadLine()) != null) { Output.WriteLine($"[webserver][stdout] {line}"); if (line.Contains("IIS Express is running")) { wh.Set(); } } }); Task.Run(() => { string line; while ((line = process.StandardError.ReadLine()) != null) { Output.WriteLine($"[webserver][stderr] {line}"); } }); wh.WaitOne(5000); // Wait for iis express to finish starting up var retries = 5; while (true) { var usedPorts = IPGlobalProperties.GetIPGlobalProperties() .GetActiveTcpListeners() .Select(ipEndPoint => ipEndPoint.Port); if (usedPorts.Contains(iisPort)) { break; } retries--; if (retries == 0) { throw new Exception("Gave up waiting for IIS Express."); } Thread.Sleep(1500); } return(process, newConfig); }