diff --git a/test_util/src/lib.rs b/test_util/src/lib.rs index 7b88b0a696..33b5ae8bc2 100644 --- a/test_util/src/lib.rs +++ b/test_util/src/lib.rs @@ -2273,14 +2273,21 @@ pub fn parse_strace_output(output: &str) -> HashMap { } let total_fields = total_line.split_whitespace().collect::>(); + + let mut usecs_call_offset = 0; summary.insert( "total".to_string(), StraceOutput { percent_time: str::parse::(total_fields[0]).unwrap(), seconds: str::parse::(total_fields[1]).unwrap(), - usecs_per_call: None, - calls: str::parse::(total_fields[2]).unwrap(), - errors: str::parse::(total_fields[3]).unwrap(), + usecs_per_call: if total_fields.len() > 5 { + usecs_call_offset = 1; + Some(str::parse::(total_fields[2]).unwrap()) + } else { + None + }, + calls: str::parse::(total_fields[2 + usecs_call_offset]).unwrap(), + errors: str::parse::(total_fields[3 + usecs_call_offset]).unwrap(), }, ); @@ -2384,6 +2391,7 @@ mod tests { // summary line assert_eq!(strace.get("total").unwrap().calls, 704); assert_eq!(strace.get("total").unwrap().errors, 5); + assert_eq!(strace.get("total").unwrap().usecs_per_call, None); } #[test] @@ -2399,6 +2407,23 @@ mod tests { // summary line assert_eq!(strace.get("total").unwrap().calls, 821); assert_eq!(strace.get("total").unwrap().errors, 107); + assert_eq!(strace.get("total").unwrap().usecs_per_call, None); + } + + #[test] + fn strace_parse_3() { + const TEXT: &str = include_str!("./testdata/strace_summary3.out"); + let strace = parse_strace_output(TEXT); + + // first syscall line + let futex = strace.get("mprotect").unwrap(); + assert_eq!(futex.calls, 90); + assert_eq!(futex.errors, 0); + + // summary line + assert_eq!(strace.get("total").unwrap().calls, 543); + assert_eq!(strace.get("total").unwrap().errors, 36); + assert_eq!(strace.get("total").unwrap().usecs_per_call, Some(6)); } #[test] diff --git a/test_util/src/testdata/strace_summary3.out b/test_util/src/testdata/strace_summary3.out new file mode 100644 index 0000000000..c0cb844cad --- /dev/null +++ b/test_util/src/testdata/strace_summary3.out @@ -0,0 +1,48 @@ +% time seconds usecs/call calls errors syscall +------ ----------- ----------- --------- --------- ------------------ + 14.12 0.000501 5 90 mprotect + 12.23 0.000434 62 7 clone3 + 8.51 0.000302 13 22 rt_sigprocmask + 7.10 0.000252 7 32 read + 7.02 0.000249 6 39 madvise + 6.31 0.000224 8 26 7 openat + 5.69 0.000202 5 34 mmap + 5.10 0.000181 4 39 2 newfstatat + 4.40 0.000156 4 39 fcntl + 4.17 0.000148 5 27 brk + 3.27 0.000116 4 26 close + 3.16 0.000112 14 8 rseq + 3.04 0.000108 15 7 prctl + 2.56 0.000091 11 8 set_robust_list + 2.20 0.000078 6 12 gettid + 1.69 0.000060 5 11 munmap + 1.55 0.000055 5 10 write + 1.38 0.000049 3 14 lseek + 1.01 0.000036 7 5 3 ioctl + 0.90 0.000032 6 5 getpid + 0.82 0.000029 4 7 getcwd + 0.65 0.000023 5 4 sched_getaffinity + 0.51 0.000018 18 1 1 pkey_alloc + 0.45 0.000016 8 2 unlink + 0.45 0.000016 1 16 9 statx + 0.31 0.000011 1 6 prlimit64 + 0.31 0.000011 2 4 getrandom + 0.25 0.000009 9 1 uname + 0.23 0.000008 1 6 rt_sigaction + 0.23 0.000008 4 2 geteuid + 0.20 0.000007 7 1 ftruncate + 0.11 0.000004 1 3 sigaltstack + 0.08 0.000003 3 1 getppid + 0.00 0.000000 0 1 poll + 0.00 0.000000 0 4 pread64 + 0.00 0.000000 0 1 1 access + 0.00 0.000000 0 1 socketpair + 0.00 0.000000 0 1 execve + 0.00 0.000000 0 13 12 readlink + 0.00 0.000000 0 2 1 arch_prctl + 0.00 0.000000 0 1 set_tid_address + 0.00 0.000000 0 2 epoll_ctl + 0.00 0.000000 0 1 eventfd2 + 0.00 0.000000 0 1 epoll_create1 +------ ----------- ----------- --------- --------- ------------------ +100.00 0.003549 6 543 36 total \ No newline at end of file