connection_utils/test/
stream_test_message.rs

1use serde::{Serialize, Deserialize};
2use std::{fmt::{Debug, self}, cmp::Ordering};
3use cs_utils::{random_number, traits::Random, random_str, random_str_rg};
4
5/// A test message for framed stream testing purposes.
6#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
7pub enum TestStreamMessage {
8    Ping(String),
9    Pong(Option<String>, String),
10    Data(Vec<u8>),
11    Eof,
12}
13
14impl fmt::Display for TestStreamMessage {
15    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16        match self {
17            TestStreamMessage::Ping(id) => {
18                return f.debug_tuple("TestStreamMessage::Ping")
19                    .field(id)
20                    .finish();
21            },
22            TestStreamMessage::Pong(data, id) => {
23                return f.debug_tuple("TestStreamMessage::Pong")
24                    .field(id)
25                    .field(data)
26                    .finish();
27            },
28            TestStreamMessage::Data(data) => {
29                return f.debug_tuple("TestStreamMessage::Data")
30                    .field(&data.len())
31                    .finish();
32            },
33            TestStreamMessage::Eof => {
34                return f.debug_tuple("TestStreamMessage::Eof")
35                    .finish();
36            },
37        };
38    }
39}
40
41impl TestStreamMessage {
42    fn compare(&self, other: &TestStreamMessage) -> Ordering {
43        let self_str = format!("{:?}", self);
44        let other_str = format!("{:?}", other);
45
46        if self_str < other_str {
47            return Ordering::Less;
48        }
49
50        if self_str > other_str {
51            return Ordering::Greater;
52        }
53
54        return Ordering::Equal;
55    }
56}
57
58impl PartialOrd for TestStreamMessage {
59    fn partial_cmp(&self, other: &TestStreamMessage) -> Option<Ordering> {
60        return Some(self.compare(other));
61    }
62}
63
64impl Ord for TestStreamMessage {
65    fn cmp(&self, other: &TestStreamMessage) -> Ordering {
66        return self.compare(other);
67    }
68}
69
70impl Random for TestStreamMessage {
71    fn random() -> TestStreamMessage {
72        return match random_number(0..=u16::MAX) % 4 {
73            0 => TestStreamMessage::Ping(random_str_rg(16..=32)),
74            1 => TestStreamMessage::Pong(Some(random_str(32)), random_str_rg(32..=64)),
75            2 => TestStreamMessage::Data(random_str_rg(8..=256).as_bytes().to_vec()),
76            3 => TestStreamMessage::Eof,
77            _ => unreachable!(),
78        };
79    }
80}