[Libguestfs] [PATCH 09/10] bindtests: Test optargs in test0

Richard W.M. Jones rjones at redhat.com
Fri Jan 20 12:45:07 UTC 2012


On Fri, Jan 20, 2012 at 11:07:52AM +0000, Matthew Booth wrote:

> Note that this change disables compiling and running the haskell
> bindtests. The haskell bindings to not implement optargs, and adding

Typo: s/to/do/

> optargs to test0 causes that method not to be bound in the haskell
> bindings. This prevents the haskell bindtests from compiling. These
> should be re-enabled when optargs are implemented.

>  bindtests                        |   52 ++++++++++
>  generator/generator_actions.ml   |   10 ++-
>  generator/generator_bindtests.ml |  194 ++++++++++++++++++++++++++++++++------
>  generator/generator_types.ml     |    6 +
>  haskell/Makefile.am              |    8 +-
>  5 files changed, 237 insertions(+), 33 deletions(-)
> 
> diff --git a/bindtests b/bindtests
> index 23da165..c42feda 100644
> --- a/bindtests
> +++ b/bindtests
> @@ -7,6 +7,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: true
> +oint: 1
> +oint64: unset
> +ostring: unset
>  abc
>  null
>  []
> @@ -16,6 +20,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: 1
> +ostring: string
>  
>  def
>  []
> @@ -25,6 +33,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: false
> +oint: unset
> +oint64: unset
> +ostring: unset
>  
>  
>  []
> @@ -34,6 +46,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  abc
>  def
>  ["1"]
> @@ -43,6 +59,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  abc
>  def
>  ["1", "2"]
> @@ -52,6 +72,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  abc
>  def
>  ["1"]
> @@ -61,6 +85,10 @@ true
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  abc
>  def
>  ["1"]
> @@ -70,6 +98,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  abc
>  def
>  ["1"]
> @@ -79,6 +111,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  abc
>  def
>  ["1"]
> @@ -88,6 +124,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  abc
>  def
>  ["1"]
> @@ -97,6 +137,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  abc
>  def
>  ["1"]
> @@ -106,6 +150,10 @@ false
>  123
>  456
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  abc
>  def
>  ["1"]
> @@ -115,4 +163,8 @@ false
>  
>  
>  <61><62><63><00><61><62><63>
> +obool: unset
> +oint: unset
> +oint64: unset
> +ostring: unset
>  EOF
> diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml
> index 3d8cc4b..3a7be79 100644
> --- a/generator/generator_actions.ml
> +++ b/generator/generator_actions.ml
> @@ -43,6 +43,13 @@ let test_all_args = [
>    BufferIn "bufferin";
>  ]
>  
> +let test_all_optargs = [
> +  OBool   "obool";
> +  OInt    "oint";
> +  OInt64  "oint64";
> +  OString "ostring"
> +]
> +
>  let test_all_rets = [
>    (* except for RErr, which is tested thoroughly elsewhere *)
>    "test0rint",         RInt "valout";
> @@ -59,7 +66,8 @@ let test_all_rets = [
>  ]
>  
>  let test_functions = [
> -  ("test0", (RErr, test_all_args, []), -1, [NotInFish; NotInDocs; Cancellable],
> +  ("test0", (RErr, test_all_args, test_all_optargs), -1,
> +   [NotInFish; NotInDocs; Cancellable],
>     [],
>     "internal test function - do not use",
>     "\
> diff --git a/generator/generator_bindtests.ml b/generator/generator_bindtests.ml
> index e64afff..1c04ecf 100644
> --- a/generator/generator_bindtests.ml
> +++ b/generator/generator_bindtests.ml
> @@ -65,9 +65,9 @@ print_strings (char *const *argv)
>      | test0 :: tests -> test0, tests in
>  
>    let () =
> -    let (name, (ret, args, _ as style), _, _, _, _, _) = test0 in
> +    let (name, (ret, args, optargs as style), _, _, _, _, _) = test0 in
>      generate_prototype ~extern:false ~semicolon:false ~newline:true
> -      ~handle:"g" ~prefix:"guestfs__" name style;
> +      ~handle:"g" ~prefix:"guestfs__" ~optarg_proto:Argv name style;
>      pr "{\n";
>      List.iter (
>        function
> @@ -91,6 +91,31 @@ print_strings (char *const *argv)
>        | Int64 n -> pr "  printf (\"%%\" PRIi64 \"\\n\", %s);\n" n
>        | Pointer _ -> assert false
>      ) args;
> +    let check_optarg n printf_args =
> +      pr "  printf (\"%s: \");\n" n;
> +      pr "  if (optargs->bitmask & GUESTFS_TEST0_%s_BITMASK) {\n"
> +        (String.uppercase n);
> +      pr "    printf(%s);\n" printf_args;
> +      pr "  } else {\n";
> +      pr "    printf (\"unset\\n\");\n";
> +      pr "  }\n";
> +    in
> +    List.iter (
> +      function
> +      | OBool n ->
> +        let printf_args =
> +          sprintf "\"%%s\\n\", optargs->%s ? \"true\" : \"false\"" n in
> +        check_optarg n printf_args;
> +      | OInt n ->
> +        let printf_args = sprintf "\"%%i\\n\", optargs->%s" n in
> +        check_optarg n printf_args;
> +      | OInt64 n ->
> +        let printf_args = sprintf "\"%%\" PRIi64 \"\\n\", optargs->%s" n in
> +        check_optarg n printf_args;
> +      | OString n ->
> +        let printf_args = sprintf "\"%%s\\n\", optargs->%s" n in
> +        check_optarg n printf_args;
> +    ) optargs;
>      pr "  /* Java changes stdout line buffering so we need this: */\n";
>      pr "  fflush (stdout);\n";
>      pr "  return 0;\n";
> @@ -215,7 +240,12 @@ let () =
>    let g = Guestfs.create () in
>  ";
>  
> -  let mkargs args =
> +  let mkargs args optargs =
> +    let optargs =
> +      match optargs with
> +      | Some n -> n
> +      | None -> []
> +    in
>      String.concat " " (
>        List.map (
>          function
> @@ -231,11 +261,19 @@ let () =
>          | CallBool b -> string_of_bool b
>          | CallBuffer s -> sprintf "%S" s
>        ) args
> +      @
> +      List.map (
> +        function
> +        | CallOBool (n, v)    -> "~" ^ n ^ ":" ^ string_of_bool v
> +        | CallOInt (n, v)     -> "~" ^ n ^ ":" ^ string_of_int v
> +        | CallOInt64 (n, v)   -> "~" ^ n ^ ":" ^ Int64.to_string v ^ "L"
> +        | CallOString (n, v)  -> "~" ^ n ^ ":\"" ^ v ^ "\""
> +      ) optargs
>      )
>    in
>  
>    generate_lang_bindtests (
> -    fun f args -> pr "  Guestfs.%s g %s;\n" f (mkargs args)
> +    fun f args optargs -> pr "  Guestfs.%s g %s;\n" f (mkargs args optargs)
>    );
>  
>    pr "print_endline \"EOF\"\n"
> @@ -252,7 +290,12 @@ use Sys::Guestfs;
>  my $g = Sys::Guestfs->new ();
>  ";
>  
> -  let mkargs args =
> +  let mkargs args optargs =
> +    let optargs =
> +      match optargs with
> +      | Some n -> n
> +      | None -> []
> +    in
>      String.concat ", " (
>        List.map (
>          function
> @@ -266,11 +309,19 @@ my $g = Sys::Guestfs->new ();
>          | CallBool b -> if b then "1" else "0"
>          | CallBuffer s -> "\"" ^ c_quote s ^ "\""
>        ) args
> +      @
> +      List.map (
> +        function
> +        | CallOBool (n, v)    -> "'" ^ n ^ "' => " ^ if v then "1" else "0"
> +        | CallOInt (n, v)     -> "'" ^ n ^ "' => " ^ string_of_int v
> +        | CallOInt64 (n, v)   -> "'" ^ n ^ "' => " ^ Int64.to_string v
> +        | CallOString (n, v)  -> "'" ^ n ^ "' => '" ^ v ^ "'"
> +      ) optargs
>      )
>    in
>  
>    generate_lang_bindtests (
> -    fun f args -> pr "$g->%s (%s);\n" f (mkargs args)
> +    fun f args optargs -> pr "$g->%s (%s);\n" f (mkargs args optargs)
>    );
>  
>    pr "print \"EOF\\n\"\n"
> @@ -284,7 +335,12 @@ import guestfs
>  g = guestfs.GuestFS ()
>  ";
>  
> -  let mkargs args =
> +  let mkargs args optargs =
> +    let optargs =
> +      match optargs with
> +      | Some n -> n
> +      | None -> []
> +    in
>      String.concat ", " (
>        List.map (
>          function
> @@ -298,11 +354,19 @@ g = guestfs.GuestFS ()
>          | CallBool b -> if b then "1" else "0"
>          | CallBuffer s -> "\"" ^ c_quote s ^ "\""
>        ) args
> +      @
> +      List.map (
> +        function
> +        | CallOBool (n, v)    -> n ^ "=" ^ if v then "True" else "False"
> +        | CallOInt (n, v)     -> n ^ "=" ^ string_of_int v
> +        | CallOInt64 (n, v)   -> n ^ "=" ^ Int64.to_string v
> +        | CallOString (n, v)  -> n ^ "=\"" ^ v ^ "\""
> +      ) optargs
>      )
>    in
>  
>    generate_lang_bindtests (
> -    fun f args -> pr "g.%s (%s)\n" f (mkargs args)
> +    fun f args optargs -> pr "g.%s (%s)\n" f (mkargs args optargs)
>    );
>  
>    pr "print (\"EOF\")\n"
> @@ -316,7 +380,12 @@ require 'guestfs'
>  g = Guestfs::create()
>  ";
>  
> -  let mkargs args =
> +  let mkargs args optargs =
> +    let optargs =
> +      match optargs with
> +      | Some n -> n
> +      | None -> []
> +    in
>      String.concat ", " (
>        List.map (
>          function
> @@ -330,11 +399,22 @@ g = Guestfs::create()
>          | CallBool b -> string_of_bool b
>          | CallBuffer s -> "\"" ^ c_quote s ^ "\""
>        ) args
> -    )
> +    ) ^
> +    ", {" ^
> +    String.concat ", " (
> +      List.map (
> +        function
> +        | CallOBool (n, v)    -> ":" ^ n ^ " => " ^ string_of_bool v
> +        | CallOInt (n, v)     -> ":" ^ n ^ " => " ^ string_of_int v
> +        | CallOInt64 (n, v)   -> ":" ^ n ^ " => " ^ Int64.to_string v
> +        | CallOString (n, v)  -> ":" ^ n ^ " => \"" ^ v ^ "\""
> +      ) optargs
> +    ) ^
> +    "}"
>    in
>  
>    generate_lang_bindtests (
> -    fun f args -> pr "g.%s(%s)\n" f (mkargs args)
> +    fun f args optargs -> pr "g.%s(%s)\n" f (mkargs args optargs)
>    );
>  
>    pr "print \"EOF\\n\"\n"
> @@ -343,6 +423,8 @@ and generate_java_bindtests () =
>    generate_header CStyle GPLv2plus;
>  
>    pr "\
> +import java.util.Map;
> +import java.util.HashMap;
>  import com.redhat.et.libguestfs.*;
>  
>  public class Bindtests {
> @@ -350,8 +432,30 @@ public class Bindtests {
>      {
>          try {
>              GuestFS g = new GuestFS ();
> +            Map<String, Object> o;
> +
>  ";
>  
> +  let mkoptargs =
> +    function
> +    | Some optargs ->
> +      "o = new HashMap<String, Object>() {{" ::
> +      List.map (
> +        function
> +        | CallOBool (n, v)    ->
> +          "  put(\"" ^ n ^ "\", Boolean." ^ (if v then "TRUE" else "FALSE") ^ ");"
> +        | CallOInt (n, v)     ->
> +          "  put(\"" ^ n ^ "\", " ^ string_of_int v ^ ");"
> +        | CallOInt64 (n, v)   ->
> +          "  put(\"" ^ n ^ "\", " ^ Int64.to_string v ^ "l);"
> +        | CallOString (n, v)  ->
> +          "  put(\"" ^ n ^ "\", \"" ^ v ^ "\");"
> +      ) optargs @
> +      [ "}};\n" ]
> +    | None ->
> +      [ "o = null;" ]
> +  in
> +
>    let mkargs args =
>      String.concat ", " (
>        List.map (
> @@ -373,8 +477,14 @@ public class Bindtests {
>      )
>    in
>  
> +  let pr_indent indent strings =
> +    List.iter ( fun s -> pr "%s%s\n" indent s) strings
> +  in
> +
>    generate_lang_bindtests (
> -    fun f args -> pr "            g.%s (%s);\n" f (mkargs args)
> +    fun f args optargs ->
> +      pr_indent "            " (mkoptargs optargs);
> +      pr "            g.%s (%s, o);\n" f (mkargs args)
>    );
>  
>    pr "
> @@ -420,7 +530,7 @@ main = do
>    in
>  
>    generate_lang_bindtests (
> -    fun f args -> pr "  Guestfs.%s g %s\n" f (mkargs args)
> +    fun f args optargs -> pr "  Guestfs.%s g %s\n" f (mkargs args)
>    );
>  
>    pr "  putStrLn \"EOF\"\n"
> @@ -432,9 +542,29 @@ and generate_gobject_js_bindtests () =
>  const Guestfs = imports.gi.Guestfs;
>  
>  var g = new Guestfs.Session();
> +var o;
>  
>  ";
>  
> +    let mkoptargs = function
> +    | Some optargs ->
> +      "o = new Guestfs.Test0({" ^
> +      (
> +        String.concat ", " (
> +          List.map (
> +            function
> +            | CallOBool (n, v)    -> n ^ ": " ^ (if v then "true" else "false")
> +            | CallOInt (n, v)     -> n ^ ": " ^ (string_of_int v)
> +            | CallOInt64 (n, v)   -> n ^ ": " ^ Int64.to_string v
> +            | CallOString (n, v)  -> n ^ ": \"" ^ v ^ "\""
> +          ) optargs
> +        )
> +      ) ^
> +      "});"
> +    | None ->
> +      "o = null;"
> +    in
> +
>      let mkargs args =
>        String.concat ", " (
>          (List.map (
> @@ -450,11 +580,12 @@ var g = new Guestfs.Session();
>            | CallBool false -> "false"
>            | CallBuffer s -> "\"" ^ c_quote s ^ "\""
>          ) args)
> -        @ ["null"]
> +        @ ["o"; "null"]
>        )
>      in
>      generate_lang_bindtests (
> -      fun f args -> pr "g.%s(%s);\n" f (mkargs args)
> +      fun f args optargs ->
> +        pr "%s\ng.%s(%s);\n" (mkoptargs optargs) f (mkargs args)
>      );
>  
>      pr "\nprint(\"EOF\");\n"
> @@ -466,54 +597,59 @@ and generate_lang_bindtests call =
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList []; CallBool false;
>                  CallInt 0; CallInt64 0L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"]
> +               (Some [CallOBool ("obool", true); CallOInt ("oint", 1)]);
>    call "test0" [CallString "abc"; CallOptString None;
>                  CallStringList []; CallBool false;
>                  CallInt 0; CallInt64 0L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"]
> +               (Some [CallOInt64 ("oint64", 1L);
> +                      CallOString ("ostring", "string")]);
>    call "test0" [CallString ""; CallOptString (Some "def");
>                  CallStringList []; CallBool false;
>                  CallInt 0; CallInt64 0L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"]
> +               (Some [CallOBool ("obool", false)]);
>    call "test0" [CallString ""; CallOptString (Some "");
>                  CallStringList []; CallBool false;
>                  CallInt 0; CallInt64 0L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"]
> +                (Some []);
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList ["1"]; CallBool false;
>                  CallInt 0; CallInt64 0L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"] None;
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList ["1"; "2"]; CallBool false;
>                  CallInt 0; CallInt64 0L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"] None;
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList ["1"]; CallBool true;
>                  CallInt 0; CallInt64 0L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"] None;
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList ["1"]; CallBool false;
>                  CallInt (-1); CallInt64 (-1L); CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"] None;
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList ["1"]; CallBool false;
> -                CallInt (-2); CallInt64 (-2L); CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallInt (-2); CallInt64 (-2L); CallString "123";CallString "456";
> +                CallBuffer "abc\000abc"] None;
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList ["1"]; CallBool false;
>                  CallInt 1; CallInt64 1L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"] None;
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList ["1"]; CallBool false;
>                  CallInt 2; CallInt64 2L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"] None;
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList ["1"]; CallBool false;
>                  CallInt 4095; CallInt64 4095L; CallString "123"; CallString "456";
> -                CallBuffer "abc\000abc"];
> +                CallBuffer "abc\000abc"] None;
>    call "test0" [CallString "abc"; CallOptString (Some "def");
>                  CallStringList ["1"]; CallBool false;
>                  CallInt 0; CallInt64 0L; CallString ""; CallString "";
> -                CallBuffer "abc\000abc"]
> +                CallBuffer "abc\000abc"] None;
>  
>  (* XXX Add here tests of the return and error functions. *)
> diff --git a/generator/generator_types.ml b/generator/generator_types.ml
> index 233be54..5a0c425 100644
> --- a/generator/generator_types.ml
> +++ b/generator/generator_types.ml
> @@ -420,3 +420,9 @@ type callt =
>    | CallInt64 of int64
>    | CallBool of bool
>    | CallBuffer of string
> +
> +type call_optargt =
> +  | CallOBool of string * bool
> +  | CallOInt of string * int
> +  | CallOInt64 of string * int64
> +  | CallOString of string * string
> diff --git a/haskell/Makefile.am b/haskell/Makefile.am
> index 5c1ff98..3781f07 100644
> --- a/haskell/Makefile.am
> +++ b/haskell/Makefile.am
> @@ -33,13 +33,15 @@ TESTS_ENVIRONMENT = \
>  	TMPDIR=$(top_builddir) \
>  	$(VG)
>  
> -TESTS = run-bindtests Guestfs005Load Guestfs010Basic
> +# Don't run the bindtests: they don't build since the addition of optargs.
> +# Haskell bindings are incomplete.
> +TESTS = Guestfs005Load Guestfs010Basic
>  
> -check_DATA = Bindtests
> +#check_DATA = Bindtests
>  
>  GHCFLAGS = -I$(top_builddir)/src -L$(top_builddir)/src/.libs -i$(srcdir)
>  
> -all_targets = Bindtests Guestfs005Load Guestfs010Basic
> +all_targets = Guestfs005Load Guestfs010Basic
>  $(all_targets): $(top_builddir)/src/libguestfs.la
>  
>  all: $(all_targets)

Looks OK, ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top




More information about the Libguestfs mailing list