use super::*;
use snarkvm::prelude::{FromBytes, ToBytes};
use std::borrow::Cow;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct Disconnect {
pub reason: DisconnectReason,
}
impl From<DisconnectReason> for Disconnect {
fn from(reason: DisconnectReason) -> Self {
Self { reason }
}
}
impl MessageTrait for Disconnect {
#[inline]
fn name(&self) -> Cow<'static, str> {
"Disconnect".into()
}
}
impl ToBytes for Disconnect {
fn write_le<W: io::Write>(&self, writer: W) -> io::Result<()> {
self.reason.write_le(writer)
}
}
impl FromBytes for Disconnect {
fn read_le<R: io::Read>(mut reader: R) -> io::Result<Self> {
Ok(Disconnect { reason: DisconnectReason::read_le(&mut reader)? })
}
}
#[cfg(test)]
mod tests {
use crate::{Disconnect, DisconnectReason};
use snarkvm::{
console::prelude::{FromBytes, ToBytes},
prelude::{Rng, TestRng},
};
use bytes::{Buf, BufMut, BytesMut};
#[test]
fn disconnect_roundtrip() {
let all_reasons = [
DisconnectReason::ExceededForkRange,
DisconnectReason::InvalidChallengeResponse,
DisconnectReason::InvalidForkDepth,
DisconnectReason::INeedToSyncFirst,
DisconnectReason::NoReasonGiven,
DisconnectReason::ProtocolViolation,
DisconnectReason::OutdatedClientVersion,
DisconnectReason::PeerHasDisconnected,
DisconnectReason::PeerRefresh,
DisconnectReason::ShuttingDown,
DisconnectReason::SyncComplete,
DisconnectReason::TooManyFailures,
DisconnectReason::TooManyPeers,
DisconnectReason::YouNeedToSyncFirst,
DisconnectReason::YourPortIsClosed(TestRng::default().gen()),
];
for reason in all_reasons.iter() {
let disconnect = Disconnect::from(*reason);
let mut buf = BytesMut::default().writer();
Disconnect::write_le(&disconnect, &mut buf).unwrap();
let disconnect = Disconnect::read_le(buf.into_inner().reader()).unwrap();
assert_eq!(reason, &disconnect.reason);
}
}
#[test]
#[should_panic]
fn disconnect_invalid_data_panics() {
let mut buf = BytesMut::default().writer();
"not a DisconnectReason-value".as_bytes().write_le(&mut buf).unwrap();
let _disconnect = Disconnect::read_le(buf.into_inner().reader()).unwrap();
}
}