diff --git a/crates/librqbit/src/peer_connection.rs b/crates/librqbit/src/peer_connection.rs index 7994933..e5d7096 100644 --- a/crates/librqbit/src/peer_connection.rs +++ b/crates/librqbit/src/peer_connection.rs @@ -272,8 +272,12 @@ impl PeerConnection { .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 PeerConnection { * (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 PeerConnection { 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 diff --git a/crates/librqbit/src/tests/test_util.rs b/crates/librqbit/src/tests/test_util.rs index aac8af0..dcf4555 100644 --- a/crates/librqbit/src/tests/test_util.rs +++ b/crates/librqbit/src/tests/test_util.rs @@ -63,4 +63,11 @@ impl TestPeerMetadata { } 0f64 } + + pub fn bad_data_probability(&self) -> f64 { + if self.server_id % 2 == 0 { + return 0.05f64; + } + 0f64 + } }