use super::*;
use std::time::Instant;
#[test]
fn a_silent_node_does_not_delay_an_answer_in_the_same_window() {
let mut near = FakeNode::bind(id(0xf0));
near.serve(vec![], Mood::Answer, vec![]);
let mut live = FakeNode::bind(id(0x80));
live.serve(vec![near.node()], Mood::Answer, vec![]);
let mut silent = FakeNode::bind(id(0x10));
silent.serve(vec![], Mood::Silent, vec![]);
let door = router(vec![silent.node(), live.node()]);
let config = Config {
k: 2,
deadline: Duration::from_secs(2),
..quick()
};
let mut dht = client(vec![door.addr], config);
let started = Instant::now();
assert_eq!(
lookup(&mut dht, id(0xff)).unwrap(),
vec![near.node(), live.node()]
);
assert!(started.elapsed() < Duration::from_millis(500));
}
#[test]
fn the_window_refills_when_a_query_times_out() {
let mut silent = FakeNode::bind(id(0xf0));
silent.serve(vec![], Mood::Silent, vec![]);
let mut live = FakeNode::bind(id(0x10));
live.serve(vec![], Mood::Answer, vec![]);
let door = router(vec![silent.node(), live.node()]);
let config = Config {
alpha: 1,
deadline: Duration::from_millis(200),
..quick()
};
let mut dht = client(vec![door.addr], config);
let started = Instant::now();
assert_eq!(lookup(&mut dht, id(0xff)).unwrap(), vec![live.node()]);
let took = started.elapsed();
assert!(took >= Duration::from_millis(200), "{took:?}");
assert!(took < Duration::from_millis(800), "{took:?}");
}
#[test]
fn a_put_counts_the_holders_that_answer_past_a_silent_one() {
let kp = Keypair::from_seed([3u8; 32]).unwrap();
let item = kp.sign(vec![], 1, b"p".to_vec()).unwrap();
let mut holder = FakeNode::bind(id(0x42));
holder.serve(vec![], Mood::Answer, vec![]);
let mut mute = FakeNode::bind(id(0x43));
mute.serve(vec![], Mood::Mute, vec![]);
let door = router(vec![holder.node(), mute.node()]);
let mut dht = client(vec![door.addr], quick());
assert_eq!(dht.put(item).unwrap(), 1);
}