use prost::Message as pMessage;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use types::Message;
use super::{Input, InputRaw};
use crate::{
traits::SendSyncAny,
types::{self, LinkMessage, Payload},
};
fn test_typed_input<T: Send + Sync + Clone + std::fmt::Debug + PartialEq + 'static>(
expected_data: T,
expected_serialized: Vec<u8>,
deserializer: impl Fn(&[u8]) -> anyhow::Result<T> + Send + Sync + 'static,
) {
let hlc = uhlc::HLC::default();
let (tx, rx) = flume::unbounded::<LinkMessage>();
let input_raw = InputRaw {
port_id: "test-id".into(),
receivers: vec![rx],
};
let input = Input {
input_raw,
deserializer: Arc::new(deserializer),
};
let message = LinkMessage::from_payload(
Payload::Bytes(Arc::new(expected_serialized)),
hlc.new_timestamp(),
);
tx.send(message).expect("Failed to send message");
let (data, _) = input.try_recv().expect("Message (serialized) was not sent");
if let Message::Data(data) = data {
assert_eq!(expected_data, *data);
}
let message = LinkMessage::from_payload(
Payload::Typed((
Arc::new(expected_data.clone()) as Arc<dyn SendSyncAny>,
Arc::new(|_buffer, _data| panic!("Unexpected call to serialize the data")),
)),
hlc.new_timestamp(),
);
tx.send(message).expect("Failed to send message");
let (data, _) = input
.try_recv()
.expect("Message (dyn SendSyncAny) was not sent");
if let Message::Data(data) = data {
assert_eq!(expected_data, *data);
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
struct TestData {
pub field1: u8,
pub field2: String,
pub field3: f64,
}
#[test]
fn test_serde_json() {
let expected_data = TestData {
field1: 1u8,
field2: "test".to_string(),
field3: 0.2f64,
};
let expected_serialized =
serde_json::ser::to_vec(&expected_data).expect("serde_json failed to serialize");
test_typed_input(expected_data, expected_serialized, |bytes| {
serde_json::de::from_slice::<TestData>(bytes).map_err(|e| anyhow::anyhow!(e))
})
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct TestProto {
#[prost(int64, tag = "1")]
pub field1: i64,
#[prost(string, tag = "2")]
pub field2: ::prost::alloc::string::String,
#[prost(double, tag = "3")]
pub field3: f64,
}
#[test]
fn test_protobuf_prost() {
let expected_data = TestProto {
field1: 1i64,
field2: "test".to_string(),
field3: 0.2f64,
};
let expected_serialized = expected_data.encode_to_vec();
test_typed_input(expected_data, expected_serialized, |bytes| {
<TestProto>::decode(bytes).map_err(|e| anyhow::anyhow!(e))
})
}