make tests work
This commit is contained in:
parent
32ecdd8956
commit
1fa442aa2d
|
@ -148,6 +148,7 @@ enum CoinError {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
|
use nomos_mix_message::mock::MockMixMessage;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
macro_rules! assert_interval {
|
macro_rules! assert_interval {
|
||||||
|
@ -188,7 +189,8 @@ mod tests {
|
||||||
let lower_bound = expected_emission_interval - torelance;
|
let lower_bound = expected_emission_interval - torelance;
|
||||||
let upper_bound = expected_emission_interval + torelance;
|
let upper_bound = expected_emission_interval + torelance;
|
||||||
// prepare stream
|
// prepare stream
|
||||||
let mut persistent_transmission_stream = stream.persistent_transmission(settings);
|
let mut persistent_transmission_stream: PersistentTransmissionStream<_, MockMixMessage> =
|
||||||
|
stream.persistent_transmission(settings);
|
||||||
// Messages must be scheduled in non-blocking manner.
|
// Messages must be scheduled in non-blocking manner.
|
||||||
schedule_sender.send(vec![1]).unwrap();
|
schedule_sender.send(vec![1]).unwrap();
|
||||||
schedule_sender.send(vec![2]).unwrap();
|
schedule_sender.send(vec![2]).unwrap();
|
||||||
|
@ -213,16 +215,14 @@ mod tests {
|
||||||
);
|
);
|
||||||
assert_interval!(&mut last_time, lower_bound, upper_bound);
|
assert_interval!(&mut last_time, lower_bound, upper_bound);
|
||||||
|
|
||||||
assert_eq!(
|
assert!(MockMixMessage::is_drop_message(
|
||||||
persistent_transmission_stream.next().await.unwrap(),
|
&persistent_transmission_stream.next().await.unwrap()
|
||||||
DROP_MESSAGE.to_vec()
|
));
|
||||||
);
|
|
||||||
assert_interval!(&mut last_time, lower_bound, upper_bound);
|
assert_interval!(&mut last_time, lower_bound, upper_bound);
|
||||||
|
|
||||||
assert_eq!(
|
assert!(MockMixMessage::is_drop_message(
|
||||||
persistent_transmission_stream.next().await.unwrap(),
|
&persistent_transmission_stream.next().await.unwrap()
|
||||||
DROP_MESSAGE.to_vec()
|
));
|
||||||
);
|
|
||||||
assert_interval!(&mut last_time, lower_bound, upper_bound);
|
assert_interval!(&mut last_time, lower_bound, upper_bound);
|
||||||
|
|
||||||
// Schedule a new message and check if it is emitted at the next interval
|
// Schedule a new message and check if it is emitted at the next interval
|
||||||
|
|
|
@ -3,22 +3,21 @@ use crate::{Error, MixMessage};
|
||||||
//
|
//
|
||||||
/// A mock implementation of the Sphinx encoding.
|
/// A mock implementation of the Sphinx encoding.
|
||||||
|
|
||||||
pub type NodeId = [u8; NODE_ID_SIZE];
|
const PRIVATE_KEY_SIZE: usize = 32;
|
||||||
const NODE_ID_SIZE: usize = 32;
|
const PUBLIC_KEY_SIZE: usize = 32;
|
||||||
const DUMMY_NODE_ID: NodeId = [0; NODE_ID_SIZE];
|
|
||||||
|
|
||||||
const PADDED_PAYLOAD_SIZE: usize = 2048;
|
const PADDED_PAYLOAD_SIZE: usize = 2048;
|
||||||
const PAYLOAD_PADDING_SEPARATOR: u8 = 0x01;
|
const PAYLOAD_PADDING_SEPARATOR: u8 = 0x01;
|
||||||
const PAYLOAD_PADDING_SEPARATOR_SIZE: usize = 1;
|
const PAYLOAD_PADDING_SEPARATOR_SIZE: usize = 1;
|
||||||
const MAX_LAYERS: usize = 5;
|
const MAX_LAYERS: usize = 5;
|
||||||
pub const MESSAGE_SIZE: usize = NODE_ID_SIZE * MAX_LAYERS + PADDED_PAYLOAD_SIZE;
|
pub const MESSAGE_SIZE: usize = PUBLIC_KEY_SIZE * MAX_LAYERS + PADDED_PAYLOAD_SIZE;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct MockMixMessage;
|
pub struct MockMixMessage;
|
||||||
|
|
||||||
impl MixMessage for MockMixMessage {
|
impl MixMessage for MockMixMessage {
|
||||||
type PublicKey = [u8; 32];
|
type PublicKey = [u8; PUBLIC_KEY_SIZE];
|
||||||
type PrivateKey = [u8; 32];
|
type PrivateKey = [u8; PRIVATE_KEY_SIZE];
|
||||||
const DROP_MESSAGE: &'static [u8] = &[0; MESSAGE_SIZE];
|
const DROP_MESSAGE: &'static [u8] = &[0; MESSAGE_SIZE];
|
||||||
|
|
||||||
/// The length of the encoded message is fixed to [`MESSAGE_SIZE`] bytes.
|
/// The length of the encoded message is fixed to [`MESSAGE_SIZE`] bytes.
|
||||||
|
@ -39,7 +38,7 @@ impl MixMessage for MockMixMessage {
|
||||||
message.extend(public_key);
|
message.extend(public_key);
|
||||||
});
|
});
|
||||||
// If there is any remaining layers, fill them with zeros.
|
// If there is any remaining layers, fill them with zeros.
|
||||||
(0..MAX_LAYERS - public_keys.len()).for_each(|_| message.extend(&DUMMY_NODE_ID));
|
(0..MAX_LAYERS - public_keys.len()).for_each(|_| message.extend(&[0; PUBLIC_KEY_SIZE]));
|
||||||
|
|
||||||
// Append payload with padding
|
// Append payload with padding
|
||||||
message.extend(payload);
|
message.extend(payload);
|
||||||
|
@ -55,8 +54,6 @@ impl MixMessage for MockMixMessage {
|
||||||
message: &[u8],
|
message: &[u8],
|
||||||
private_key: &Self::PrivateKey,
|
private_key: &Self::PrivateKey,
|
||||||
) -> Result<(Vec<u8>, bool), Error> {
|
) -> Result<(Vec<u8>, bool), Error> {
|
||||||
let public_key_size = std::mem::size_of::<Self::PublicKey>();
|
|
||||||
|
|
||||||
if message.len() != MESSAGE_SIZE {
|
if message.len() != MESSAGE_SIZE {
|
||||||
return Err(Error::InvalidMixMessage);
|
return Err(Error::InvalidMixMessage);
|
||||||
}
|
}
|
||||||
|
@ -64,13 +61,13 @@ impl MixMessage for MockMixMessage {
|
||||||
let public_key =
|
let public_key =
|
||||||
x25519_dalek::PublicKey::from(&x25519_dalek::StaticSecret::from(*private_key))
|
x25519_dalek::PublicKey::from(&x25519_dalek::StaticSecret::from(*private_key))
|
||||||
.to_bytes();
|
.to_bytes();
|
||||||
if message[0..public_key_size] != public_key {
|
if message[0..PUBLIC_KEY_SIZE] != public_key {
|
||||||
return Err(Error::MsgUnwrapNotAllowed);
|
return Err(Error::MsgUnwrapNotAllowed);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is the last layer
|
// If this is the last layer
|
||||||
if message[public_key_size..public_key_size * 2] == DUMMY_NODE_ID {
|
if message[PUBLIC_KEY_SIZE..PUBLIC_KEY_SIZE * 2] == [0; PUBLIC_KEY_SIZE] {
|
||||||
let padded_payload = &message[public_key_size * MAX_LAYERS..];
|
let padded_payload = &message[PUBLIC_KEY_SIZE * MAX_LAYERS..];
|
||||||
// remove the payload padding
|
// remove the payload padding
|
||||||
match padded_payload
|
match padded_payload
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -85,36 +82,44 @@ impl MixMessage for MockMixMessage {
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut new_message: Vec<u8> = Vec::with_capacity(MESSAGE_SIZE);
|
let mut new_message: Vec<u8> = Vec::with_capacity(MESSAGE_SIZE);
|
||||||
new_message.extend(&message[public_key_size..public_key_size * MAX_LAYERS]);
|
new_message.extend(&message[PUBLIC_KEY_SIZE..PUBLIC_KEY_SIZE * MAX_LAYERS]);
|
||||||
new_message.extend(&DUMMY_NODE_ID);
|
new_message.extend(&[0; PUBLIC_KEY_SIZE]);
|
||||||
new_message.extend(&message[public_key_size * MAX_LAYERS..]); // padded payload
|
new_message.extend(&message[PUBLIC_KEY_SIZE * MAX_LAYERS..]); // padded payload
|
||||||
Ok((new_message, false))
|
Ok((new_message, false))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::NODE_ID_SIZE;
|
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn message() {
|
fn message() {
|
||||||
let node_ids = [[1; NODE_ID_SIZE], [2; NODE_ID_SIZE], [3; NODE_ID_SIZE]];
|
let private_keys = [
|
||||||
|
x25519_dalek::StaticSecret::random(),
|
||||||
|
x25519_dalek::StaticSecret::random(),
|
||||||
|
x25519_dalek::StaticSecret::random(),
|
||||||
|
];
|
||||||
|
let public_keys = private_keys
|
||||||
|
.iter()
|
||||||
|
.map(|k| x25519_dalek::PublicKey::from(k).to_bytes())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
let payload = [7; 10];
|
let payload = [7; 10];
|
||||||
let message = new_message(&payload, &node_ids).unwrap();
|
let message = MockMixMessage::build_message(&payload, &public_keys).unwrap();
|
||||||
assert_eq!(message.len(), MESSAGE_SIZE);
|
assert_eq!(message.len(), MESSAGE_SIZE);
|
||||||
|
|
||||||
let (message, is_fully_unwrapped) = unwrap_message(&message, &node_ids[0]).unwrap();
|
let (message, is_fully_unwrapped) =
|
||||||
|
MockMixMessage::unwrap_message(&message, &private_keys[0].to_bytes()).unwrap();
|
||||||
assert!(!is_fully_unwrapped);
|
assert!(!is_fully_unwrapped);
|
||||||
assert_eq!(message.len(), MESSAGE_SIZE);
|
assert_eq!(message.len(), MESSAGE_SIZE);
|
||||||
|
|
||||||
let (message, is_fully_unwrapped) = unwrap_message(&message, &node_ids[1]).unwrap();
|
let (message, is_fully_unwrapped) =
|
||||||
|
MockMixMessage::unwrap_message(&message, &private_keys[1].to_bytes()).unwrap();
|
||||||
assert!(!is_fully_unwrapped);
|
assert!(!is_fully_unwrapped);
|
||||||
assert_eq!(message.len(), MESSAGE_SIZE);
|
assert_eq!(message.len(), MESSAGE_SIZE);
|
||||||
|
|
||||||
let (unwrapped_payload, is_fully_unwrapped) =
|
let (unwrapped_payload, is_fully_unwrapped) =
|
||||||
super::unwrap_message(&message, &node_ids[2]).unwrap();
|
MockMixMessage::unwrap_message(&message, &private_keys[2].to_bytes()).unwrap();
|
||||||
assert!(is_fully_unwrapped);
|
assert!(is_fully_unwrapped);
|
||||||
assert_eq!(unwrapped_payload, payload);
|
assert_eq!(unwrapped_payload, payload);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ mod test {
|
||||||
swarm::{dummy, NetworkBehaviour, SwarmEvent},
|
swarm::{dummy, NetworkBehaviour, SwarmEvent},
|
||||||
Multiaddr, PeerId, Swarm, SwarmBuilder,
|
Multiaddr, PeerId, Swarm, SwarmBuilder,
|
||||||
};
|
};
|
||||||
use nomos_mix_message::MESSAGE_SIZE;
|
use nomos_mix_message::mock::MockMixMessage;
|
||||||
use tokio::select;
|
use tokio::select;
|
||||||
|
|
||||||
use crate::{behaviour::Config, error::Error, Behaviour, Event};
|
use crate::{behaviour::Config, error::Error, Behaviour, Event};
|
||||||
|
@ -43,7 +43,7 @@ mod test {
|
||||||
|
|
||||||
// Swamr2 publishes a message.
|
// Swamr2 publishes a message.
|
||||||
let task = async {
|
let task = async {
|
||||||
let msg = vec![1; MESSAGE_SIZE];
|
let msg = vec![1; 10];
|
||||||
let mut msg_published = false;
|
let mut msg_published = false;
|
||||||
let mut publish_try_interval = tokio::time::interval(Duration::from_secs(1));
|
let mut publish_try_interval = tokio::time::interval(Duration::from_secs(1));
|
||||||
loop {
|
loop {
|
||||||
|
@ -98,7 +98,7 @@ mod test {
|
||||||
|
|
||||||
// Expect all publish attempts to fail with [`Error::NoPeers`]
|
// Expect all publish attempts to fail with [`Error::NoPeers`]
|
||||||
// because swarm2 doesn't have any peers that support the mix protocol.
|
// because swarm2 doesn't have any peers that support the mix protocol.
|
||||||
let msg = vec![1; MESSAGE_SIZE];
|
let msg = vec![1; 10];
|
||||||
let mut publish_try_interval = tokio::time::interval(Duration::from_secs(1));
|
let mut publish_try_interval = tokio::time::interval(Duration::from_secs(1));
|
||||||
let mut publish_try_count = 0;
|
let mut publish_try_count = 0;
|
||||||
loop {
|
loop {
|
||||||
|
@ -116,7 +116,7 @@ mod test {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_swarm(key: Keypair) -> Swarm<Behaviour> {
|
fn new_swarm(key: Keypair) -> Swarm<Behaviour<MockMixMessage>> {
|
||||||
new_swarm_with_behaviour(
|
new_swarm_with_behaviour(
|
||||||
key,
|
key,
|
||||||
Behaviour::new(Config {
|
Behaviour::new(Config {
|
||||||
|
|
|
@ -25,6 +25,7 @@ nomos-storage = { path = "../../../nomos-services/storage", features = ["rocksdb
|
||||||
nomos-network = { path = "../../network", features = ["mock"] }
|
nomos-network = { path = "../../network", features = ["mock"] }
|
||||||
nomos-mix-service = { path = "../../mix" }
|
nomos-mix-service = { path = "../../mix" }
|
||||||
nomos-mix = { path = "../../../nomos-mix/core" }
|
nomos-mix = { path = "../../../nomos-mix/core" }
|
||||||
|
nomos-mix-message = { path = "../../../nomos-mix/message" }
|
||||||
nomos-libp2p = { path = "../../../nomos-libp2p" }
|
nomos-libp2p = { path = "../../../nomos-libp2p" }
|
||||||
libp2p = { version = "0.53.2", features = ["ed25519"] }
|
libp2p = { version = "0.53.2", features = ["ed25519"] }
|
||||||
once_cell = "1.19"
|
once_cell = "1.19"
|
||||||
|
|
|
@ -5,6 +5,8 @@ use nomos_mix::membership::Node;
|
||||||
use nomos_mix::message_blend::{
|
use nomos_mix::message_blend::{
|
||||||
CryptographicProcessorSettings, MessageBlendSettings, TemporalProcessorSettings,
|
CryptographicProcessorSettings, MessageBlendSettings, TemporalProcessorSettings,
|
||||||
};
|
};
|
||||||
|
use nomos_mix_message::mock::MockMixMessage;
|
||||||
|
use nomos_mix_message::MixMessage;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
// crates
|
// crates
|
||||||
|
@ -191,7 +193,7 @@ pub struct TestDaNetworkSettings {
|
||||||
pub struct TestMixSettings {
|
pub struct TestMixSettings {
|
||||||
pub backend: Libp2pMixBackendSettings,
|
pub backend: Libp2pMixBackendSettings,
|
||||||
pub private_key: x25519_dalek::StaticSecret,
|
pub private_key: x25519_dalek::StaticSecret,
|
||||||
pub membership: Vec<Node>,
|
pub membership: Vec<Node<<MockMixMessage as MixMessage>::PublicKey>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_node(
|
pub fn new_node(
|
||||||
|
|
|
@ -10,6 +10,7 @@ nomos-executor = { path = "../../nodes/nomos-executor" }
|
||||||
nomos-libp2p = { path = "../../nomos-libp2p" }
|
nomos-libp2p = { path = "../../nomos-libp2p" }
|
||||||
nomos-node = { path = "../../nodes/nomos-node" }
|
nomos-node = { path = "../../nodes/nomos-node" }
|
||||||
nomos-mix = { path = "../../nomos-mix/core" }
|
nomos-mix = { path = "../../nomos-mix/core" }
|
||||||
|
nomos-mix-message = { path = "../../nomos-mix/message" }
|
||||||
nomos-tracing = { path = "../../nomos-tracing" }
|
nomos-tracing = { path = "../../nomos-tracing" }
|
||||||
nomos-tracing-service = { path = "../../nomos-services/tracing" }
|
nomos-tracing-service = { path = "../../nomos-services/tracing" }
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
|
|
|
@ -3,6 +3,7 @@ use std::{collections::HashMap, net::Ipv4Addr, str::FromStr};
|
||||||
// crates
|
// crates
|
||||||
use nomos_libp2p::{Multiaddr, PeerId};
|
use nomos_libp2p::{Multiaddr, PeerId};
|
||||||
use nomos_mix::membership::Node;
|
use nomos_mix::membership::Node;
|
||||||
|
use nomos_mix_message::{mock::MockMixMessage, MixMessage};
|
||||||
use nomos_tracing::{logging::loki::LokiConfig, tracing::otlp::OtlpTracingConfig};
|
use nomos_tracing::{logging::loki::LokiConfig, tracing::otlp::OtlpTracingConfig};
|
||||||
use nomos_tracing_service::{FilterLayer, LoggerLayer, TracingSettings};
|
use nomos_tracing_service::{FilterLayer, LoggerLayer, TracingSettings};
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
|
@ -171,7 +172,10 @@ fn update_da_peer_addresses(
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_mix_membership(hosts: Vec<Host>, membership: Vec<Node>) -> Vec<Node> {
|
fn update_mix_membership(
|
||||||
|
hosts: Vec<Host>,
|
||||||
|
membership: Vec<Node<<MockMixMessage as MixMessage>::PublicKey>>,
|
||||||
|
) -> Vec<Node<<MockMixMessage as MixMessage>::PublicKey>> {
|
||||||
membership
|
membership
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.zip(hosts)
|
.zip(hosts)
|
||||||
|
|
|
@ -12,6 +12,7 @@ nomos-executor = { path = "../nodes/nomos-executor", default-features = false }
|
||||||
nomos-network = { path = "../nomos-services/network", features = ["libp2p"] }
|
nomos-network = { path = "../nomos-services/network", features = ["libp2p"] }
|
||||||
nomos-mix-service = { path = "../nomos-services/mix", features = ["libp2p"] }
|
nomos-mix-service = { path = "../nomos-services/mix", features = ["libp2p"] }
|
||||||
nomos-mix = { path = "../nomos-mix/core" }
|
nomos-mix = { path = "../nomos-mix/core" }
|
||||||
|
nomos-mix-message = { path = "../nomos-mix/message" }
|
||||||
cryptarchia-consensus = { path = "../nomos-services/cryptarchia-consensus" }
|
cryptarchia-consensus = { path = "../nomos-services/cryptarchia-consensus" }
|
||||||
nomos-tracing = { path = "../nomos-tracing" }
|
nomos-tracing = { path = "../nomos-tracing" }
|
||||||
nomos-tracing-service = { path = "../nomos-services/tracing" }
|
nomos-tracing-service = { path = "../nomos-services/tracing" }
|
||||||
|
|
|
@ -2,6 +2,7 @@ use std::str::FromStr;
|
||||||
|
|
||||||
use nomos_libp2p::{ed25519, Multiaddr};
|
use nomos_libp2p::{ed25519, Multiaddr};
|
||||||
use nomos_mix::membership::Node;
|
use nomos_mix::membership::Node;
|
||||||
|
use nomos_mix_message::{mock::MockMixMessage, MixMessage};
|
||||||
use nomos_mix_service::backends::libp2p::Libp2pMixBackendSettings;
|
use nomos_mix_service::backends::libp2p::Libp2pMixBackendSettings;
|
||||||
|
|
||||||
use crate::get_available_port;
|
use crate::get_available_port;
|
||||||
|
@ -10,7 +11,7 @@ use crate::get_available_port;
|
||||||
pub struct GeneralMixConfig {
|
pub struct GeneralMixConfig {
|
||||||
pub backend: Libp2pMixBackendSettings,
|
pub backend: Libp2pMixBackendSettings,
|
||||||
pub private_key: x25519_dalek::StaticSecret,
|
pub private_key: x25519_dalek::StaticSecret,
|
||||||
pub membership: Vec<Node>,
|
pub membership: Vec<Node<<MockMixMessage as MixMessage>::PublicKey>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_mix_configs(ids: &[[u8; 32]]) -> Vec<GeneralMixConfig> {
|
pub fn create_mix_configs(ids: &[[u8; 32]]) -> Vec<GeneralMixConfig> {
|
||||||
|
@ -45,7 +46,7 @@ pub fn create_mix_configs(ids: &[[u8; 32]]) -> Vec<GeneralMixConfig> {
|
||||||
configs
|
configs
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mix_nodes(configs: &[GeneralMixConfig]) -> Vec<Node> {
|
fn mix_nodes(configs: &[GeneralMixConfig]) -> Vec<Node<<MockMixMessage as MixMessage>::PublicKey>> {
|
||||||
configs
|
configs
|
||||||
.iter()
|
.iter()
|
||||||
.map(|config| Node {
|
.map(|config| Node {
|
||||||
|
|
Loading…
Reference in New Issue