/thirty-libs/inferno/tests/collapse-vtune.rs

https://github.com/kylixs/flare-profiler · Rust · 130 lines · 113 code · 15 blank · 2 comment · 3 complexity · a17d619a8e015d1247a441fca0df5d4d 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::prelude::*;
  6. use inferno::collapse::vtune::{Folder, Options};
  7. use log::Level;
  8. use pretty_assertions::assert_eq;
  9. use testing_logger::CapturedLog;
  10. fn test_collapse_vtune(test_file: &str, expected_file: &str, options: Options) -> io::Result<()> {
  11. common::test_collapse(Folder::from(options), test_file, expected_file, false)
  12. }
  13. fn test_collapse_vtune_error(test_file: &str, options: Options) -> io::Error {
  14. common::test_collapse_error(Folder::from(options), test_file)
  15. }
  16. fn test_collapse_vtune_logs_with_options<F>(input_file: &str, asserter: F, options: Options)
  17. where
  18. F: Fn(&Vec<CapturedLog>),
  19. {
  20. common::test_collapse_logs(Folder::from(options), input_file, asserter);
  21. }
  22. fn test_collapse_vtune_logs<F>(input_file: &str, asserter: F)
  23. where
  24. F: Fn(&Vec<CapturedLog>),
  25. {
  26. test_collapse_vtune_logs_with_options(input_file, asserter, Options::default());
  27. }
  28. #[test]
  29. fn collapse_vtune_default() {
  30. let test_file = "./tests/data/collapse-vtune/vtune.csv";
  31. let result_file = "./tests/data/collapse-vtune/results/vtune-default.txt";
  32. test_collapse_vtune(test_file, result_file, Options::default()).unwrap()
  33. }
  34. #[test]
  35. fn collapse_vtune_no_modules() {
  36. let test_file = "./tests/data/collapse-vtune/vtune.csv";
  37. let result_file = "./tests/data/collapse-vtune/results/vtune-no-modules.txt";
  38. test_collapse_vtune(
  39. test_file,
  40. result_file,
  41. Options {
  42. no_modules: true,
  43. ..Default::default()
  44. },
  45. )
  46. .unwrap()
  47. }
  48. #[test]
  49. fn collapse_vtune_should_log_warning_for_ending_before_header() {
  50. test_collapse_vtune_logs(
  51. "./tests/data/collapse-vtune/end-before-header.csv",
  52. |captured_logs| {
  53. let nwarnings = captured_logs
  54. .into_iter()
  55. .filter(|log| log.body == "File ended before header" && log.level == Level::Warn)
  56. .count();
  57. assert_eq!(
  58. nwarnings, 1,
  59. "warning logged {} times, but should be logged exactly once",
  60. nwarnings
  61. );
  62. },
  63. );
  64. }
  65. #[test]
  66. fn collapse_vtune_should_return_error_for_skipped_indent_level() {
  67. let test_file = "./tests/data/collapse-vtune/skipped-indentation.csv";
  68. let error = test_collapse_vtune_error(test_file, Options::default());
  69. assert_eq!(error.kind(), io::ErrorKind::InvalidData);
  70. assert!(error
  71. .to_string()
  72. .starts_with("Skipped indentation level at line"));
  73. }
  74. #[test]
  75. fn collapse_vtune_should_return_error_for_invalid_time_field() {
  76. let test_file = "./tests/data/collapse-vtune/invalid-time-field.csv";
  77. let error = test_collapse_vtune_error(test_file, Options::default());
  78. assert_eq!(error.kind(), io::ErrorKind::InvalidData);
  79. assert!(error
  80. .to_string()
  81. .starts_with("Invalid `CPU Time:Self` field"));
  82. }
  83. #[test]
  84. fn collapse_vtune_should_return_error_for_bad_stack_line() {
  85. let test_file = "./tests/data/collapse-vtune/bad-stack-line.csv";
  86. let error = test_collapse_vtune_error(test_file, Options::default());
  87. assert_eq!(error.kind(), io::ErrorKind::InvalidData);
  88. assert!(error.to_string().starts_with("Unable to parse stack line"));
  89. }
  90. #[test]
  91. fn collapse_vtune_cli() {
  92. let input_file = "./tests/data/collapse-vtune/vtune.csv";
  93. let expected_file = "./tests/data/collapse-vtune/results/vtune-default.txt";
  94. // Test with file passed in
  95. let output = Command::cargo_bin("inferno-collapse-vtune")
  96. .unwrap()
  97. .arg(input_file)
  98. .output()
  99. .expect("failed to execute process");
  100. let expected = BufReader::new(File::open(expected_file).unwrap());
  101. common::compare_results(Cursor::new(output.stdout), expected, expected_file, false);
  102. // Test with STDIN
  103. let mut child = Command::cargo_bin("inferno-collapse-vtune")
  104. .unwrap()
  105. .stdin(Stdio::piped())
  106. .stdout(Stdio::piped())
  107. .spawn()
  108. .expect("Failed to spawn child process");
  109. let mut input = BufReader::new(File::open(input_file).unwrap());
  110. let stdin = child.stdin.as_mut().expect("Failed to open stdin");
  111. io::copy(&mut input, stdin).unwrap();
  112. let output = child.wait_with_output().expect("Failed to read stdout");
  113. let expected = BufReader::new(File::open(expected_file).unwrap());
  114. common::compare_results(Cursor::new(output.stdout), expected, expected_file, false);
  115. }