use crate::protocol::peer::Peer;
use crate::tools::time::TimeMillis;
use bytes::Bytes;
pub trait TransportOwnershipProof: Send + Sync {
fn make_ownership_proof_payload(&self) -> Option<Bytes>;
fn prove(&self, peer: &Peer, proof_payload: &[u8], now: TimeMillis) -> bool;
}
pub struct RejectAllTransportOwnershipProof;
impl TransportOwnershipProof for RejectAllTransportOwnershipProof {
fn make_ownership_proof_payload(&self) -> Option<Bytes> {
None
}
fn prove(&self, _peer: &Peer, _proof_payload: &[u8], _now: TimeMillis) -> bool {
false
}
}
pub struct EmptyMarkerOwnershipProof;
impl TransportOwnershipProof for EmptyMarkerOwnershipProof {
fn make_ownership_proof_payload(&self) -> Option<Bytes> {
Some(Bytes::new())
}
fn prove(&self, _peer: &Peer, proof_payload: &[u8], _now: TimeMillis) -> bool {
proof_payload.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn fake_peer_for_proof_tests() -> Peer {
Peer::zero()
}
#[test]
fn reject_all_make_returns_none() {
let proof: RejectAllTransportOwnershipProof = RejectAllTransportOwnershipProof;
let _peer: Peer = fake_peer_for_proof_tests();
assert!(proof.make_ownership_proof_payload().is_none());
}
#[test]
fn reject_all_prove_rejects_empty() {
let proof: RejectAllTransportOwnershipProof = RejectAllTransportOwnershipProof;
let peer: Peer = fake_peer_for_proof_tests();
assert!(!proof.prove(&peer, &[], TimeMillis(1_700_000_000_000)));
}
#[test]
fn reject_all_prove_rejects_arbitrary_bytes() {
let proof: RejectAllTransportOwnershipProof = RejectAllTransportOwnershipProof;
let peer: Peer = fake_peer_for_proof_tests();
assert!(!proof.prove(&peer, &[1, 2, 3, 4, 5], TimeMillis(1_700_000_000_000)));
}
#[test]
fn empty_marker_make_returns_empty() {
let proof: EmptyMarkerOwnershipProof = EmptyMarkerOwnershipProof;
let payload: Bytes = proof.make_ownership_proof_payload().expect("empty-marker proof is always producible");
assert!(payload.is_empty());
}
#[test]
fn empty_marker_prove_accepts_empty() {
let proof: EmptyMarkerOwnershipProof = EmptyMarkerOwnershipProof;
let peer: Peer = fake_peer_for_proof_tests();
assert!(proof.prove(&peer, &[], TimeMillis(1_700_000_000_000)));
}
#[test]
fn empty_marker_prove_rejects_nonempty() {
let proof: EmptyMarkerOwnershipProof = EmptyMarkerOwnershipProof;
let peer: Peer = fake_peer_for_proof_tests();
assert!(!proof.prove(&peer, &[1, 2, 3], TimeMillis(1_700_000_000_000)));
}
}