Skip to content

Commit

Permalink
add unit test coverage for healthcheck implementation
Browse files Browse the repository at this point in the history
Signed-off-by: onur-ozkan <work@onurozkan.dev>
  • Loading branch information
onur-ozkan committed Sep 2, 2024
1 parent b73a0f2 commit e6f29c7
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 3 deletions.
81 changes: 79 additions & 2 deletions mm2src/mm2_main/src/lp_healthcheck.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub(crate) const PEER_HEALTHCHECK_PREFIX: TopicPrefix = "hcheck";
pub(crate) const HEALTHCHECK_BLOCKING_DURATION: Duration = Duration::from_millis(750);

#[derive(Debug, Deserialize, Serialize)]
#[cfg_attr(test, derive(PartialEq))]
pub(crate) struct HealthcheckMessage {
signature: Vec<u8>,
data: HealthcheckData,
Expand Down Expand Up @@ -111,6 +112,7 @@ impl HealthcheckMessage {
}

#[derive(Debug, Deserialize, Serialize)]
#[cfg_attr(test, derive(PartialEq))]
struct HealthcheckData {
sender_peer: String,
sender_public_key: Vec<u8>,
Expand All @@ -129,12 +131,12 @@ pub fn peer_healthcheck_topic(peer_id: &PeerId) -> String {
pub_sub_topic(PEER_HEALTHCHECK_PREFIX, &peer_id.to_string())
}

#[derive(Clone, Deserialize)]
#[derive(Deserialize)]
pub struct RequestPayload {
peer_id: String,
}

#[derive(Clone, Debug, Display, Serialize, SerializeErrorType)]
#[derive(Debug, Display, Serialize, SerializeErrorType)]
#[serde(tag = "error_type", content = "error_data")]
pub enum HealthcheckRpcError {
InvalidPeerAddress { reason: String },
Expand Down Expand Up @@ -186,3 +188,78 @@ pub async fn peer_connection_healthcheck_rpc(

Ok(rx.timeout(RESULT_CHANNEL_TIMEOUT).await == Ok(Ok(())))
}

#[cfg(test)]
mod tests {
use mm2_test_helpers::for_tests::mm_ctx_with_iguana;

use crate::lp_ordermatch::ordermatch_tests::init_p2p_context;

use super::*;

fn create_test_peer_id() -> PeerId {
let keypair = mm2_libp2p::Keypair::generate_ed25519();
PeerId::from(keypair.public())
}

fn ctx() -> MmArc {
let ctx = mm_ctx_with_iguana(Some("dummy-value"));
init_p2p_context(&ctx);
ctx
}

#[test]
fn test_valid_message() {
let ctx = ctx();
let target_peer = create_test_peer_id();
let message = HealthcheckMessage::generate_message(&ctx, target_peer, false, 5).unwrap();
assert!(message.is_received_message_valid(target_peer));
}

#[test]
fn test_corrupted_messages() {
let ctx = ctx();
let target_peer = create_test_peer_id();

let mut message = HealthcheckMessage::generate_message(&ctx, target_peer, false, 5).unwrap();
message.data.expires_at += 1;
assert!(!message.is_received_message_valid(target_peer));

let mut message = HealthcheckMessage::generate_message(&ctx, target_peer, false, 5).unwrap();
message.data.is_a_reply = !message.data.is_a_reply;
assert!(!message.is_received_message_valid(target_peer));

let mut message = HealthcheckMessage::generate_message(&ctx, target_peer, false, 5).unwrap();
message.data.sender_peer += "0";
assert!(!message.is_received_message_valid(target_peer));

let mut message = HealthcheckMessage::generate_message(&ctx, target_peer, false, 5).unwrap();
message.data.target_peer += "0";
assert!(!message.is_received_message_valid(target_peer));

let message = HealthcheckMessage::generate_message(&ctx, target_peer, false, 5).unwrap();
assert!(!message.is_received_message_valid(PeerId::from_str(&message.data.sender_peer).unwrap()));
}

#[test]
fn test_expired_message() {
let ctx = ctx();
let target_peer = create_test_peer_id();
let message = HealthcheckMessage::generate_message(&ctx, target_peer, false, -1).unwrap();
assert!(!message.is_received_message_valid(target_peer));
}

#[test]
fn test_encode_decode() {
let ctx = ctx();
let target_peer = create_test_peer_id();

let original = HealthcheckMessage::generate_message(&ctx, target_peer, false, 10).unwrap();

let encoded = original.encode().unwrap();
assert!(!encoded.is_empty());

let decoded = HealthcheckMessage::decode(&encoded).unwrap();
assert_eq!(original, decoded);
}
}
2 changes: 1 addition & 1 deletion mm2src/mm2_main/src/ordermatch_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1677,7 +1677,7 @@ fn pubkey_and_secret_for_test(passphrase: &str) -> (String, [u8; 32]) {
(pubkey, secret)
}

fn init_p2p_context(ctx: &MmArc) -> (mpsc::Sender<AdexBehaviourCmd>, mpsc::Receiver<AdexBehaviourCmd>) {
pub(crate) fn init_p2p_context(ctx: &MmArc) -> (mpsc::Sender<AdexBehaviourCmd>, mpsc::Receiver<AdexBehaviourCmd>) {
let (cmd_tx, cmd_rx) = mpsc::channel(10);

let p2p_key = {
Expand Down

0 comments on commit e6f29c7

Please sign in to comment.