test_r_core/
ipc.rs

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