[Libguestfs] [PATCH v2 7/9] tests: daemon: Cleanly shut down the daemon on exit.

Richard W.M. Jones
Thu, 25 Jun 2015 14:56:59 -0000

This refines the previous commit by shutting down the daemon cleanly
at the end of the test (assuming the test was successful).  It
repurposes the 'internal_exit' API for this, which was previously used
by the now defunct --enable-valgrind-daemon functionality.
---
 daemon/internal.c                 |  7 +------
 generator/actions.ml              |  3 ++-
 tests/daemon/captive-daemon.pm.in | 12 +++++-------
 3 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/daemon/internal.c b/daemon/internal.c
index 781366d..5fb3d54 100644
--- a/daemon/internal.c
+++ b/daemon/internal.c
@@ -46,14 +46,9 @@ do_internal_autosync (void)
 }

 /* NB: Only called when valgrinding the daemon. */
-int
+int __attribute__((noreturn))
 do_internal_exit (void)
 {
-  if (!autosync_umount) {
-    reply_with_error ("guestfsd -r flag used, ignoring");
-    return -1;
-  }
-
   /* Send a reply before exiting so the protocol doesn't get confused. */
   reply (NULL, NULL);

diff --git a/generator/actions.ml b/generator/actions.ml
index 24e84b5..a48d8ce 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -11951,7 +11951,8 @@ This function is used internally when setting up the
appliance." };
     name = "internal_exit"; added = (1, 23, 30);
     style = RErr, [], [];
     proc_nr = Some 414;
-    visibility = VInternal;
+    (* Really VInternal, but we need to use it from the Perl bindings. XXX *)
+    visibility = VDebug;
     cancellable = true;
     shortdesc = "cause the daemon to exit (internal use only)";
     longdesc = "\
diff --git a/tests/daemon/captive-daemon.pm.in
b/tests/daemon/captive-daemon.pm.in
index 991a9a1..19833b8 100644
--- a/tests/daemon/captive-daemon.pm.in
+++ b/tests/daemon/captive-daemon.pm.in
@@ -93,14 +93,15 @@ sub run_tests {
     # libguestfs live.
     $g = Sys::Guestfs->new ();
     $g->set_backend ("unix:" . $sockname);
+    $g->set_autosync (0);
     $g->launch;

     # Run the user tests.
     my $r = ::tests ($g);

-    # Close the socket.  The daemon should now exit.
-    $g->shutdown ();
-    $g->close ();
+    # Tell the daemon to exit cleanly, and remove the socket.
+    $g->internal_exit;
+    $g->close;
     unlink $sockname;

     waitpid ($pid, 0) or die "waitpid: $!";
@@ -112,10 +113,7 @@ sub run_tests {
         my $status = $? >> 8;
         die "ERROR: guestfsd died with exit code 119 (valgrind
failure)\n"
             if $status == 119;
-
-        # Note we allow guestfsd to die with exit code 1, because
-        # that indicates a read failure from the socket.
-        die "ERROR: guestfsd died with exit code $status\n" if
$status > 1;
+        die "ERROR: guestfsd died with exit code $status\n";
     }

     # Exit with failure if the user test failed.
--
2.3.1