/tests/collapse-guess.rs

https://github.com/jonhoo/inferno · Rust · 157 lines · 137 code · 18 blank · 2 comment · 6 complexity · 82ccb6130795db0e22013196dc2f4eed MD5 · raw file

  1. mod common;
  2. use std::fs::File;
  3. use std::io::{self, BufReader, Cursor};
  4. use std::process::{Command, Stdio};
  5. use assert_cmd::cargo::CommandCargoExt;
  6. use inferno::collapse::guess::Folder;
  7. use log::Level;
  8. use pretty_assertions::assert_eq;
  9. use testing_logger::CapturedLog;
  10. fn test_collapse_guess(test_file: &str, expected_file: &str, strip_quotes: bool) -> io::Result<()> {
  11. common::test_collapse(Folder::default(), test_file, expected_file, strip_quotes)
  12. }
  13. fn test_collapse_guess_logs<F>(input_file: &str, asserter: F)
  14. where
  15. F: Fn(&Vec<CapturedLog>),
  16. {
  17. common::test_collapse_logs(Folder::default(), input_file, asserter);
  18. }
  19. #[test]
  20. fn collapse_guess_dtrace_example() {
  21. let test_file = "./flamegraph/example-dtrace-stacks.txt";
  22. let result_file = "./tests/data/collapse-dtrace/results/dtrace-example.txt";
  23. test_collapse_guess(test_file, result_file, false).unwrap()
  24. }
  25. #[test]
  26. fn collapse_guess_dtrace_java() {
  27. let test_file = "./tests/data/collapse-dtrace/java.txt";
  28. let result_file = "./tests/data/collapse-dtrace/results/java.txt";
  29. test_collapse_guess(test_file, result_file, false).unwrap()
  30. }
  31. #[test]
  32. #[cfg_attr(windows, ignore)]
  33. fn collapse_guess_dtrace_hex_addresses() {
  34. let test_file = "./tests/data/collapse-dtrace/hex-addresses.txt";
  35. let result_file = "./tests/data/collapse-dtrace/results/hex-addresses.txt";
  36. test_collapse_guess(test_file, result_file, false).unwrap()
  37. }
  38. #[test]
  39. fn collapse_guess_perf_example() {
  40. let test_file = "./flamegraph/example-perf-stacks.txt.gz";
  41. let result_file = "./tests/data/collapse-perf/results/example-perf-stacks-collapsed.txt";
  42. test_collapse_guess(test_file, result_file, true).unwrap()
  43. }
  44. #[test]
  45. fn collapse_guess_perf_go_stacks() {
  46. let test_file = "./tests/data/collapse-perf/go-stacks.txt";
  47. let result_file = "./tests/data/collapse-perf/results/go-stacks-collapsed.txt";
  48. test_collapse_guess(test_file, result_file, true).unwrap()
  49. }
  50. #[test]
  51. fn collapse_guess_perf_cpp_stacks() {
  52. let test_file = "./tests/data/collapse-perf/cpp-stacks-std-function.txt";
  53. let result_file = "./tests/data/collapse-perf/results/cpp-stacks-std-function-collapsed.txt";
  54. test_collapse_guess(test_file, result_file, true).unwrap()
  55. }
  56. #[test]
  57. fn collapse_guess_perf_java_inline() {
  58. let test_file = "./tests/data/collapse-perf/java-inline.txt";
  59. let result_file = "./tests/data/collapse-perf/results/java-inline-collapsed.txt";
  60. test_collapse_guess(test_file, result_file, true).unwrap()
  61. }
  62. #[test]
  63. fn collapse_guess_sample() {
  64. let test_file = "./tests/data/collapse-sample/sample.txt";
  65. let result_file = "./tests/data/collapse-sample/results/sample-default.txt";
  66. test_collapse_guess(test_file, result_file, false).unwrap()
  67. }
  68. #[test]
  69. fn collapse_guess_vtune() {
  70. let test_file = "./tests/data/collapse-vtune/vtune.csv";
  71. let result_file = "./tests/data/collapse-vtune/results/vtune-default.txt";
  72. test_collapse_guess(test_file, result_file, false).unwrap()
  73. }
  74. #[test]
  75. fn collapse_guess_unknown_format_should_log_error() {
  76. test_collapse_guess_logs(
  77. "./tests/data/collapse-guess/unknown-format.txt",
  78. |captured_logs| {
  79. let nerrors = captured_logs
  80. .iter()
  81. .filter(|log| {
  82. log.level == Level::Error
  83. && log.body == "No applicable collapse implementation found for input"
  84. })
  85. .count();
  86. assert_eq!(
  87. nerrors, 1,
  88. "bad lines error logged {} times, but should be logged exactly once",
  89. nerrors
  90. );
  91. },
  92. );
  93. }
  94. #[test]
  95. fn collapse_guess_invalid_perf_should_log_error() {
  96. test_collapse_guess_logs(
  97. "./tests/data/collapse-guess/invalid-perf-with-empty-line-after-event-line.txt",
  98. |captured_logs| {
  99. let nerrors = captured_logs
  100. .iter()
  101. .filter(|log| {
  102. log.level == Level::Error
  103. && log.body == "No applicable collapse implementation found for input"
  104. })
  105. .count();
  106. assert_eq!(
  107. nerrors, 1,
  108. "bad lines error logged {} times, but should be logged exactly once",
  109. nerrors
  110. );
  111. },
  112. );
  113. }
  114. #[test]
  115. fn collapse_guess_cli() {
  116. let input_file = "./tests/data/collapse-dtrace/java.txt";
  117. let expected_file = "./tests/data/collapse-dtrace/results/java.txt";
  118. // Test with file passed in
  119. let output = Command::cargo_bin("inferno-collapse-guess")
  120. .unwrap()
  121. .arg(input_file)
  122. .output()
  123. .expect("failed to execute process");
  124. let expected = BufReader::new(File::open(expected_file).unwrap());
  125. common::compare_results(Cursor::new(output.stdout), expected, expected_file, true);
  126. // Test with STDIN
  127. let mut child = Command::cargo_bin("inferno-collapse-guess")
  128. .unwrap()
  129. .stdin(Stdio::piped())
  130. .stdout(Stdio::piped())
  131. .spawn()
  132. .expect("Failed to spawn child process");
  133. let mut input = BufReader::new(File::open(input_file).unwrap());
  134. let stdin = child.stdin.as_mut().expect("Failed to open stdin");
  135. io::copy(&mut input, stdin).unwrap();
  136. let output = child.wait_with_output().expect("Failed to read stdout");
  137. let expected = BufReader::new(File::open(expected_file).unwrap());
  138. common::compare_results(Cursor::new(output.stdout), expected, expected_file, true);
  139. }