|
|
4b6aa8 |
From 83ff1e3f0b925910c0965490a26860a7c5efaa57 Mon Sep 17 00:00:00 2001
|
|
|
4b6aa8 |
From: Matej Habrnal <mhabrnal@redhat.com>
|
|
|
4b6aa8 |
Date: Tue, 22 Mar 2016 17:13:38 +0100
|
|
|
4b6aa8 |
Subject: [PATCH] testsuite: add simple helper macros
|
|
|
4b6aa8 |
|
|
|
4b6aa8 |
I am tired of repeating the same constructions over and over again.
|
|
|
4b6aa8 |
|
|
|
4b6aa8 |
Signed-off-by: Jakub Filak <jfilak@redhat.com>
|
|
|
4b6aa8 |
---
|
|
|
4b6aa8 |
tests/Makefile.am | 2 +-
|
|
|
4b6aa8 |
tests/atlocal.in | 2 +-
|
|
|
4b6aa8 |
tests/helpers/testsuite.h | 297 ++++++++++++++++++++++++++++++++++++++++
|
|
|
4b6aa8 |
tests/helpers/testsuite_tools.h | 67 +++++++++
|
|
|
4b6aa8 |
4 files changed, 366 insertions(+), 2 deletions(-)
|
|
|
4b6aa8 |
create mode 100644 tests/helpers/testsuite.h
|
|
|
4b6aa8 |
create mode 100644 tests/helpers/testsuite_tools.h
|
|
|
4b6aa8 |
|
|
|
4b6aa8 |
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|
|
4b6aa8 |
index 9aa3a07..9bfc2b6 100644
|
|
|
4b6aa8 |
--- a/tests/Makefile.am
|
|
|
4b6aa8 |
+++ b/tests/Makefile.am
|
|
|
4b6aa8 |
@@ -58,7 +58,7 @@ MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
|
|
|
4b6aa8 |
check_DATA = atconfig atlocal $(TESTSUITE)
|
|
|
4b6aa8 |
DISTCLEANFILES = atconfig
|
|
|
4b6aa8 |
EXTRA_DIST += atlocal.in conf ureport ureport-rhts-credentials \
|
|
|
4b6aa8 |
- bugzilla_plugin.at.in
|
|
|
4b6aa8 |
+ helpers/testsuite.h bugzilla_plugin.at.in
|
|
|
4b6aa8 |
|
|
|
4b6aa8 |
atconfig: $(top_builddir)/config.status
|
|
|
4b6aa8 |
(cd ${top_builddir} && ./config.status ${subdir}/atconfig)
|
|
|
4b6aa8 |
diff --git a/tests/atlocal.in b/tests/atlocal.in
|
|
|
4b6aa8 |
index 1a82edb..3d6b04a 100644
|
|
|
4b6aa8 |
--- a/tests/atlocal.in
|
|
|
4b6aa8 |
+++ b/tests/atlocal.in
|
|
|
4b6aa8 |
@@ -6,7 +6,7 @@ CC='@CC@'
|
|
|
4b6aa8 |
LIBTOOL="$abs_top_builddir/libtool"
|
|
|
4b6aa8 |
|
|
|
4b6aa8 |
# We want no optimization.
|
|
|
4b6aa8 |
-CFLAGS="@O0CFLAGS@ -I$abs_top_builddir/src/include -I$abs_top_builddir/src/lib -I$abs_top_builddir/src/gtk-helpers -D_GNU_SOURCE @GLIB_CFLAGS@ @GTK_CFLAGS@ -DDEFAULT_DUMP_DIR_MODE=@DEFAULT_DUMP_DIR_MODE@"
|
|
|
4b6aa8 |
+CFLAGS="@O0CFLAGS@ -I$abs_top_builddir/tests/helpers -I$abs_top_builddir/src/include -I$abs_top_builddir/src/lib -I$abs_top_builddir/src/gtk-helpers -D_GNU_SOURCE @GLIB_CFLAGS@ @GTK_CFLAGS@ -DDEFAULT_DUMP_DIR_MODE=@DEFAULT_DUMP_DIR_MODE@"
|
|
|
4b6aa8 |
|
|
|
4b6aa8 |
# Are special link options needed?
|
|
|
4b6aa8 |
LDFLAGS="@LDFLAGS@"
|
|
|
4b6aa8 |
diff --git a/tests/helpers/testsuite.h b/tests/helpers/testsuite.h
|
|
|
4b6aa8 |
new file mode 100644
|
|
|
4b6aa8 |
index 0000000..28bfd3e
|
|
|
4b6aa8 |
--- /dev/null
|
|
|
4b6aa8 |
+++ b/tests/helpers/testsuite.h
|
|
|
4b6aa8 |
@@ -0,0 +1,297 @@
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ Copyright (C) 2015 ABRT team <crash-catcher@lists.fedorahosted.org>
|
|
|
4b6aa8 |
+ Copyright (C) 2015 RedHat inc.
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ This program is free software; you can redistribute it and/or modify
|
|
|
4b6aa8 |
+ it under the terms of the GNU General Public License as published by
|
|
|
4b6aa8 |
+ the Free Software Foundation; either version 2 of the License, or
|
|
|
4b6aa8 |
+ (at your option) any later version.
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ This program is distributed in the hope that it will be useful,
|
|
|
4b6aa8 |
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
4b6aa8 |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
4b6aa8 |
+ GNU General Public License for more details.
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ You should have received a copy of the GNU General Public License along
|
|
|
4b6aa8 |
+ with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
4b6aa8 |
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ ----
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ libreport testsuite helpers
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ Feel free to add whatever macro you need but please try to keep this file
|
|
|
4b6aa8 |
+ short and useful.
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ Bare in mind usability and print as much accurate log messages as possible:
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ Example 1:
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ int actual = 0;
|
|
|
4b6aa8 |
+ int expected = 1;
|
|
|
4b6aa8 |
+ TS_ASSERT_SIGNED_EQ(actual, expected)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ ----
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ [ FAILED ] 12: Assert (actual == expected)
|
|
|
4b6aa8 |
+ Actual : 0
|
|
|
4b6aa8 |
+ Expected: 1
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ Example 2:
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ int get_runtime_number() {
|
|
|
4b6aa8 |
+ return 0;
|
|
|
4b6aa8 |
+ }
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ TS_ASSERT_SIGNED_OP_MESSAGE(get_runtime_number(), 1, "Custom message")
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ ----
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ [ FAILED ] 3: Custom messages (get_runtime_number() >= 1)
|
|
|
4b6aa8 |
+ Actual : 0
|
|
|
4b6aa8 |
+ Expected: 1
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ Note: the number right behind [ FAILED ] is line number where the failed
|
|
|
4b6aa8 |
+ assert is located.
|
|
|
4b6aa8 |
+*/
|
|
|
4b6aa8 |
+#ifndef LIBREPORT_TESTSUITE_H
|
|
|
4b6aa8 |
+#define LIBREPORT_TESTSUITE_H
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/* For g_verbose */
|
|
|
4b6aa8 |
+#include "internal_libreport.h"
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/* For convenience */
|
|
|
4b6aa8 |
+#include <assert.h>
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/* Number of failed asserts and other failures. Can be used a return value of
|
|
|
4b6aa8 |
+ * the main function. */
|
|
|
4b6aa8 |
+long g_testsuite_fails = 0;
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/* Number of successful asserts. For debugging purpose. */
|
|
|
4b6aa8 |
+long g_testsuite_ok = 0;
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/* Enables additional log messages. */
|
|
|
4b6aa8 |
+int g_testsuite_debug = 0;
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/* Can be used to change log messages destination. */
|
|
|
4b6aa8 |
+FILE *g_testsuite_output_stream = 0;
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ * Test case definition
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_MAIN \
|
|
|
4b6aa8 |
+ int main(int argc, char *argv[]) { g_verbose = 3; do
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_RETURN_MAIN \
|
|
|
4b6aa8 |
+ while (0) ;\
|
|
|
4b6aa8 |
+ return g_testsuite_fails; }
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ * Logging
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_PRINTF(format, ...) \
|
|
|
4b6aa8 |
+ fprintf(g_testsuite_output_stream != NULL ? g_testsuite_output_stream : stderr, format, __VA_ARGS__)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_DEBUG_PRINTF(format, ...) \
|
|
|
4b6aa8 |
+ do { if (g_testsuite_debug) { TS_PRINTF(format, __VA_ARGS__); } } while (0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ * Handling of test results
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_SUCCESS(format, ...) \
|
|
|
4b6aa8 |
+ do { \
|
|
|
4b6aa8 |
+ TS_DEBUG_PRINTF("[ OK ] %d: ", __LINE__); \
|
|
|
4b6aa8 |
+ TS_DEBUG_PRINTF(format, __VA_ARGS__); \
|
|
|
4b6aa8 |
+ ++g_testsuite_ok; \
|
|
|
4b6aa8 |
+ } while (0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_FAILURE(format, ...) \
|
|
|
4b6aa8 |
+ do { \
|
|
|
4b6aa8 |
+ TS_PRINTF("[ FAILED ] %d: ", __LINE__); \
|
|
|
4b6aa8 |
+ TS_PRINTF(format, __VA_ARGS__); \
|
|
|
4b6aa8 |
+ ++g_testsuite_fails; \
|
|
|
4b6aa8 |
+ } while (0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ * Logical conditions
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define _TS_ASSERT_BOOLEAN(expression, expected, message) \
|
|
|
4b6aa8 |
+ do { \
|
|
|
4b6aa8 |
+ const int result = (expression); \
|
|
|
4b6aa8 |
+ if (result == expected) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#expression" == %s)\n", message ? message : "Assert", expected ? "TRUE" : "FALSE"); \
|
|
|
4b6aa8 |
+ }\
|
|
|
4b6aa8 |
+ else { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#expression" == %s)\n", message ? message : "Assert", expected ? "TRUE" : "FALSE"); \
|
|
|
4b6aa8 |
+ }\
|
|
|
4b6aa8 |
+ } while(0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_TRUE_MESSAGE(expression, message) \
|
|
|
4b6aa8 |
+ _TS_ASSERT_BOOLEAN(expression, 1, message)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_TRUE(expression) \
|
|
|
4b6aa8 |
+ TS_ASSERT_TRUE_MESSAGE(expression, NULL)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_FALSE_MESSAGE(expression, message) \
|
|
|
4b6aa8 |
+ _TS_ASSERT_BOOLEAN(expression, 0, message)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_FALSE(expression) \
|
|
|
4b6aa8 |
+ TS_ASSERT_FALSE_MESSAGE(expression, NULL)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ * Testing of signed numbers
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_SIGNED_OP_MESSAGE(actual, operator, expected, message) \
|
|
|
4b6aa8 |
+ do { \
|
|
|
4b6aa8 |
+ long long l_ts_lhs = (actual); \
|
|
|
4b6aa8 |
+ long long l_ts_rhs = (expected); \
|
|
|
4b6aa8 |
+ if (l_ts_lhs operator l_ts_rhs) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#actual" "#operator" "#expected")\n\tActual : %lld\n", message ? message : "Assert", l_ts_lhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" "#operator" "#expected")\n\tActual : %lld\n\tExpected: %lld\n", message ? message : "Assert", l_ts_lhs, l_ts_rhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ } while(0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_SIGNED_EQ(actual, expected) \
|
|
|
4b6aa8 |
+ TS_ASSERT_SIGNED_OP_MESSAGE(actual, ==, expected, NULL)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_SIGNED_GE(actual, expected) \
|
|
|
4b6aa8 |
+ TS_ASSERT_SIGNED_OP_MESSAGE(actual, >=, expected, NULL)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ * Testing of chars
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_CHAR_OP_MESSAGE(actual, operator, expected, message) \
|
|
|
4b6aa8 |
+ do { \
|
|
|
4b6aa8 |
+ char l_ts_lhs = (actual); \
|
|
|
4b6aa8 |
+ char l_ts_rhs = (expected); \
|
|
|
4b6aa8 |
+ if (l_ts_lhs operator l_ts_rhs) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#actual" "#operator" "#expected")\n\tActual : %c\n", message ? message : "Assert", l_ts_lhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" "#operator" "#expected")\n\tActual : %c\n\tExpected: %c\n", message ? message : "Assert", l_ts_lhs, l_ts_rhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ } while(0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_CHAR_EQ_MESSAGE(actual, expected, message) \
|
|
|
4b6aa8 |
+ TS_ASSERT_CHAR_OP_MESSAGE(actual, ==, expected, message)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_CHAR_EQ(actual, expected) \
|
|
|
4b6aa8 |
+ TS_ASSERT_CHAR_EQ_MESSAGE(actual, ==, expected, NULL)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ * Testing of strings
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_STRING_EQ(actual, expected, message) \
|
|
|
4b6aa8 |
+ do { \
|
|
|
4b6aa8 |
+ const char *l_ts_lhs = (actual); \
|
|
|
4b6aa8 |
+ const char *l_ts_rhs = (expected); \
|
|
|
4b6aa8 |
+ if (l_ts_lhs == NULL && l_ts_rhs != NULL) { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" == "#expected")\n\tActual : NULL\n\tExpected: %p\n", message ? message : "Assert", l_ts_rhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else if (l_ts_lhs != NULL && l_ts_rhs == NULL) { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" == "#expected")\n\tActual : %s\n\tExpected: NULL\n", message ? message : "Assert", l_ts_lhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else if ((l_ts_rhs == NULL && l_ts_rhs == NULL)) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#actual" == "#expected")\n\tActual : NULL\n", message ? message : "Assert"); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else if (strcmp(l_ts_lhs, l_ts_rhs) == 0) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#actual" == "#expected")\n\tActual : %s\n", message ? message : "Assert", l_ts_lhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" == "#expected")\n\tActual : %s\n\tExpected: %s\n", message ? message : "Assert", l_ts_lhs, l_ts_rhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ } while(0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_STRING_BEGINS_WITH(actual, prefix, message) \
|
|
|
4b6aa8 |
+ do { \
|
|
|
4b6aa8 |
+ const char *l_ts_lhs = (actual); \
|
|
|
4b6aa8 |
+ const char *l_ts_rhs = (prefix); \
|
|
|
4b6aa8 |
+ if (l_ts_lhs == NULL && l_ts_rhs != NULL) { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" begins with "#prefix")\n\tActual : NULL\n\tExpected: %p\n", message ? message : "Assert", l_ts_rhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else if (l_ts_lhs != NULL && l_ts_rhs == NULL) { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" begins with "#prefix")\n\tActual : %s\n\tExpected: NULL\n", message ? message : "Assert", l_ts_lhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else if ((l_ts_rhs == NULL && l_ts_rhs == NULL)) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#actual" begins with "#prefix")\n\tActual : NULL\n", message ? message : "Assert"); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else if (strncmp(l_ts_lhs, l_ts_rhs, strlen(l_ts_rhs)) == 0) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#actual" begins with "#prefix")\n\tActual : %s\n", message ? message : "Assert", l_ts_lhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" begins with "#prefix")\n\tActual : %s\n\tExpected: %s\n", message ? message : "Assert", l_ts_lhs, l_ts_rhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ } while(0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_STRING_NULL_OR_EMPTY(actual, message) \
|
|
|
4b6aa8 |
+ do { \
|
|
|
4b6aa8 |
+ const char *l_ts_lhs = (actual); \
|
|
|
4b6aa8 |
+ if (l_ts_lhs != NULL && l_ts_lhs[0] != '\0') { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" is NULL or empty)\n\tActual : %s\n", message ? message : "Assert", l_ts_lhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else if ((l_ts_lhs != NULL && l_ts_lhs[0] == '\0')) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#actual" is NULL or empty)\n\tActual : is empty\n", message ? message : "Assert"); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else if (l_ts_lhs == NULL) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#actual" is NULL or empty)\n\tActual : is NULL\n", message ? message : "Assert"); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else { \
|
|
|
4b6aa8 |
+ TS_PRINTF("%s", "Invalid conditions in TS_ASSERT_STRING_NULL_OR_EMPTY"); \
|
|
|
4b6aa8 |
+ abort(); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ } while(0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ * Testing of pointers
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_PTR_OP_MESSAGE(actual, operator, expected, message) \
|
|
|
4b6aa8 |
+ do { \
|
|
|
4b6aa8 |
+ const void *l_ts_lhs = (actual); \
|
|
|
4b6aa8 |
+ const void *l_ts_rhs = (expected); \
|
|
|
4b6aa8 |
+ if (l_ts_lhs operator l_ts_rhs) { \
|
|
|
4b6aa8 |
+ TS_SUCCESS("%s ("#actual" "#operator" "#expected")\n\tActual : %p\n", message ? message : "Assert", l_ts_lhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ else { \
|
|
|
4b6aa8 |
+ TS_FAILURE("%s ("#actual" "#operator" "#expected")\n\tActual : %p\n\tExpected: %p\n", message ? message : "Assert", l_ts_lhs, l_ts_rhs); \
|
|
|
4b6aa8 |
+ } \
|
|
|
4b6aa8 |
+ } while(0)
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_PTR_IS_NULL_MESSAGE(actual, message) \
|
|
|
4b6aa8 |
+ TS_ASSERT_PTR_OP_MESSAGE(actual, ==, NULL, message);
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_PTR_IS_NULL(actual) \
|
|
|
4b6aa8 |
+ TS_ASSERT_PTR_IS_NULL_MESSAGE(actual, NULL);
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_PTR_IS_NOT_NULL_MESSAGE(actual, message) \
|
|
|
4b6aa8 |
+ TS_ASSERT_PTR_OP_MESSAGE(actual, !=, NULL, message);
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_PTR_IS_NOT_NULL(actual) \
|
|
|
4b6aa8 |
+ TS_ASSERT_PTR_IS_NOT_NULL_MESSAGE(actual, NULL);
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#define TS_ASSERT_PTR_EQ(actual, expected) \
|
|
|
4b6aa8 |
+ TS_ASSERT_PTR_OP_MESSAGE(actual, ==, expected, NULL);
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#endif/*LIBREPORT_TESTSUITE_H*/
|
|
|
4b6aa8 |
diff --git a/tests/helpers/testsuite_tools.h b/tests/helpers/testsuite_tools.h
|
|
|
4b6aa8 |
new file mode 100644
|
|
|
4b6aa8 |
index 0000000..ed3a557
|
|
|
4b6aa8 |
--- /dev/null
|
|
|
4b6aa8 |
+++ b/tests/helpers/testsuite_tools.h
|
|
|
4b6aa8 |
@@ -0,0 +1,67 @@
|
|
|
4b6aa8 |
+/*
|
|
|
4b6aa8 |
+ Copyright (C) 2015 ABRT team <crash-catcher@lists.fedorahosted.org>
|
|
|
4b6aa8 |
+ Copyright (C) 2015 RedHat inc.
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ This program is free software; you can redistribute it and/or modify
|
|
|
4b6aa8 |
+ it under the terms of the GNU General Public License as published by
|
|
|
4b6aa8 |
+ the Free Software Foundation; either version 2 of the License, or
|
|
|
4b6aa8 |
+ (at your option) any later version.
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ This program is distributed in the hope that it will be useful,
|
|
|
4b6aa8 |
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
4b6aa8 |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
4b6aa8 |
+ GNU General Public License for more details.
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ You should have received a copy of the GNU General Public License along
|
|
|
4b6aa8 |
+ with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
4b6aa8 |
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ ----
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ Helper functions
|
|
|
4b6aa8 |
+*/
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+#include "testsuite.h"
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/* Creates a new dump directory in a new temporary directory
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+static struct dump_dir *testsuite_dump_dir_create(uid_t uid, mode_t mode, int ts_flags)
|
|
|
4b6aa8 |
+{
|
|
|
4b6aa8 |
+ char dump_dir_name[] = "/tmp/XXXXXX/dump_dir";
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ char *last_slash = strrchr(dump_dir_name, '/');
|
|
|
4b6aa8 |
+ *last_slash = '\0';
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ if (mkdtemp(dump_dir_name) == NULL) {
|
|
|
4b6aa8 |
+ perror("mkdtemp()");
|
|
|
4b6aa8 |
+ abort();
|
|
|
4b6aa8 |
+ }
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ fprintf(stdout, "Test temp directory: %s\n", dump_dir_name);
|
|
|
4b6aa8 |
+ fflush(stdout);
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ *last_slash = '/';
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ struct dump_dir *dd = dd_create(dump_dir_name, uid, mode == (mode_t)-1 ? 0640 : mode);
|
|
|
4b6aa8 |
+ assert(dd != NULL);
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ return dd;
|
|
|
4b6aa8 |
+}
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+/* Removes the dump directory in and the temporary directory
|
|
|
4b6aa8 |
+ *
|
|
|
4b6aa8 |
+ * See testsuite_dump_dir_create()
|
|
|
4b6aa8 |
+ */
|
|
|
4b6aa8 |
+static void testsuite_dump_dir_delete(struct dump_dir *dd)
|
|
|
4b6aa8 |
+{
|
|
|
4b6aa8 |
+ char *tmp_dir = xstrndup(dd->dd_dirname, strrchr(dd->dd_dirname, '/') - dd->dd_dirname);
|
|
|
4b6aa8 |
+ assert(dd_delete(dd) == 0);
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ if(rmdir(tmp_dir) != 0)
|
|
|
4b6aa8 |
+ {
|
|
|
4b6aa8 |
+ perror("rmdir()");
|
|
|
4b6aa8 |
+ abort();
|
|
|
4b6aa8 |
+ }
|
|
|
4b6aa8 |
+
|
|
|
4b6aa8 |
+ free(tmp_dir);
|
|
|
4b6aa8 |
+}
|
|
|
4b6aa8 |
--
|
|
|
4b6aa8 |
1.8.3.1
|
|
|
4b6aa8 |
|