private static void VerifyReport(IPythonPerformanceReport report, params string[] expectedFunctions) { // run vsperf string[] lines = OpenPerformanceReportAsCsv(report); bool[] expected = new bool[expectedFunctions.Length]; // quote the function names so they match the CSV for (int i = 0; i < expectedFunctions.Length; i++) { expectedFunctions[i] = "\"" + expectedFunctions[i] + "\""; } foreach (var line in lines) { for (int i = 0; i < expectedFunctions.Length; i++) { if (line.StartsWith(expectedFunctions[i])) { expected[i] = true; } } } foreach (var found in expected) { Assert.IsTrue(found); } }
private static string[] OpenPerformanceReportAsCsv(IPythonPerformanceReport report) { var perfReportPath = Path.Combine(GetPerfToolsPath(false), "vsperfreport.exe"); for (int i = 0; i < 100; i++) { string csvFilename; do { csvFilename = Path.Combine(Path.GetTempPath(), "test") + DateTime.Now.Ticks + "_" + _counter++; } while (File.Exists(csvFilename + "_FunctionSummary.csv")); var psi = new ProcessStartInfo(perfReportPath, report.Filename + " /output:" + csvFilename + " /summary:function"); psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; var process = Process.Start(psi); process.Start(); process.WaitForExit(); if (process.ExitCode != 0) { if (i == 99) { string msg = "Output: " + process.StandardOutput.ReadToEnd() + Environment.NewLine + "Error: " + process.StandardError.ReadToEnd() + Environment.NewLine; Assert.Fail(msg); } else { System.Threading.Thread.Sleep(100); continue; } } string[] res = null; for (int j = 0; j < 100; j++) { try { res = File.ReadAllLines(csvFilename + "_FunctionSummary.csv"); break; } catch { System.Threading.Thread.Sleep(100); } } File.Delete(csvFilename + "_FunctionSummary.csv"); return(res); } Assert.Fail("Unable to convert to CSV"); return(null); }
private static void WaitForReport(IPythonProfiling profiling, IPythonProfileSession session, out IPythonPerformanceReport report, PythonVisualStudioApp app, out AutomationElement child) { while (profiling.IsProfiling) { Thread.Sleep(100); } report = session.GetReport(1); var filename = report.Filename; Assert.IsTrue(filename.Contains("HelloWorld")); app.OpenPythonPerformance(); var pyPerf = app.PythonPerformanceExplorerTreeView; Assert.IsNotNull(pyPerf); var item = pyPerf.WaitForItem("HelloWorld *", "Reports"); child = item.FindFirst(TreeScope.Descendants, Condition.TrueCondition); var childName = (string)child.GetCurrentPropertyValue(AutomationElement.NameProperty); Assert.IsTrue(childName.StartsWith("HelloWorld")); AutomationWrapper.EnsureExpanded(child); }
private string[] OpenPerformanceReportAsCsv(IPythonPerformanceReport report) { var perfReportPath = Path.Combine(GetPerfToolsPath(false), "vsperfreport.exe"); Console.WriteLine("Opening {0} as CSV", report.Filename); for (int i = 0; i < 100; i++) { var csvFilename = Path.Combine(SaveDirectory, Path.GetFileNameWithoutExtension(report.Filename)); var originalName = csvFilename; for (int counter = 1; File.Exists(csvFilename + "_FunctionSummary.csv"); ++counter) { csvFilename = originalName + counter; } Console.WriteLine("Writing to {0}", csvFilename); using (var process = ProcessOutput.RunHiddenAndCapture( perfReportPath, report.Filename, "/output:" + csvFilename, "/summary:function" )) { process.Wait(); if (process.ExitCode != 0) { if (i == 99) { Assert.Fail(string.Join(Environment.NewLine, Enumerable.Repeat("Output: ", 1) .Concat(process.StandardOutputLines) .Concat(Enumerable.Repeat("Error:", 1)) .Concat(process.StandardErrorLines) )); } else { Thread.Sleep(100); continue; } } } string[] res = null; for (int j = 0; j < 100; j++) { try { res = File.ReadAllLines(csvFilename + "_FunctionSummary.csv"); break; } catch { Thread.Sleep(100); } } return res ?? new string[0]; } Assert.Fail("Unable to convert to CSV"); return null; }
private void VerifyReport(IPythonPerformanceReport report, bool includesFunctions, params string[] expectedFunctions) { var expected = expectedFunctions.ToSet(StringComparer.Ordinal); var actual = OpenPerformanceReportAsCsv(report) .Select(line => Regex.Match(line, @"^""(?<name>.+?)["" ]", RegexOptions.IgnoreCase)) .Where(m => m.Success) .Select(m => m.Groups["name"].Value) .ToSet(StringComparer.Ordinal); if (includesFunctions) { Console.WriteLine( "expected: {0}\r\nactual: {1}\r\nextra: {2}\r\n\r\nmissing: {3}", string.Join(", ", expected.OrderBy(k => k)), string.Join(", ", actual.OrderBy(k => k)), string.Join(", ", actual.Except(expected).OrderBy(k => k)), string.Join(", ", expected.Except(actual).OrderBy(k => k)) ); Assert.IsTrue(actual.IsSupersetOf(expected), "Some functions were missing. See test output for details."); } else { var intersect = new HashSet<string>(expected); intersect.IntersectWith(actual); Console.WriteLine( "expected: {0}\r\nactual: {1}\r\n\r\nintersect: {2}", string.Join(", ", expected.OrderBy(k => k)), string.Join(", ", actual.OrderBy(k => k)), string.Join(", ", intersect.OrderBy(k => k)) ); Assert.IsTrue(intersect.Count == 0, "Some functions appeared. See test output for details."); } }
private static void WaitForReport(IPythonProfiling profiling, IPythonProfileSession session, out IPythonPerformanceReport report, out PythonVisualStudioApp app, out AutomationElement child) { while (profiling.IsProfiling) { System.Threading.Thread.Sleep(100); } report = session.GetReport(1); var filename = report.Filename; Assert.IsTrue(filename.Contains("HelloWorld")); app = new PythonVisualStudioApp(VsIdeTestHostContext.Dte); app.OpenPythonPerformance(); var pyPerf = app.PythonPerformanceExplorerTreeView; Assert.AreNotEqual(null, pyPerf); var item = pyPerf.FindItem("HelloWorld *", "Reports"); child = item.FindFirst(System.Windows.Automation.TreeScope.Descendants, Condition.TrueCondition); var childName = child.GetCurrentPropertyValue(AutomationElement.NameProperty) as string; Assert.IsTrue(childName.StartsWith("HelloWorld")); AutomationWrapper.EnsureExpanded(child); }