public void DeleteVirtualEnv() { using (var app = new PythonVisualStudioApp()) using (var dis = Init(app)) { var options = app.GetService<PythonToolsService>().GeneralOptions; var oldAutoAnalyze = options.AutoAnalyzeStandardLibrary; app.OnDispose(() => { options.AutoAnalyzeStandardLibrary = oldAutoAnalyze; options.Save(); }); options.AutoAnalyzeStandardLibrary = false; options.Save(); var project = CreateTemporaryProject(app); string envName, envPath; TreeNode env; using (var ps = new ProcessScope("Microsoft.PythonTools.Analyzer")) { env = app.CreateVirtualEnvironment(project, out envName, out envPath); Assert.IsFalse(ps.WaitForNewProcess(TimeSpan.FromSeconds(10)).Any(), "Unexpected analyzer processes"); } // Need to wait some more for the database to be loaded. app.WaitForNoDialog(TimeSpan.FromSeconds(10.0)); env.Select(); using (var removeDeleteDlg = RemoveItemDialog.FromDte(app)) { removeDeleteDlg.Delete(); } app.WaitForNoDialog(TimeSpan.FromSeconds(5.0)); app.OpenSolutionExplorer().WaitForChildOfProjectRemoved( project, SR.GetString(SR.Environments), envName ); var projectHome = (string)project.Properties.Item("ProjectHome").Value; envPath = Path.Combine(projectHome, envPath); for (int retries = 10; Directory.Exists(envPath) && retries > 0; --retries) { Thread.Sleep(1000); } Assert.IsFalse(Directory.Exists(envPath), envPath); } }
private static void LaunchAndVerifyNoDebug( VisualStudioApp app, int port, string textInResponse ) { bool prevNormal = true, prevAbnormal = true; string text; int retries; try { using (var processes = new ProcessScope("python")) { EndToEndLog("Transitioning to UI thread to build"); app.ServiceProvider.GetUIThread().Invoke(() => { EndToEndLog("Building"); app.Dte.Solution.SolutionBuild.Build(true); EndToEndLog("Build output: {0}", app.GetOutputWindowText("Build")); EndToEndLog("Updating settings"); prevNormal = app.GetService<PythonToolsService>().DebuggerOptions.WaitOnNormalExit; prevAbnormal = app.GetService<PythonToolsService>().DebuggerOptions.WaitOnAbnormalExit; app.GetService<PythonToolsService>().DebuggerOptions.WaitOnNormalExit = false; app.GetService<PythonToolsService>().DebuggerOptions.WaitOnAbnormalExit = false; EndToEndLog("Starting running"); app.Dte.Solution.SolutionBuild.Run(); EndToEndLog("Running"); }); var newProcesses = processes.WaitForNewProcess(TimeSpan.FromSeconds(30)).ToList(); Assert.IsTrue(newProcesses.Any(), "Did not find new Python process"); EndToEndLog("Found new processes with IDs {0}", string.Join(", ", newProcesses.Select(p => p.Id.ToString()))); for (retries = 100; retries > 0 && !IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners().Any(p => p.Port == port); --retries) { Thread.Sleep(300); } EndToEndLog("Active at http://localhost:{0}/", port); text = WebDownloadUtility.GetString(new Uri(string.Format("http://localhost:{0}/", port))); } } finally { app.ServiceProvider.GetUIThread().Invoke(() => { app.GetService<PythonToolsService>().DebuggerOptions.WaitOnNormalExit = prevNormal; app.GetService<PythonToolsService>().DebuggerOptions.WaitOnAbnormalExit = prevAbnormal; }); } EndToEndLog("Response from http://localhost:{0}/", port); EndToEndLog(text); Assert.IsTrue(text.Contains(textInResponse), text); for (retries = 20; retries > 0 && !IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners().All(p => p.Port != port); --retries) { Thread.Sleep(500); } if (retries > 0) { EndToEndLog("Process ended"); } else { EndToEndLog("Timed out waiting for process to exit"); } }