The old code gives arguments to a printf function which can't work
authorPeter Jones <pjones@redhat.com>
Sun, 27 May 2012 12:26:18 +0000 (14:26 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 27 May 2012 12:26:18 +0000 (14:26 +0200)
correctly, and the compiler complains.

* grub-core/tests/example_functional_test.c (example_test): Add
missing text.
* grub-core/tests/lib/test.c (add_failure): Rewrite.
* include/grub/test.h (grub_test_assert_helper): New declaration.
(grub_test_assert): Use grub_test_assert_helper.

ChangeLog
grub-core/tests/example_functional_test.c
grub-core/tests/lib/test.c
include/grub/test.h

index 28f36c4..15fa1a3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2012-05-27  Peter Jones <pjones@redhat.com>
+
+       The old code gives arguments to a printf function which can't work
+       correctly, and the compiler complains.
+
+       * grub-core/tests/example_functional_test.c (example_test): Add
+       missing text.
+       * grub-core/tests/lib/test.c (add_failure): Rewrite.
+       * include/grub/test.h (grub_test_assert_helper): New declaration.
+       (grub_test_assert): Use grub_test_assert_helper.
+
 2012-05-27  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/Makefile.core.def (example_functional_test): Rename to ...
index b841634..999f6d2 100644 (file)
@@ -27,7 +27,7 @@ static void
 example_test (void)
 {
   /* Check if 1st argument is true and report with default error message.  */
-  grub_test_assert (1 == 1);
+  grub_test_assert (1 == 1, "1 equal 1 expected");
 
   /* Check if 1st argument is true and report with custom error message.  */
   grub_test_assert (2 == 2, "2 equal 2 expected");
index da688ef..aac77e9 100644 (file)
@@ -43,22 +43,75 @@ typedef struct grub_test_failure *grub_test_failure_t;
 grub_test_t grub_test_list;
 static grub_test_failure_t failure_list;
 
-static void
-add_failure (const char *file,
-            const char *funp,
-            grub_uint32_t line, const char *fmt, va_list args)
+static grub_test_failure_t
+failure_start(const char *file, const char *funp, grub_uint32_t line);
+static grub_test_failure_t
+failure_start(const char *file, const char *funp, grub_uint32_t line)
 {
   grub_test_failure_t failure;
 
   failure = (grub_test_failure_t) grub_malloc (sizeof (*failure));
   if (!failure)
-    return;
+    return NULL;
 
   failure->file = grub_strdup (file ? : "<unknown_file>");
+  if (!failure->file)
+    {
+      grub_free(failure);
+      return NULL;
+    }
+
   failure->funp = grub_strdup (funp ? : "<unknown_function>");
+  if (!failure->funp)
+    {
+      grub_free(failure->file);
+      grub_free(failure);
+      return NULL;
+    }
+
   failure->line = line;
-  failure->message = grub_xvasprintf (fmt, args);
 
+  failure->message = NULL;
+
+  return failure;
+}
+
+static void
+failure_append_vtext(grub_test_failure_t failure, const char *fmt, va_list args);
+static void
+failure_append_vtext(grub_test_failure_t failure, const char *fmt, va_list args)
+{
+  char *msg = grub_xvasprintf(fmt, args);
+  if (failure->message)
+    {
+      char *oldmsg = failure->message;
+
+      failure->message = grub_xasprintf("%s%s", oldmsg, msg);
+      grub_free(oldmsg);
+    }
+  else
+    {
+      failure->message = msg;
+    }
+}
+
+static void
+failure_append_text(grub_test_failure_t failure, const char *fmt, ...)
+{
+  va_list args;
+
+  va_start(args, fmt);
+  failure_append_vtext(failure, fmt, args);
+  va_end(args);
+}
+
+static void
+add_failure (const char *file,
+            const char *funp,
+            grub_uint32_t line, const char *fmt, va_list args)
+{
+  grub_test_failure_t failure = failure_start(file, funp, line);
+  failure_append_text(failure, fmt, args);
   grub_list_push (GRUB_AS_LIST_P (&failure_list), GRUB_AS_LIST (failure));
 }
 
@@ -100,6 +153,29 @@ grub_test_nonzero (int cond,
   va_end (ap);
 }
 
+void
+grub_test_assert_helper (int cond, const char *file, const char *funp,
+                        grub_uint32_t line, const char *condstr,
+                        const char *fmt, ...)
+{
+  va_list ap;
+  grub_test_failure_t failure;
+
+  if (cond)
+    return;
+
+  failure = failure_start(file, funp, line);
+  failure_append_text(failure, "assert failed: %s ", condstr);
+
+  va_start(ap, fmt);
+
+  failure_append_vtext(failure, fmt, ap);
+
+  va_end(ap);
+
+  grub_list_push (GRUB_AS_LIST_P (&failure_list), GRUB_AS_LIST (failure));
+}
+
 void
 grub_test_register (const char *name, void (*test_main) (void))
 {
index 5d1ba75..d876f57 100644 (file)
@@ -54,10 +54,14 @@ void grub_test_nonzero (int cond, const char *file,
   __attribute__ ((format (printf, 5, 6)));
 
 /* Macro to fill in location details and an optional error message.  */
+void grub_test_assert_helper (int cond, const char *file,
+                            const char *func, grub_uint32_t line,
+                            const char *condstr, const char *fmt, ...)
+  __attribute__ ((format (printf, 6, 7)));
+
 #define grub_test_assert(cond, ...)                            \
-  grub_test_nonzero(cond, GRUB_FILE, __FUNCTION__, __LINE__,   \
-                   ## __VA_ARGS__,                             \
-                   "assert failed: %s", #cond)
+  grub_test_assert_helper(cond, GRUB_FILE, __FUNCTION__, __LINE__,     \
+                         #cond, ## __VA_ARGS__);
 
 void grub_unit_test_init (void);
 void grub_unit_test_fini (void);