* [LTP] [PATCH 1/2] Add TST_ASSERT_SYSCALL*() macros
@ 2020-03-05 14:36 Martin Doucha
2020-03-05 14:36 ` [LTP] [PATCH 2/2] Reimplement TST_SAFE_TIMERFD_*() using TST_ASSERT_SYSCALL*() Martin Doucha
2020-03-05 14:46 ` [LTP] [PATCH 1/2] Add TST_ASSERT_SYSCALL*() macros Cyril Hrubis
0 siblings, 2 replies; 3+ messages in thread
From: Martin Doucha @ 2020-03-05 14:36 UTC (permalink / raw)
To: ltp
These macros take care of the standard return value checking boilerplate
in cases where the test cannot continue after error.
- TST_ASSERT_SYSCALL() calls tst_brk() if retval != 0
- TST_ASSERT_SYSCALL_FD() calls tst_brk() if retval < 0
Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
Small convenience patch that'll simplify both test development and TST_SAFE_*()
library function generation.
include/tst_test.h | 47 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/include/tst_test.h b/include/tst_test.h
index 8508c2e38..65a5f05b8 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -281,6 +281,53 @@ extern void *TST_RET_PTR;
TST_ERR = errno; \
} while (0)
+/* assert that syscall returned only 0 and nothing else */
+#define TST_ASSERT_SYSCALL(SCALL) \
+ TST_ASSERT_SYSCALL_IMPL(SCALL, __FILE__, __LINE__)
+
+#define TST_ASSERT_SYSCALL_IMPL(SCALL, FILENAME, LINENO) \
+ ({ \
+ int _tst_ret; \
+ errno = 0; \
+ _tst_ret = SCALL; \
+ if (_tst_ret == -1) { \
+ int _tst_ttype = errno == ENOTSUP ? TCONF : TBROK; \
+ tst_brk(_tst_ttype | TERRNO, "%s:%d " # SCALL \
+ " failed", FILENAME, LINENO); \
+ } \
+ if (_tst_ret != 0) { \
+ tst_brk(TBROK | TERRNO, "%s:%d " # SCALL \
+ " returned invalid value %d", FILENAME, \
+ LINENO, _tst_ret); \
+ } \
+ _tst_ret; \
+ })
+
+/*
+ * assert that syscall returned any non-negative value (e.g. valid file
+ * descriptor)
+ */
+#define TST_ASSERT_SYSCALL_FD(SCALL) \
+ TST_ASSERT_SYSCALL_FD_IMPL(SCALL, __FILE__, __LINE__)
+
+#define TST_ASSERT_SYSCALL_FD_IMPL(SCALL, FILENAME, LINENO) \
+ ({ \
+ int _tst_ret; \
+ errno = 0; \
+ _tst_ret = SCALL; \
+ if (_tst_ret == -1) { \
+ int _tst_ttype = errno == ENOTSUP ? TCONF : TBROK; \
+ tst_brk(_tst_ttype | TERRNO, "%s:%d " # SCALL \
+ " failed", FILENAME, LINENO); \
+ } \
+ if (_tst_ret < 0) { \
+ tst_brk(TBROK | TERRNO, "%s:%d " # SCALL \
+ " returned invalid value %d", FILENAME, \
+ LINENO, _tst_ret); \
+ } \
+ _tst_ret; \
+ })
+
/*
* Functions to convert ERRNO to its name and SIGNAL to its name.
*/
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [LTP] [PATCH 2/2] Reimplement TST_SAFE_TIMERFD_*() using TST_ASSERT_SYSCALL*()
2020-03-05 14:36 [LTP] [PATCH 1/2] Add TST_ASSERT_SYSCALL*() macros Martin Doucha
@ 2020-03-05 14:36 ` Martin Doucha
2020-03-05 14:46 ` [LTP] [PATCH 1/2] Add TST_ASSERT_SYSCALL*() macros Cyril Hrubis
1 sibling, 0 replies; 3+ messages in thread
From: Martin Doucha @ 2020-03-05 14:36 UTC (permalink / raw)
To: ltp
Example usage of the TST_ASSERT_SYSCALL*() macros.
Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
lib/tst_safe_timerfd.c | 35 ++++++-----------------------------
1 file changed, 6 insertions(+), 29 deletions(-)
diff --git a/lib/tst_safe_timerfd.c b/lib/tst_safe_timerfd.c
index ffe7b2ef7..18da82184 100644
--- a/lib/tst_safe_timerfd.c
+++ b/lib/tst_safe_timerfd.c
@@ -9,34 +9,18 @@
#define TST_NO_DEFAULT_MAIN
#include "tst_test.h"
-#define TTYPE (errno == ENOTSUP ? TCONF : TBROK)
-
int safe_timerfd_create(const char *file, const int lineno,
int clockid, int flags)
{
- int fd;
-
- fd = timerfd_create(clockid, flags);
- if (fd < 0) {
- tst_brk(TTYPE | TERRNO, "%s:%d timerfd_create(%s) failed",
- file, lineno, tst_clock_name(clockid));
- }
-
- return fd;
+ return TST_ASSERT_SYSCALL_FD_IMPL(timerfd_create(clockid, flags), file,
+ lineno);
}
int safe_timerfd_gettime(const char *file, const int lineno,
int fd, struct itimerspec *curr_value)
{
- int rval;
-
- rval = timerfd_gettime(fd, curr_value);
- if (rval != 0) {
- tst_brk(TTYPE | TERRNO, "%s:%d timerfd_gettime() failed",
- file, lineno);
- }
-
- return rval;
+ return TST_ASSERT_SYSCALL_IMPL(timerfd_gettime(fd, curr_value), file,
+ lineno);
}
int safe_timerfd_settime(const char *file, const int lineno,
@@ -44,13 +28,6 @@ int safe_timerfd_settime(const char *file, const int lineno,
const struct itimerspec *new_value,
struct itimerspec *old_value)
{
- int rval;
-
- rval = timerfd_settime(fd, flags, new_value, old_value);
- if (rval != 0) {
- tst_brk(TTYPE | TERRNO, "%s:%d timerfd_settime() failed",
- file, lineno);
- }
-
- return rval;
+ return TST_ASSERT_SYSCALL_IMPL(timerfd_settime(fd, flags, new_value,
+ old_value), file, lineno);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [LTP] [PATCH 1/2] Add TST_ASSERT_SYSCALL*() macros
2020-03-05 14:36 [LTP] [PATCH 1/2] Add TST_ASSERT_SYSCALL*() macros Martin Doucha
2020-03-05 14:36 ` [LTP] [PATCH 2/2] Reimplement TST_SAFE_TIMERFD_*() using TST_ASSERT_SYSCALL*() Martin Doucha
@ 2020-03-05 14:46 ` Cyril Hrubis
1 sibling, 0 replies; 3+ messages in thread
From: Cyril Hrubis @ 2020-03-05 14:46 UTC (permalink / raw)
To: ltp
Hi!
> +/* assert that syscall returned only 0 and nothing else */
> +#define TST_ASSERT_SYSCALL(SCALL) \
> + TST_ASSERT_SYSCALL_IMPL(SCALL, __FILE__, __LINE__)
> +
> +#define TST_ASSERT_SYSCALL_IMPL(SCALL, FILENAME, LINENO) \
> + ({ \
> + int _tst_ret; \
> + errno = 0; \
> + _tst_ret = SCALL; \
> + if (_tst_ret == -1) { \
> + int _tst_ttype = errno == ENOTSUP ? TCONF : TBROK; \
> + tst_brk(_tst_ttype | TERRNO, "%s:%d " # SCALL \
^
I do not think that is reasonable to
simply stringify the syscall, we are
adding pretty printers for the syscall
parameters and this change is backward.
These two patches are actually removing the pretty printer for the clock
id for the timerfd_create(). I do not like that.
> + " failed", FILENAME, LINENO); \
> + } \
> + if (_tst_ret != 0) { \
> + tst_brk(TBROK | TERRNO, "%s:%d " # SCALL \
> + " returned invalid value %d", FILENAME, \
> + LINENO, _tst_ret); \
> + } \
> + _tst_ret; \
> + })
> +
> +/*
> + * assert that syscall returned any non-negative value (e.g. valid file
> + * descriptor)
> + */
> +#define TST_ASSERT_SYSCALL_FD(SCALL) \
> + TST_ASSERT_SYSCALL_FD_IMPL(SCALL, __FILE__, __LINE__)
> +
> +#define TST_ASSERT_SYSCALL_FD_IMPL(SCALL, FILENAME, LINENO) \
> + ({ \
> + int _tst_ret; \
> + errno = 0; \
> + _tst_ret = SCALL; \
> + if (_tst_ret == -1) { \
> + int _tst_ttype = errno == ENOTSUP ? TCONF : TBROK; \
> + tst_brk(_tst_ttype | TERRNO, "%s:%d " # SCALL \
> + " failed", FILENAME, LINENO); \
> + } \
> + if (_tst_ret < 0) { \
> + tst_brk(TBROK | TERRNO, "%s:%d " # SCALL \
> + " returned invalid value %d", FILENAME, \
> + LINENO, _tst_ret); \
> + } \
> + _tst_ret; \
> + })
> +
> /*
> * Functions to convert ERRNO to its name and SIGNAL to its name.
> */
> --
> 2.25.1
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-03-05 14:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-03-05 14:36 [LTP] [PATCH 1/2] Add TST_ASSERT_SYSCALL*() macros Martin Doucha
2020-03-05 14:36 ` [LTP] [PATCH 2/2] Reimplement TST_SAFE_TIMERFD_*() using TST_ASSERT_SYSCALL*() Martin Doucha
2020-03-05 14:46 ` [LTP] [PATCH 1/2] Add TST_ASSERT_SYSCALL*() macros Cyril Hrubis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox