Re: [lttng-dev] [PATCH lttng-tools v2] Test for select, poll and epoll syscall overrides

2016-05-12 Thread Mathieu Desnoyers
- On May 12, 2016, at 2:08 PM, Julien Desfossez jdesfos...@efficios.com 
wrote:

> This test for root_regression checks if the syscall overrides for
> select, pselect6, poll, ppoll, epoll_ctl, epoll_wait and epoll_pwait
> work as expected on arm and x86 (32 and 64-bit).
> 
> There are 11 test cases that check for normal and abnormal behaviour. If
> the test system has the Babeltrace python bindings, the test validates
> the content of the events, otherwise only the presence of the generated
> events is checked.
> 
> We also check if kernel OOPS, WARNING or BUG were generated during the
> test.
> 
> Signed-off-by: Julien Desfossez 
> ---
> tests/regression/kernel/Makefile.am|   7 +-
> tests/regression/kernel/select_poll_epoll.c| 901 +
> tests/regression/kernel/test_select_poll_epoll | 420 ++
> .../kernel/validate_select_poll_epoll.py   | 783 ++
> tests/root_regression  |   1 +
> 5 files changed, 2111 insertions(+), 1 deletion(-)
> create mode 100644 tests/regression/kernel/select_poll_epoll.c
> create mode 100755 tests/regression/kernel/test_select_poll_epoll
> create mode 100755 tests/regression/kernel/validate_select_poll_epoll.py
> 
> diff --git a/tests/regression/kernel/Makefile.am
> b/tests/regression/kernel/Makefile.am
> index 36ff6ee..023c4c6 100644
> --- a/tests/regression/kernel/Makefile.am
> +++ b/tests/regression/kernel/Makefile.am
> @@ -1,4 +1,9 @@
> -EXTRA_DIST = test_event_basic test_all_events test_syscall
> +noinst_PROGRAMS = select_poll_epoll
> +select_poll_epoll_SOURCES = select_poll_epoll.c
> +select_poll_epoll_LDADD = -lpthread -lpopt
> +select_poll_epoll_CFLAGS = -fno-stack-protector -D_FORTIFY_SOURCE=0
> +
> +EXTRA_DIST = test_event_basic test_all_events test_syscall
> test_select_poll_epoll
> 
> all-local:
>   @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
> diff --git a/tests/regression/kernel/select_poll_epoll.c
> b/tests/regression/kernel/select_poll_epoll.c
> new file mode 100644
> index 000..2efeea2
> --- /dev/null
> +++ b/tests/regression/kernel/select_poll_epoll.c
> @@ -0,0 +1,901 @@
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define BUF_SIZE 256
> +#define NB_FD 1
> +#define MAX_FDS 2047
> +#define NR_ITER 1000 /* for stress-tests */
> +
> +#define MIN_NR_FDS 5 /* the minimum number of open FDs required for the test 
> to
> run */
> +#define BIG_SELECT_FD 1022
> +
> +#define MSEC_PER_USEC 1000
> +#define MSEC_PER_NSEC MSEC_PER_USEC * 1000

Missing () around define target.

