improve magic tests, check output to see if it happened
authorbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 21 Jan 2012 03:59:03 +0000 (03:59 +0000)
committerbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 21 Jan 2012 03:59:03 +0000 (03:59 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@67408 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/tests/eina_test_magic.c

index d2c3d49..d0a374e 100644 (file)
@@ -40,21 +40,95 @@ struct _Eina_Magic_Struct
    EINA_MAGIC
 };
 
+struct log_ctx {
+   const char *msg;
+   const char *fnc;
+   Eina_Bool did;
+};
+
+/* tests should not output on success, just uncomment this for debugging */
+//#define SHOW_LOG 1
+
+static void
+_eina_test_safety_print_cb(const Eina_Log_Domain *d, Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, void *data, va_list args __UNUSED__)
+{
+   struct log_ctx *ctx = data;
+   va_list cp_args;
+   const char *str;
+
+   va_copy(cp_args, args);
+   str = va_arg(cp_args, const char *);
+   va_end(cp_args);
+
+   ck_assert_int_eq(level, EINA_LOG_LEVEL_ERR);
+   ck_assert_str_eq(fmt, "%s");
+   ck_assert_str_eq(ctx->msg, str);
+   ck_assert_str_eq(ctx->fnc, fnc);
+   ctx->did = EINA_TRUE;
+
+#ifdef SHOW_LOG
+   eina_log_print_cb_stderr(d, level, file, fnc, line, fmt, NULL, args);
+#else
+   (void)d;
+   (void)file;
+   (void)line;
+#endif
+}
+
+static void
+_eina_test_magic_print_cb(const Eina_Log_Domain *d, Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, void *data, va_list args __UNUSED__)
+{
+   struct log_ctx *ctx = data;
+
+   ck_assert_int_eq(level, EINA_LOG_LEVEL_CRITICAL);
+   ck_assert_str_eq(ctx->msg, fmt);
+   ck_assert_str_eq(ctx->fnc, fnc);
+   ctx->did = EINA_TRUE;
+
+#ifdef SHOW_LOG
+   eina_log_print_cb_stderr(d, level, file, fnc, line, fmt, NULL, args);
+#else
+   (void)d;
+   (void)file;
+   (void)line;
+#endif
+}
+
+#ifdef EINA_SAFETY_CHECKS
+#define TEST_MAGIC_SAFETY(fn, _msg)              \
+  ctx.msg = _msg;                                \
+  ctx.fnc = fn;                                  \
+  ctx.did = EINA_FALSE
+#endif
+
 START_TEST(eina_magic_simple)
 {
    Eina_Magic_Struct *ems = NULL;
+   struct log_ctx ctx;
 
    eina_init();
 
+   eina_log_print_cb_set(_eina_test_safety_print_cb, &ctx);
+
    eina_magic_string_set(EINA_MAGIC_TEST, EINA_MAGIC_STRING);
 
 #ifdef EINA_SAFETY_CHECKS
+#ifdef SHOW_LOG
    fprintf(stderr, "you should have a safety check failure below:\n");
+#endif
+   TEST_MAGIC_SAFETY("eina_magic_string_set",
+                     "safety check failed: magic_name == NULL");
    eina_magic_string_set(EINA_MAGIC_TEST2, NULL);
    fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
+   fail_unless(ctx.did);
 
+#ifdef SHOW_LOG
    fprintf(stderr, "you should have a safety check failure below:\n");
+#endif
+   TEST_MAGIC_SAFETY("eina_magic_string_set",
+                     "safety check failed: magic_name == NULL");
    eina_magic_string_set(EINA_MAGIC_TEST2, NULL);
+   fail_unless(ctx.did);
    fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
 #endif
 
@@ -64,10 +138,22 @@ START_TEST(eina_magic_simple)
    fail_if(strcmp(eina_magic_string_get(
                      EINA_MAGIC_TEST), EINA_MAGIC_STRING) != 0);
 
+   eina_log_print_cb_set(_eina_test_magic_print_cb, &ctx);
+
 #ifdef EINA_MAGIC_DEBUG
    fail_if(EINA_MAGIC_CHECK(ems, EINA_MAGIC_TEST));
+#ifdef SHOW_LOG
    fprintf(stderr, "you should see 'Input handle pointer is NULL' below\n");
+#endif
+   TEST_MAGIC_SAFETY(__FUNCTION__,
+                     "*** Eina Magic Check Failed !!!\n"
+                     "    Input handle pointer is NULL !\n"
+                     "*** NAUGHTY PROGRAMMER!!!\n"
+                     "*** SPANK SPANK SPANK!!!\n"
+                     "*** Now go fix your code. Tut tut tut!\n"
+                     "\n");
    EINA_MAGIC_FAIL(ems, EINA_MAGIC_TEST);
+   fail_unless(ctx.did);
 
    ems = malloc(sizeof (Eina_Magic_Struct));
    fail_if(!ems);
@@ -76,15 +162,39 @@ START_TEST(eina_magic_simple)
    fail_if(!EINA_MAGIC_CHECK(ems, EINA_MAGIC_TEST));
 
    EINA_MAGIC_SET(ems, EINA_MAGIC_NONE);
+#ifdef SHOW_LOG
    fprintf(stderr,
            "you should see 'Input handle has already been freed' below\n");
+#endif
+   TEST_MAGIC_SAFETY(__FUNCTION__,
+                     "*** Eina Magic Check Failed !!!\n"
+                     "    Input handle has already been freed!\n"
+                     "*** NAUGHTY PROGRAMMER!!!\n"
+                     "*** SPANK SPANK SPANK!!!\n"
+                     "*** Now go fix your code. Tut tut tut!\n"
+                     "\n");
    EINA_MAGIC_FAIL(ems, EINA_MAGIC_TEST);
+   fail_unless(ctx.did);
 
    EINA_MAGIC_SET(ems, 42424242);
+#ifdef SHOW_LOG
    fprintf(stderr, "you should see 'Input handle is wrong type' below\n");
+#endif
+   TEST_MAGIC_SAFETY(__FUNCTION__,
+                     "*** Eina Magic Check Failed !!!\n"
+                     "    Input handle is wrong type\n"
+                     "    Expected: %08x - %s\n"
+                     "    Supplied: %08x - %s\n"
+                     "*** NAUGHTY PROGRAMMER!!!\n"
+                     "*** SPANK SPANK SPANK!!!\n"
+                     "*** Now go fix your code. Tut tut tut!\n"
+                     "\n");
    EINA_MAGIC_FAIL(ems, EINA_MAGIC_TEST);
+   fail_unless(ctx.did);
 #endif
 
+   eina_log_print_cb_set(eina_log_print_cb_stderr, NULL);
+
    eina_shutdown();
 }
 END_TEST