@@ -511,6 +511,60 @@ mod tests {
511511 assert ! ( r. is_ok( ) ) ;
512512 }
513513
514+ #[ test]
515+ fn test_track_vm_killed_state ( ) {
516+ cleanup_libvirt_state ( ) ;
517+ let mut libvirtd = spawn_libvirtd ( ) . unwrap ( ) ;
518+ thread:: sleep ( std:: time:: Duration :: new ( 5 , 0 ) ) ;
519+
520+ let mut disk = UbuntuDiskConfig :: new ( FOCAL_IMAGE_NAME . to_owned ( ) ) ;
521+ let guest = Guest :: new ( & mut disk) ;
522+
523+ let domain_path = guest. create_domain ( VcpuConfig :: default ( ) , DEFAULT_RAM_SIZE ) ;
524+
525+ let r = std:: panic:: catch_unwind ( || {
526+ spawn_virsh ( & [ "create" , domain_path. to_str ( ) . unwrap ( ) ] )
527+ . unwrap ( )
528+ . wait_with_output ( )
529+ . unwrap ( ) ;
530+
531+ guest. wait_vm_boot ( None ) . unwrap ( ) ;
532+
533+ let pid = std:: fs:: read_to_string ( format ! ( "/var/run/libvirt/ch/{}.pid" , guest. vm_name) )
534+ . unwrap ( )
535+ . parse :: < libc:: pid_t > ( )
536+ . unwrap ( ) ;
537+ unsafe {
538+ libc:: kill ( pid, libc:: SIGKILL ) ;
539+ }
540+ thread:: sleep ( std:: time:: Duration :: new ( 2 , 0 ) ) ;
541+
542+ let list_output = spawn_virsh ( & [ "list" , "--all" ] )
543+ . unwrap ( )
544+ . wait_with_output ( )
545+ . unwrap ( ) ;
546+
547+ let re = Regex :: new ( & format ! ( r"\s+-\s+{}\s+shut off" , guest. vm_name) ) . unwrap ( ) ;
548+ assert ! ( re. is_match( std:: str :: from_utf8( & list_output. stdout) . unwrap( ) . trim( ) ) ) ;
549+ } ) ;
550+
551+ spawn_virsh ( & [ "destroy" , & guest. vm_name ] )
552+ . unwrap ( )
553+ . wait ( )
554+ . unwrap ( ) ;
555+
556+ libvirtd. kill ( ) . unwrap ( ) ;
557+ let libvirtd_output = libvirtd. wait_with_output ( ) . unwrap ( ) ;
558+
559+ eprintln ! (
560+ "libvirtd stdout\n \n {}\n \n libvirtd stderr\n \n {}" ,
561+ std:: str :: from_utf8( & libvirtd_output. stdout) . unwrap( ) ,
562+ std:: str :: from_utf8( & libvirtd_output. stderr) . unwrap( )
563+ ) ;
564+
565+ assert ! ( r. is_ok( ) ) ;
566+ }
567+
514568 #[ test]
515569 fn test_uri ( ) {
516570 cleanup_libvirt_state ( ) ;
0 commit comments