> +
> +static int timeout; /* seconds, -1 to disable */
> +static int stop_thread;
> +static int wait_fd;
> +
> +struct ppoll_thread_data {
> + struct pollfd *ufds;
> + int value;
> +};
> +
> +void test_select_big(void)
> +{
> + fd_set rfds, wfds, exfds;
> + struct timeval tv;
> + int ret;
> + int fd2;
> + char buf[BUF_SIZE];
> +
> + FD_ZERO();
> + FD_ZERO();
> + FD_ZERO();
> +
> + fd2 = dup2(wait_fd, BIG_SELECT_FD);

test fd2 for error ?

> + FD_SET(fd2, );
> +
> + tv.tv_sec = 0;
> + tv.tv_usec = timeout * MSEC_PER_USEC;
> +
> + if (timeout > 0) {
> + ret = select(fd2 + 1, , , , );
> + } else {
> + ret = select(fd2 + 1, , , , NULL);
> + }
> +
> + if (ret == -1) {
> + perror("select()");
> + } else if (ret) {
> + printf("# [select] data available\n");
> + ret = read(wait_fd, buf, BUF_SIZE);
> + if (ret < 0) {
> + perror("[select] read");
> + }
> + } else {
> + printf("# [select] timeout\n");
> + }
> +
> + ret = close(BIG_SELECT_FD);
> + if (ret)
> + perror("close");
> +}
> +
> +void test_pselect(void)
> +{
> + fd_set rfds;
> + struct timespec tv;
> + int ret;
> + char buf[BUF_SIZE];
> +
> + FD_ZERO();
> + FD_SET(wait_fd, );
> +
> + tv.tv_sec = 0;
> + tv.tv_nsec = timeout * MSEC_PER_NSEC;
> +
> + if (timeout > 0) {
> + ret = pselect(1, , NULL, NULL, , NULL);
> + } else {
> + ret = pselect(1, , NULL, NULL, NULL, NULL);
> + }
> +
> + if (ret == -1) {
> + perror("pselect()");
> + } else if (ret) {
> + printf("# [pselect] data available\n");
> + ret = read(wait_fd, buf, BUF_SIZE);
> + if (ret < 0) {
> + perror("[pselect] read");
> + }
> + } else {
> + printf("# [pselect] timeout\n");
> + }
> +
> +}
> +
> +void test_select(void)
> +{
> + fd_set rfds;
> + struct timeval tv;
> + int ret;
> + char buf[BUF_SIZE];
> +
> + FD_ZERO();
> + 

[lttng-dev] [PATCH lttng-tools v2] Test for select, poll and epoll syscall overrides

2016-05-12 Thread Julien Desfossez
This test for root_regression checks if the syscall overrides for
select, pselect6, poll, ppoll, epoll_ctl, epoll_wait and epoll_pwait
work as expected on arm and x86 (32 and 64-bit).

There are 11 test cases that check for normal and abnormal behaviour. If
the test system has the Babeltrace python bindings, the test validates
the content of the events, otherwise only the presence of the generated
events is checked.

We also check if kernel OOPS, WARNING or BUG were generated during the
test.

Signed-off-by: Julien Desfossez 
---
 tests/regression/kernel/Makefile.am|   7 +-
 tests/regression/kernel/select_poll_epoll.c| 901 +
 tests/regression/kernel/test_select_poll_epoll | 420 ++
 .../kernel/validate_select_poll_epoll.py   | 783 ++
 tests/root_regression  |   1 +
 5 files changed, 2111 insertions(+), 1 deletion(-)
 create mode 100644 tests/regression/kernel/select_poll_epoll.c
 create mode 100755 tests/regression/kernel/test_select_poll_epoll
 create mode 100755 tests/regression/kernel/validate_select_poll_epoll.py

diff --git a/tests/regression/kernel/Makefile.am 
b/tests/regression/kernel/Makefile.am
index 36ff6ee..023c4c6 100644
--- a/tests/regression/kernel/Makefile.am
+++ b/tests/regression/kernel/Makefile.am
@@ -1,4 +1,9 @@
-EXTRA_DIST = test_event_basic test_all_events test_syscall
+noinst_PROGRAMS = select_poll_epoll
+select_poll_epoll_SOURCES = select_poll_epoll.c
+select_poll_epoll_LDADD = -lpthread -lpopt
+select_poll_epoll_CFLAGS = -fno-stack-protector -D_FORTIFY_SOURCE=0
+
+EXTRA_DIST = test_event_basic test_all_events test_syscall 
test_select_poll_epoll
 
 all-local:
@if [ x"$(srcdir)" != x"$(builddir)" ]; then \
diff --git a/tests/regression/kernel/select_poll_epoll.c 
b/tests/regression/kernel/select_poll_epoll.c
new file mode 100644
index 000..2efeea2
--- /dev/null
+++ b/tests/regression/kernel/select_poll_epoll.c
@@ -0,0 +1,901 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define BUF_SIZE 256
+#define NB_FD 1
+#define MAX_FDS 2047
+#define NR_ITER 1000 /* for stress-tests */
+
+#define MIN_NR_FDS 5 /* the minimum number of open FDs required for the test 
to run */
+#define BIG_SELECT_FD 1022
+
+#define MSEC_PER_USEC 1000
+#define MSEC_PER_NSEC MSEC_PER_USEC * 1000
+
+static int timeout; /* seconds, -1 to disable */
+static int stop_thread;
+static int wait_fd;
+
+struct ppoll_thread_data {
+   struct pollfd *ufds;
+   int value;
+};
+
+void test_select_big(void)
+{
+   fd_set rfds, wfds, exfds;
+   struct timeval tv;
+   int ret;
+   int fd2;
+   char buf[BUF_SIZE];
+
+   FD_ZERO();
+   FD_ZERO();
+   FD_ZERO();
+
+   fd2 = dup2(wait_fd, BIG_SELECT_FD);
+   FD_SET(fd2, );
+
+   tv.tv_sec = 0;
+   tv.tv_usec = timeout * MSEC_PER_USEC;
+
+   if (timeout > 0) {
+   ret = select(fd2 + 1, , , , );
+   } else {
+   ret = select(fd2 + 1, , , , NULL);
+   }
+
+   if (ret == -1) {
+   perror("select()");
+   } else if (ret) {
+   printf("# [select] data available\n");
+   ret = read(wait_fd, buf, BUF_SIZE);
+   if (ret < 0) {
+   perror("[select] read");
+   }
+   } else {
+   printf("# [select] timeout\n");
+   }
+
+   ret = close(BIG_SELECT_FD);
+   if (ret)
+   perror("close");
+}
+
+void test_pselect(void)
+{
+   fd_set rfds;
+   struct timespec tv;
+   int ret;
+   char buf[BUF_SIZE];
+
+   FD_ZERO();
+   FD_SET(wait_fd, );
+
+   tv.tv_sec = 0;
+   tv.tv_nsec = timeout * MSEC_PER_NSEC;
+
+   if (timeout > 0) {
+   ret = pselect(1, , NULL, NULL, , NULL);
+   } else {
+   ret = pselect(1, , NULL, NULL, NULL, NULL);
+   }
+
+   if (ret == -1) {
+   perror("pselect()");
+   } else if (ret) {
+   printf("# [pselect] data available\n");
+   ret = read(wait_fd, buf, BUF_SIZE);
+   if (ret < 0) {
+   perror("[pselect] read");
+   }
+   } else {
+   printf("# [pselect] timeout\n");
+   }
+
+}
+
+void test_select(void)
+{
+   fd_set rfds;
+   struct timeval tv;
+   int ret;
+   char buf[BUF_SIZE];
+
+   FD_ZERO();
+   FD_SET(wait_fd, );
+
+   tv.tv_sec = 0;
+   tv.tv_usec = timeout * MSEC_PER_USEC;
+
+   if (timeout > 0) {
+   ret = select(1, , NULL, NULL, );
+   } else {
+   ret = select(1, , NULL, NULL, NULL);
+   }
+
+   if (ret == -1) {
+   perror("select()");
+   } else if (ret) {
+