From dc3dbc4dfc88248ce0573b2ea39978e816ab352a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 8 May 2015 08:16:39 +1000 Subject: [PATCH] test: add pointer comparison macros Signed-off-by: Peter Hutterer --- test/litest-selftest.c | 141 +++++++++++++++++++++++++++++++++++++++++ test/litest.c | 12 ++++ test/litest.h | 26 ++++++++ 3 files changed, 179 insertions(+) diff --git a/test/litest-selftest.c b/test/litest-selftest.c index 5ed20ffe..f7974770 100644 --- a/test/litest-selftest.c +++ b/test/litest-selftest.c @@ -164,6 +164,131 @@ START_TEST(litest_int_ge_notrigger) } END_TEST +START_TEST(litest_ptr_eq_notrigger) +{ + int v = 10; + int *a = &v; + int *b = &v; + int c = NULL; + int d = NULL; + + litest_assert_ptr_eq(a, b); + litest_assert_ptr_eq(c, d); +} +END_TEST + +START_TEST(litest_ptr_eq_trigger) +{ + int v = 10; + int v2 = 11; + int *a = &v; + int *b = &v2; + + litest_assert_ptr_eq(a, b); +} +END_TEST + +START_TEST(litest_ptr_eq_trigger_NULL) +{ + int v = 10; + int *a = &v; + int *b = NULL; + + litest_assert_ptr_eq(a, b); +} +END_TEST + +START_TEST(litest_ptr_eq_trigger_NULL2) +{ + int v = 10; + int *a = &v; + int *b = NULL; + + litest_assert_ptr_eq(b, a); +} +END_TEST + +START_TEST(litest_ptr_ne_trigger) +{ + int v = 10; + int *a = &v; + int *b = &v; + + litest_assert_ptr_ne(a, b); +} +END_TEST + +START_TEST(litest_ptr_ne_trigger_NULL) +{ + int *a = NULL; + + litest_assert_ptr_ne(a, NULL); +} +END_TEST + +START_TEST(litest_ptr_ne_trigger_NULL2) +{ + int *a = NULL; + + litest_assert_ptr_ne(NULL, a); +} +END_TEST + +START_TEST(litest_ptr_ne_notrigger) +{ + int v1 = 10; + int v2 = 10; + int *a = &v1; + int *b = &v2; + int *c = NULL; + + litest_assert_ptr_ne(a, b); + litest_assert_ptr_ne(a, c); + litest_assert_ptr_ne(c, b); +} +END_TEST + +START_TEST(litest_ptr_null_notrigger) +{ + int *a = NULL; + + litest_assert_ptr_null(a); + litest_assert_ptr_null(NULL); +} +END_TEST + +START_TEST(litest_ptr_null_trigger) +{ + int v; + int *a = &v; + + litest_assert_ptr_null(a); +} +END_TEST + +START_TEST(litest_ptr_notnull_notrigger) +{ + int v; + int *a = &v; + + litest_assert_ptr_notnull(a); +} +END_TEST + +START_TEST(litest_ptr_notnull_trigger) +{ + int *a = NULL; + + litest_assert_ptr_notnull(a); +} +END_TEST + +START_TEST(litest_ptr_notnull_trigger_NULL) +{ + litest_assert_ptr_notnull(NULL); +} +END_TEST + static Suite * litest_assert_macros_suite(void) { @@ -201,6 +326,22 @@ litest_assert_macros_suite(void) tcase_add_test(tc, litest_int_gt_notrigger); suite_add_tcase(s, tc); + tc = tcase_create("pointer comparison "); + tcase_add_test_raise_signal(tc, litest_ptr_eq_trigger, SIGABRT); + tcase_add_test_raise_signal(tc, litest_ptr_eq_trigger_NULL, SIGABRT); + tcase_add_test_raise_signal(tc, litest_ptr_eq_trigger_NULL2, SIGABRT); + tcase_add_test(tc, litest_ptr_eq_notrigger); + tcase_add_test_raise_signal(tc, litest_ptr_ne_trigger, SIGABRT); + tcase_add_test_raise_signal(tc, litest_ptr_ne_trigger_NULL, SIGABRT); + tcase_add_test_raise_signal(tc, litest_ptr_ne_trigger_NULL2, SIGABRT); + tcase_add_test(tc, litest_ptr_ne_notrigger); + tcase_add_test_raise_signal(tc, litest_ptr_null_trigger, SIGABRT); + tcase_add_test(tc, litest_ptr_null_notrigger); + tcase_add_test_raise_signal(tc, litest_ptr_notnull_trigger, SIGABRT); + tcase_add_test_raise_signal(tc, litest_ptr_notnull_trigger_NULL, SIGABRT); + tcase_add_test(tc, litest_ptr_notnull_notrigger); + suite_add_tcase(s, tc); + return s; } diff --git a/test/litest.c b/test/litest.c index e91e499f..c0d35af7 100644 --- a/test/litest.c +++ b/test/litest.c @@ -188,6 +188,18 @@ litest_fail_comparison_int(const char *file, abort(); } +void +litest_fail_comparison_ptr(const char *file, + int line, + const char *func, + const char *comparison) +{ + litest_log("FAILED COMPARISON: %s\n", comparison); + litest_log("in %s() (%s:%d)\n", func, file, line); + litest_backtrace(); + abort(); +} + struct test { struct list node; char *name; diff --git a/test/litest.h b/test/litest.h index 80ced698..40b11bd8 100644 --- a/test/litest.h +++ b/test/litest.h @@ -89,6 +89,27 @@ #define litest_assert_int_gt(a_, b_) \ litest_assert_comparison_int_(a_, >, b_) +#define litest_assert_comparison_ptr_(a_, op_, b_) \ + do { \ + __typeof__(a_) _a = a_; \ + __typeof__(b_) _b = b_; \ + if (!((_a) op_ (_b))) \ + litest_fail_comparison_ptr(__FILE__, __LINE__, __func__,\ + #a_ " " #op_ " " #b_); \ + } while(0) + +#define litest_assert_ptr_eq(a_, b_) \ + litest_assert_comparison_ptr_(a_, ==, b_) + +#define litest_assert_ptr_ne(a_, b_) \ + litest_assert_comparison_ptr_(a_, !=, b_) + +#define litest_assert_ptr_null(a_) \ + litest_assert_comparison_ptr_(a_, ==, NULL) + +#define litest_assert_ptr_notnull(a_) \ + litest_assert_comparison_ptr_(a_, !=, NULL) + enum litest_device_type { LITEST_NO_DEVICE = -1, LITEST_SYNAPTICS_CLICKPAD = -2, @@ -181,6 +202,11 @@ litest_fail_comparison_int(const char *file, int b, const char *astr, const char *bstr); +void +litest_fail_comparison_ptr(const char *file, + int line, + const char *func, + const char *comparison); void litest_add(const char *name, void *func, enum litest_device_feature required_feature,