private static void CloudProjectTest(string roleType, bool openServiceDefinition) { Assert.IsTrue(roleType == "Web" || roleType == "Worker", "Invalid roleType: " + roleType); using (var app = new VisualStudioApp()) using (FileUtils.Backup(TestData.GetPath(@"TestData\CloudProject\CloudProject\ServiceDefinition.csdef"))) { app.OpenProject("TestData\\CloudProject.sln", expectedProjects: 3); var ccproj = app.Dte.Solution.Projects.Cast<EnvDTE.Project>().FirstOrDefault(p => p.Name == "CloudProject"); Assert.IsNotNull(ccproj); if (openServiceDefinition) { var wnd = ccproj.ProjectItems.Item("ServiceDefinition.csdef").Open(); wnd.Activate(); app.OnDispose(() => wnd.Close()); } IVsHierarchy hier; var sln = app.GetService<IVsSolution>(typeof(SVsSolution)); ErrorHandler.ThrowOnFailure(sln.GetProjectOfUniqueName(ccproj.FullName, out hier)); app.ServiceProvider.GetUIThread().Invoke(() => NodejsProject.UpdateServiceDefinition( hier, roleType, roleType + "Role1", new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)app.Dte) ) ); var doc = new XmlDocument(); for (int retries = 5; retries > 0; --retries) { try { doc.Load(TestData.GetPath(@"TestData\CloudProject\CloudProject\ServiceDefinition.csdef")); break; } catch (IOException ex) { Console.WriteLine("Exception while reading ServiceDefinition.csdef.{0}{1}", Environment.NewLine, ex); } catch (XmlException) { var copyTo = TestData.GetPath(@"TestData\CloudProject\CloudProject\" + Path.GetRandomFileName()); File.Copy(TestData.GetPath(@"TestData\CloudProject\CloudProject\ServiceDefinition.csdef"), copyTo); Console.WriteLine("Copied file to " + copyTo); throw; } Thread.Sleep(100); } var ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("sd", "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"); doc.Save(Console.Out); var nav = doc.CreateNavigator(); if (roleType == "Web") { Assert.IsNotNull(nav.SelectSingleNode( "/sd:ServiceDefinition/sd:WebRole[@name='WebRole1']/sd:Startup/sd:Task[@commandLine='setup_web.cmd > log.txt']", ns )); } else if (roleType == "Worker") { Assert.IsNotNull(nav.SelectSingleNode( "/sd:ServiceDefinition/sd:WorkerRole[@name='WorkerRole1']/sd:Startup/sd:Task[@commandLine='setup_worker.cmd > log.txt']", ns )); Assert.IsNotNull(nav.SelectSingleNode( "/sd:ServiceDefinition/sd:WorkerRole[@name='WorkerRole1']/sd:Runtime/sd:EntryPoint/sd:ProgramEntryPoint[@commandLine='node.cmd .\\server.js']", ns )); } } }
internal static IPythonInterpreterFactory CreateVirtualEnvironment(string pythonVersion, VisualStudioApp app, PythonProjectNode pyProj) { var uiThread = app.ServiceProvider.GetUIThread(); var task = uiThread.InvokeTask(() => { var model = app.GetService<IComponentModel>(typeof(SComponentModel)); var service = model.GetService<IInterpreterRegistryService>(); return pyProj.CreateOrAddVirtualEnvironment( service, true, Path.Combine(pyProj.ProjectHome, "env"), service.FindInterpreter("Global|PythonCore|" + pythonVersion + "-32"), Version.Parse(pythonVersion) >= new Version(3, 3) ); }); try { Assert.IsTrue(task.Wait(TimeSpan.FromMinutes(2.0)), "Timed out waiting for venv"); } catch (AggregateException ex) { throw ex.InnerException; } var factory = task.Result; Assert.IsTrue(uiThread.Invoke(() => factory.Configuration.Id == pyProj.GetInterpreterFactory().Configuration.Id)); return factory; }
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"); } }
public void ErrorListAndTaskListAreClearedWhenProjectWithMultipleFilesIsUnloaded() { using (var app = new VisualStudioApp()) { var project = app.OpenProject(@"TestData\ErrorProjectMultipleFiles.sln"); app.WaitForTaskListItems(typeof(SVsErrorList), 14); app.WaitForTaskListItems(typeof(SVsTaskList), 4); var solutionService = app.GetService<IVsSolution>(typeof(SVsSolution)); Assert.IsNotNull(solutionService); IVsHierarchy selectedHierarchy; ErrorHandler.ThrowOnFailure(solutionService.GetProjectOfUniqueName(project.UniqueName, out selectedHierarchy)); Assert.IsNotNull(selectedHierarchy); Console.WriteLine("Unloading project"); ErrorHandler.ThrowOnFailure(solutionService.CloseSolutionElement((uint)__VSSLNCLOSEOPTIONS.SLNCLOSEOPT_UnloadProject, selectedHierarchy, 0)); app.WaitForTaskListItems(typeof(SVsErrorList), 0); app.WaitForTaskListItems(typeof(SVsTaskList), 0); } }
public static SD.Process LaunchFileFromProject(VisualStudioApp app, EnvDTE.Project project, string filename, string interpreterArgs, string programArgs) { var item = project.ProjectItems.Item(filename); var window = item.Open(); window.Activate(); var doc = item.Document; var docFN = doc.FullName; string fullFilename = Path.GetFullPath(docFN); string cmdlineArgs = String.Format("{0} \"{1}\" {2}", interpreterArgs, fullFilename, programArgs); var uiThread = app.GetService<UIThreadBase>(); var projectInterpreter = uiThread.Invoke(() => project.GetPythonProject().GetLaunchConfigurationOrThrow().GetInterpreterPath()); var psi = new SD.ProcessStartInfo(projectInterpreter, cmdlineArgs); psi.RedirectStandardError = true; psi.RedirectStandardOutput = true; psi.UseShellExecute = false; var p = SD.Process.Start(psi); p.EnableRaisingEvents = true; string output = ""; p.OutputDataReceived += (sender, args) => { output += args.Data; }; p.ErrorDataReceived += (sender, args) => { output += args.Data; }; p.BeginErrorReadLine(); p.BeginOutputReadLine(); p.Exited += (sender, args) => { SD.Debug.WriteLine("Process Id ({0}) exited with ExitCode: {1}", p.Id, p.ExitCode); SD.Debug.WriteLine(String.Format("Output: {0}", output)); }; Assert.IsNotNull(p, "Failure to start process, {0} {1} ", projectInterpreter, cmdlineArgs); return p; }
private bool EnableAutoBraceCompletion(VisualStudioApp app, bool enable) { return app.GetService<UIThreadBase>().Invoke(() => { var mgr = app.GetService<IVsTextManager4>(typeof(SVsTextManager)); LANGPREFERENCES3[] langPrefs = { new LANGPREFERENCES3() }; langPrefs[0].guidLang = GuidList.guidPythonLanguageServiceGuid; ErrorHandler.ThrowOnFailure(mgr.GetUserPreferences4(null, langPrefs, null)); bool old = langPrefs[0].fBraceCompletion != 0; langPrefs[0].fBraceCompletion = enable ? 1u : 0u; ErrorHandler.ThrowOnFailure(mgr.SetUserPreferences4(null, langPrefs, null)); return old; }); }