1use crate::internal::{CapturedOutput, TestResult};
2use crate::stats::Summary;
3use bincode::{Decode, Encode};
4use interprocess::local_socket::{
5 GenericFilePath, GenericNamespaced, Name, NameType, ToFsName, ToNsName,
6};
7use std::time::Duration;
8
9#[derive(Debug, Encode, Decode)]
11pub enum IpcCommand {
12 RunTest {
13 name: String,
14 crate_name: String,
15 module_path: String,
16 },
17}
18
19#[derive(Debug, Encode, Decode)]
20pub enum SerializableTestResult {
21 Passed {
22 exec_time: Duration,
23 },
24 Benchmarked {
25 exec_time: Duration,
26 ns_iter_summ: Summary,
27 mb_s: usize,
28 },
29 Failed {
30 exec_time: Duration,
31 panic: String,
32 },
33 Ignored,
34}
35
36impl SerializableTestResult {
37 pub fn into_test_result(
38 self,
39 stdout: Vec<CapturedOutput>,
40 stderr: Vec<CapturedOutput>,
41 ) -> TestResult {
42 let mut captured = [stdout, stderr].concat();
43 captured.sort();
44
45 let mut result: TestResult = self.into();
46 result.set_captured_output(captured);
47 result
48 }
49}
50
51impl From<&TestResult> for SerializableTestResult {
52 fn from(result: &TestResult) -> Self {
53 match &result {
54 TestResult::Passed { exec_time, .. } => SerializableTestResult::Passed {
55 exec_time: *exec_time,
56 },
57 TestResult::Benchmarked {
58 exec_time,
59 ns_iter_summ,
60 mb_s,
61 ..
62 } => SerializableTestResult::Benchmarked {
63 exec_time: *exec_time,
64 ns_iter_summ: *ns_iter_summ,
65 mb_s: *mb_s,
66 },
67 TestResult::Failed { exec_time, .. } => SerializableTestResult::Failed {
68 exec_time: *exec_time,
69 panic: result.failure_message().unwrap_or_default().to_string(),
70 },
71 TestResult::Ignored { .. } => SerializableTestResult::Ignored,
72 }
73 }
74}
75
76impl From<SerializableTestResult> for TestResult {
77 fn from(result: SerializableTestResult) -> Self {
78 match result {
79 SerializableTestResult::Passed { exec_time } => TestResult::passed(exec_time),
80 SerializableTestResult::Failed { exec_time, panic } => {
81 TestResult::failed(exec_time, Box::new(panic))
82 }
83 SerializableTestResult::Ignored => TestResult::ignored(),
84 SerializableTestResult::Benchmarked {
85 exec_time,
86 ns_iter_summ,
87 mb_s,
88 } => TestResult::benchmarked(exec_time, ns_iter_summ, mb_s),
89 }
90 }
91}
92
93#[derive(Debug, Encode, Decode)]
95pub enum IpcResponse {
96 TestFinished {
97 result: SerializableTestResult,
98 finish_marker: String,
99 },
100}
101
102pub fn ipc_name<'s>(name: String) -> Name<'s> {
103 if GenericNamespaced::is_supported() {
104 name.to_ns_name::<GenericNamespaced>()
105 .expect("Invalid local socket name")
106 } else {
107 name.to_fs_name::<GenericFilePath>()
108 .expect("Invalid local socket name")
109 }
110}