Skip to main content

test_r_core/
ipc.rs

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/// Commands sent from the primary test runner to the spawned worker processes.
10#[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/// Responses sent from the spawned worker processes to the primary test runner.
100#[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}