The sockaddr test added in commit 50500aade9 ("ocaml: Implement
sockaddr type") was quite complicated because it had to run nbdkit as
a subprocess, manage the socket, check for a PID file etc.
The simpler way of doing this is to make it work like the Python test
(python/test-aio-connect-unix.sh) where we run
nbdkit -U - ... --run './test $unixsocket'
The straightforward way would be to a separate shell script etc to
ocaml/tests/Makefile.am:TESTS which is orthogonal to how the existing
tests work. So instead make the test exec nbdkit when called first
time (without the $unixsocket parameter) and then run the test when
called the second time.
Updates: commit 50500aade9f32899eddd2a7b89ae5c596674f95c
---
ocaml/tests/test_580_aio_connect.ml | 69 +++++++++++++----------------
1 file changed, 30 insertions(+), 39 deletions(-)
diff --git a/ocaml/tests/test_580_aio_connect.ml b/ocaml/tests/test_580_aio_connect.ml
index 43c6fd0f7a..5a94ac0c9b 100644
--- a/ocaml/tests/test_580_aio_connect.ml
+++ b/ocaml/tests/test_580_aio_connect.ml
@@ -17,51 +17,42 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*)
+(* This test is unusual because we want to run it under nbdkit
+ * rather than having the test run nbdkit as a subprocess.
+ *
+ * Therefore we detect if a $unixsocket parameter is passed
+ * in Sys.argv. If not then we exec nbdkit:
+ * nbdkit -U - ... --run '$argv0 \$unixsocket'
+ * If the $unixsocket parameter is present then we run the test.
+ *)
+
open Unix
open Printf
let () =
- let nbd = NBD.create () in
+ match Array.length Sys.argv with
+ | 1 -> (* exec nbdkit *)
+ let argv0 = Sys.argv.(0) in
+ let runcmd = sprintf "%s $unixsocket" (Filename.quote argv0) in
+ execvp "nbdkit" [| "nbdkit"; "-U"; "-";
"--exit-with-parent";
+ "memory"; "size=512";
+ "--run"; runcmd |]
- (* Unlike other tests, we're going to run nbdkit as a subprocess
- * by hand and have it listening on a randomly named socket
- * that we create.
- *)
- let sock = Filename.temp_file "580-" ".sock" in
- unlink sock;
- let pidfile = Filename.temp_file "580-" ".pid" in
- unlink pidfile;
- let cmd =
- sprintf "nbdkit -U %s -P %s --exit-with-parent memory size=512 &"
- (Filename.quote sock) (Filename.quote pidfile) in
- if Sys.command cmd <> 0 then
- failwith "nbdkit command failed";
- let rec loop i =
- if i > 60 then
- failwith "nbdkit subcommand did not start up";
- if not (Sys.file_exists pidfile) then (
- sleep 1;
- loop (i+1)
- )
- in
- loop 0;
+ | 2 -> (* run the test *)
+ let unixsocket = Sys.argv.(1) in
+ let nbd = NBD.create () in
- (* Connect to the subprocess using a Unix.sockaddr. *)
- let sa = ADDR_UNIX sock in
- NBD.aio_connect nbd sa;
- while NBD.aio_is_connecting nbd do
- ignore (NBD.poll nbd 1)
- done;
- assert (NBD.aio_is_ready nbd);
- NBD.close nbd;
+ (* Connect to the subprocess using a Unix.sockaddr. *)
+ let sa = ADDR_UNIX unixsocket in
+ NBD.aio_connect nbd sa;
+ while NBD.aio_is_connecting nbd do
+ ignore (NBD.poll nbd 1)
+ done;
+ assert (NBD.aio_is_ready nbd);
+ assert (NBD.get_size nbd = 512_L);
+ NBD.close nbd
- (* Kill the nbdkit subprocess. *)
- let chan = open_in pidfile in
- let pid = int_of_string (input_line chan) in
- kill pid Sys.sigterm;
-
- (* Clean up files. *)
- unlink sock;
- unlink pidfile
+ | _ ->
+ failwith "unexpected test parameters"
let () = Gc.compact ()
--
2.37.0.rc2