1use crate::internal::{CapturedOutput, FailureCause, TestResult};
2use crate::stats::Summary;
3use desert_rust::BinaryCodec;
4use interprocess::local_socket::{
5 GenericFilePath, GenericNamespaced, Name, NameType, ToFsName, ToNsName,
6};
7use std::time::Duration;
8
9#[derive(Debug, BinaryCodec)]
11pub enum IpcCommand {
12 RunTest {
13 name: String,
14 crate_name: String,
15 module_path: String,
16 },
17}
18
19#[derive(Debug, BinaryCodec)]
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 rendered_failure_cause: 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 {
68 exec_time, cause, ..
69 } => SerializableTestResult::Failed {
70 exec_time: *exec_time,
71 rendered_failure_cause: cause.render(),
72 },
73 TestResult::Ignored { .. } => SerializableTestResult::Ignored,
74 }
75 }
76}
77
78impl From<SerializableTestResult> for TestResult {
79 fn from(result: SerializableTestResult) -> Self {
80 match result {
81 SerializableTestResult::Passed { exec_time } => TestResult::passed(exec_time),
82 SerializableTestResult::Failed {
83 exec_time,
84 rendered_failure_cause,
85 } => TestResult::failed(
86 exec_time,
87 FailureCause::HarnessError(rendered_failure_cause),
88 ),
89 SerializableTestResult::Ignored => TestResult::ignored(),
90 SerializableTestResult::Benchmarked {
91 exec_time,
92 ns_iter_summ,
93 mb_s,
94 } => TestResult::benchmarked(exec_time, ns_iter_summ, mb_s),
95 }
96 }
97}
98
99#[derive(Debug, BinaryCodec)]
101pub enum IpcResponse {
102 TestFinished {
103 result: SerializableTestResult,
104 finish_marker: String,
105 },
106}
107
108pub fn ipc_name<'s>(name: String) -> Name<'s> {
109 if GenericNamespaced::is_supported() {
110 name.to_ns_name::<GenericNamespaced>()
111 .expect("Invalid local socket name")
112 } else {
113 name.to_fs_name::<GenericFilePath>()
114 .expect("Invalid local socket name")
115 }
116}