1
1
use std:: io:: Read ;
2
+ use std:: ops:: Add ;
2
3
use std:: process:: { Child , Command , Output , Stdio } ;
3
4
use std:: { fs, net, sync:: atomic, thread, time} ;
4
5
@@ -334,7 +335,7 @@ fn server() {
334
335
wait_for_stdout ( openssl_server. 0 . as_mut ( ) . unwrap ( ) , b"listening\n " ) ;
335
336
curl ( port) ;
336
337
337
- let openssl_output = print_output ( openssl_server. take_inner ( ) . wait_with_output ( ) . unwrap ( ) ) ;
338
+ let openssl_output = print_output ( openssl_server. wait_with_timeout ( ) ) ;
338
339
339
340
let mut rustls_server = KillOnDrop ( Some (
340
341
Command :: new ( "tests/maybe-valgrind.sh" )
@@ -353,7 +354,7 @@ fn server() {
353
354
wait_for_stdout ( rustls_server. 0 . as_mut ( ) . unwrap ( ) , b"listening\n " ) ;
354
355
curl ( port) ;
355
356
356
- let rustls_output = print_output ( rustls_server. take_inner ( ) . wait_with_output ( ) . unwrap ( ) ) ;
357
+ let rustls_output = print_output ( rustls_server. wait_with_timeout ( ) ) ;
357
358
assert_eq ! ( openssl_output, rustls_output) ;
358
359
}
359
360
@@ -399,7 +400,7 @@ fn server_with_key_algorithm(key_type: &str, sig_algs: &str, version_flag: &str)
399
400
wait_for_stdout ( openssl_server. 0 . as_mut ( ) . unwrap ( ) , b"listening\n " ) ;
400
401
connect ( port, key_type, sig_algs, version_flag) ;
401
402
402
- let openssl_output = print_output ( openssl_server. take_inner ( ) . wait_with_output ( ) . unwrap ( ) ) ;
403
+ let openssl_output = print_output ( openssl_server. wait_with_timeout ( ) ) ;
403
404
404
405
let mut rustls_server = KillOnDrop ( Some (
405
406
Command :: new ( "tests/maybe-valgrind.sh" )
@@ -418,7 +419,7 @@ fn server_with_key_algorithm(key_type: &str, sig_algs: &str, version_flag: &str)
418
419
wait_for_stdout ( rustls_server. 0 . as_mut ( ) . unwrap ( ) , b"listening\n " ) ;
419
420
connect ( port, key_type, sig_algs, version_flag) ;
420
421
421
- let rustls_output = print_output ( rustls_server. take_inner ( ) . wait_with_output ( ) . unwrap ( ) ) ;
422
+ let rustls_output = print_output ( rustls_server. wait_with_timeout ( ) ) ;
422
423
assert_eq ! ( openssl_output, rustls_output) ;
423
424
}
424
425
@@ -541,6 +542,26 @@ impl KillOnDrop {
541
542
fn take_inner ( & mut self ) -> Child {
542
543
self . 0 . take ( ) . unwrap ( )
543
544
}
545
+
546
+ fn wait_with_timeout ( & mut self ) -> Output {
547
+ let mut child = self . take_inner ( ) ;
548
+
549
+ // close stdin in case child is waiting for us
550
+ child. stdin . take ( ) ;
551
+
552
+ let timeout_secs = 30 ;
553
+ let deadline = time:: SystemTime :: now ( ) . add ( time:: Duration :: from_secs ( timeout_secs) ) ;
554
+
555
+ loop {
556
+ if time:: SystemTime :: now ( ) > deadline {
557
+ panic ! ( "subprocess did not end within {timeout_secs} seconds" ) ;
558
+ }
559
+ if child. try_wait ( ) . expect ( "subprocess broken" ) . is_some ( ) {
560
+ return child. wait_with_output ( ) . unwrap ( ) ;
561
+ } ;
562
+ thread:: sleep ( time:: Duration :: from_millis ( 500 ) ) ;
563
+ }
564
+ }
544
565
}
545
566
546
567
impl Drop for KillOnDrop {
0 commit comments