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