Browse Source

tinytest tt_{mem,str}_op now handle NULLs better

Now a NULL argument to either makes it fail, not crash.

Fies bug 9004; bugfix on 0.2.2.4-alpha.
Nick Mathewson 10 years ago
parent
commit
065097b81b
3 changed files with 22 additions and 6 deletions
  1. 6 0
      changes/bug9004
  2. 7 2
      src/ext/tinytest_macros.h
  3. 9 4
      src/test/test.h

+ 6 - 0
changes/bug9004

@@ -0,0 +1,6 @@
+  o Minor bugfixes (testing):
+    - Improve the tinytest implementation of string operation tests
+      so that comparisons NULL strings no longer crash the tests;
+      they now just fail, normally. Fixes bug 9004; bugfix on
+      0.2.2.4-alpha.
+

+ 7 - 2
src/ext/tinytest_macros.h

@@ -144,6 +144,10 @@
 	tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt,	\
 	    {print_=value_;},{},die_on_fail)
 
+#define tt_assert_test_type_opt(a,b,str_test,type,test,fmt,die_on_fail)	\
+	tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt,	\
+            {print_=value_?value_:"<NULL>";},{},die_on_fail)
+
 /* Helper: assert that a op b, when cast to type.  Format the values with
  * printf format fmt on failure. */
 #define tt_assert_op_type(a,op,b,type,fmt)				\
@@ -163,8 +167,9 @@
 	    (val1_ op val2_),"%p",TT_EXIT_TEST_FUNCTION)
 
 #define tt_str_op(a,op,b)						\
-	tt_assert_test_type(a,b,#a" "#op" "#b,const char *,		\
-	    (strcmp(val1_,val2_) op 0),"<%s>",TT_EXIT_TEST_FUNCTION)
+	tt_assert_test_type_opt(a,b,#a" "#op" "#b,const char *,		\
+	    (val1_ && val2_ && strcmp(val1_,val2_) op 0),"<%s>",	\
+	    TT_EXIT_TEST_FUNCTION)
 
 #define tt_want_int_op(a,op,b)						\
 	tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_),"%ld",(void)0)

+ 9 - 4
src/test/test.h

@@ -38,12 +38,17 @@
 #define test_mem_op(expr1, op, expr2, len)                              \
   tt_assert_test_fmt_type(expr1,expr2,#expr1" "#op" "#expr2,            \
                           const char *,                                 \
-                          (memcmp(val1_, val2_, len) op 0),             \
+                          (val1_ && val2_ && memcmp(val1_, val2_, len) op 0), \
                           char *, "%s",                                 \
                           { size_t printlen = (len)*2+1;                \
-                            print_ = tor_malloc(printlen);              \
-                            base16_encode(print_, printlen, value_,     \
-                                          (len)); },                    \
+                            if (value_) {                               \
+                              print_ = tor_malloc(printlen);            \
+                              base16_encode(print_, printlen, value_,   \
+                                            (len));                     \
+                            } else {                                    \
+                              print_ = tor_strdup("null");              \
+                            }                                           \
+                          },                                            \
                           { tor_free(print_); },                        \
                           TT_EXIT_TEST_FUNCTION                         \
                           );