Add bogus peer simulation to e2e tests

This commit is contained in:
Igor Katson 2024-03-29 20:32:08 +00:00
parent 2ef5124a2d
commit 048f4d1645
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
2 changed files with 25 additions and 6 deletions

View file

@ -272,8 +272,12 @@ impl<H: PeerConnectionHandler> PeerConnection<H> {
.and_then(|e| e.ut_metadata())
})?,
WriterRequest::ReadChunkRequest(chunk) => {
#[allow(unused_mut)]
let mut skip_reading_for_e2e_tests = false;
#[cfg(test)]
{
use tracing::warn;
// This is poor-mans fault injection for running e2e tests.
use crate::tests::test_util::TestPeerMetadata;
let tpm = TestPeerMetadata::from_peer_id(self.peer_id);
@ -286,6 +290,12 @@ impl<H: PeerConnectionHandler> PeerConnection<H> {
* (tpm.max_random_sleep_ms as f64))
as u64;
tokio::time::sleep(Duration::from_millis(sleep_ms)).await;
if rand::thread_rng().gen_bool(tpm.bad_data_probability()) {
warn!("will NOT actually read the data to simulate a malicious peer that sends garbage");
write_buf.fill(0);
skip_reading_for_e2e_tests = true;
}
}
// this whole section is an optimization
@ -293,12 +303,14 @@ impl<H: PeerConnectionHandler> PeerConnection<H> {
let preamble_len = serialize_piece_preamble(chunk, &mut write_buf);
let full_len = preamble_len + chunk.size as usize;
write_buf.resize(full_len, 0);
self.spawner
.spawn_block_in_place(|| {
self.handler
.read_chunk(chunk, &mut write_buf[preamble_len..])
})
.with_context(|| format!("error reading chunk {chunk:?}"))?;
if !skip_reading_for_e2e_tests {
self.spawner
.spawn_block_in_place(|| {
self.handler
.read_chunk(chunk, &mut write_buf[preamble_len..])
})
.with_context(|| format!("error reading chunk {chunk:?}"))?;
}
uploaded_add = Some(chunk.size);
full_len

View file

@ -63,4 +63,11 @@ impl TestPeerMetadata {
}
0f64
}
pub fn bad_data_probability(&self) -> f64 {
if self.server_id % 2 == 0 {
return 0.05f64;
}
0f64
}
}