capitests: Use ftruncate instead of seek + write to create test files.
[libguestfs.git] / generator / generator_capitests.ml
index 044c70d..325b37c 100644 (file)
@@ -175,22 +175,14 @@ int main (int argc, char *argv[])
 
   guestfs_set_error_handler (g, print_error, NULL);
 
-  guestfs_set_path (g, \"../appliance\");
-
   filename = \"test1.img\";
-  fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666);
+  fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_TRUNC, 0666);
   if (fd == -1) {
     perror (filename);
     exit (EXIT_FAILURE);
   }
-  if (lseek (fd, %d, SEEK_SET) == -1) {
-    perror (\"lseek\");
-    close (fd);
-    unlink (filename);
-    exit (EXIT_FAILURE);
-  }
-  if (write (fd, &c, 1) == -1) {
-    perror (\"write\");
+  if (ftruncate (fd, %d) == -1) {
+    perror (\"ftruncate\");
     close (fd);
     unlink (filename);
     exit (EXIT_FAILURE);
@@ -206,19 +198,13 @@ int main (int argc, char *argv[])
   }
 
   filename = \"test2.img\";
-  fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666);
+  fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_TRUNC, 0666);
   if (fd == -1) {
     perror (filename);
     exit (EXIT_FAILURE);
   }
-  if (lseek (fd, %d, SEEK_SET) == -1) {
-    perror (\"lseek\");
-    close (fd);
-    unlink (filename);
-    exit (EXIT_FAILURE);
-  }
-  if (write (fd, &c, 1) == -1) {
-    perror (\"write\");
+  if (ftruncate (fd, %d) == -1) {
+    perror (\"ftruncate\");
     close (fd);
     unlink (filename);
     exit (EXIT_FAILURE);
@@ -234,19 +220,13 @@ int main (int argc, char *argv[])
   }
 
   filename = \"test3.img\";
-  fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666);
+  fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_TRUNC, 0666);
   if (fd == -1) {
     perror (filename);
     exit (EXIT_FAILURE);
   }
-  if (lseek (fd, %d, SEEK_SET) == -1) {
-    perror (\"lseek\");
-    close (fd);
-    unlink (filename);
-    exit (EXIT_FAILURE);
-  }
-  if (write (fd, &c, 1) == -1) {
-    perror (\"write\");
+  if (ftruncate (fd, %d) == -1) {
+    perror (\"ftruncate\");
     close (fd);
     unlink (filename);
     exit (EXIT_FAILURE);
@@ -685,6 +665,19 @@ and generate_one_test_body name i test_name init test =
       in
       List.iter (generate_test_command_call test_name) seq;
       generate_test_command_call ~test test_name last
+  | TestOutputDevice (seq, expected) ->
+      pr "  /* TestOutputDevice for %s (%d) */\n" name i;
+      pr "  const char *expected = \"%s\";\n" (c_quote expected);
+      let seq, last = get_seq_last seq in
+      let test () =
+        pr "    r[5] = 's';\n";
+        pr "    if (STRNEQ (r, expected)) {\n";
+        pr "      fprintf (stderr, \"%s: expected \\\"%%s\\\" but got \\\"%%s\\\"\\n\", expected, r);\n" test_name;
+        pr "      return -1;\n";
+        pr "    }\n"
+      in
+      List.iter (generate_test_command_call test_name) seq;
+      generate_test_command_call ~test test_name last
   | TestLastFail seq ->
       pr "  /* TestLastFail for %s (%d) */\n" name i;
       let seq, last = get_seq_last seq in
@@ -707,6 +700,13 @@ and generate_test_command_call ?(expect_error = false) ?test test_name cmd =
         with Not_found ->
           failwithf "%s: in test, command %s was not found" test_name name in
 
+      (* If the call has optional args, fold them all together.  We cannot
+       * test partial optional args yet.
+       *)
+      let style =
+        let ret, args, optargs = style in
+        ret, args@optargs in
+
       if List.length (snd style) <> List.length args then
         failwithf "%s: in test, wrong number of args given to %s"
           test_name name;