コード例 #1
0
        private static string WaitForDebugOutput(VisualStudioApp app, Predicate <string> condition)
        {
            var uiThread = app.ServiceProvider.GetUIThread();
            var text     = uiThread.Invoke(() => app.GetOutputWindowText("Debug"));

            for (int i = 0; i < 50 && !condition(text); i++)
            {
                Thread.Sleep(100);
                text = uiThread.Invoke(() => app.GetOutputWindowText("Debug"));
            }

            Assert.IsTrue(condition(text));
            return(text);
        }
コード例 #2
0
        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");
            }
        }