@@ -35,7 +35,9 @@ pub(super) fn upload_elapsed_after_rtt(
3535 } ;
3636
3737 match total_elapsed. checked_sub ( rtt_elapsed) {
38- Some ( adjusted_elapsed) if adjusted_elapsed >= Duration :: from_millis ( 50 ) => adjusted_elapsed,
38+ Some ( adjusted_elapsed) if !adjusted_elapsed. is_zero ( ) => {
39+ adjusted_elapsed. max ( Duration :: from_millis ( 50 ) )
40+ }
3941 _ => total_elapsed,
4042 }
4143}
@@ -148,7 +150,7 @@ mod tests {
148150
149151 #[ test]
150152 fn keeps_total_elapsed_when_rtt_would_overcorrect ( ) {
151- for rtt in [ 500 , 520 , 600 ] {
153+ for rtt in [ 520 , 600 ] {
152154 assert_eq ! (
153155 upload_elapsed_after_rtt(
154156 Duration :: from_millis( 520 ) ,
@@ -159,6 +161,21 @@ mod tests {
159161 }
160162 }
161163
164+ #[ test]
165+ fn faster_valid_uploads_do_not_report_lower_throughput_at_the_sample_floor ( ) {
166+ let rtt = Some ( Duration :: from_millis ( 100 ) ) ;
167+ let faster = upload_elapsed_after_rtt ( Duration :: from_millis ( 149 ) , rtt) ;
168+ let at_floor = upload_elapsed_after_rtt ( Duration :: from_millis ( 150 ) , rtt) ;
169+ let slower = upload_elapsed_after_rtt ( Duration :: from_millis ( 151 ) , rtt) ;
170+
171+ assert_eq ! ( faster, Duration :: from_millis( 50 ) ) ;
172+ assert_eq ! ( at_floor, Duration :: from_millis( 50 ) ) ;
173+ assert_eq ! ( slower, Duration :: from_millis( 51 ) ) ;
174+ assert ! (
175+ upload_mbps_for_bytes( 256 * 1024 , faster) >= upload_mbps_for_bytes( 256 * 1024 , slower)
176+ ) ;
177+ }
178+
162179 #[ test]
163180 fn elapsed_is_positive_without_an_rtt_sample ( ) {
164181 assert_eq ! (
0 commit comments