mod support; use irtt_client::{Client, ClientEvent, NegotiationPolicy}; use irtt_proto::{echo_header_len, Params, TimestampFields}; use support::{config_for_params, default_params, run_one_probe, BackendPeer, ServerObservation}; use crate::support::test_echo_packet_len; fn params_with_length(length: i64) -> Params { Params { length, ..default_params() } } fn assert_echo_size(run: &support::OneProbeRun, expected: usize) { match run.observations[1] { ServerObservation::Echo { len, .. } => assert_eq!(len, expected), ref other => panic!("expected Echo observation, got {other:?}"), } } fn assert_reply(event: &ClientEvent) { assert!(matches!(event, ClientEvent::EchoReply { .. })); } fn assert_sent_bytes(event: &ClientEvent, expected: usize) { match event { ClientEvent::EchoSent { bytes, .. } => assert_eq!(*bytes, expected), other => panic!("expected EchoSent, got {other:?}"), } } fn assert_reply_bytes(event: &ClientEvent, expected: usize) { match event { ClientEvent::EchoReply { bytes, .. } => assert_eq!(*bytes, expected), other => panic!("expected EchoReply, got {other:?}"), } } // ─── Echo request size: FakeServer observes exact packet size ─── #[test] fn echo_request_size_matches_echo_packet_len_for_zero_length() { let params = params_with_length(0); let run = run_one_probe(params.clone(), TimestampFields::default()); let expected = test_echo_packet_len(false, ¶ms); assert_echo_size(&run, expected); assert_sent_bytes(&run.sent, expected); } #[test] fn echo_request_size_matches_echo_packet_len_above_header() { for length in [16, 60, 128, 1472, 4096] { let params = params_with_length(length); let run = run_one_probe(params.clone(), TimestampFields::default()); let expected = test_echo_packet_len(false, ¶ms); assert_eq!( expected, echo_header_len(false, ¶ms).max(length as usize) ); assert_echo_size(&run, expected); assert_sent_bytes(&run.sent, expected); } } // ─── Echo reply handling ─── #[test] fn echo_reply_bytes_consistent_with_echo_packet_len_for_various_lengths() { for length in [0, 1472, 4096] { let params = params_with_length(length); let run = run_one_probe(params.clone(), TimestampFields::default()); let expected = test_echo_packet_len(false, ¶ms); assert_reply(&run.reply); assert_reply_bytes(&run.reply, expected); } } // ─── Backend-neutral smoke ─── #[test] fn backend_large_packet_smoke() { let params = params_with_length(1472); let peer = BackendPeer::start_open_echo(None); let mut config = config_for_params(¶ms); config.open.negotiation = NegotiationPolicy::Loose; config.request.length = 1472; let mut client = Client::connect(peer.addr().to_string(), config).unwrap(); client .set_recv_timeout(Some(std::time::Duration::from_millis(500))) .unwrap(); let outcome = client.open().unwrap(); assert!(matches!(outcome, irtt_client::OpenOutcome::Started(_))); client.send_probe().unwrap(); let events = client.recv_once().unwrap(); assert_eq!(events.len(), 1); assert!(matches!(events[0], ClientEvent::EchoReply { .. })); client.close().unwrap(); }