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

2016-05-12 Thread Mathieu Desnoyers
- On May 12, 2016, at 12:17 AM, 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| 872 +
> tests/regression/kernel/test_select_poll_epoll | 420 ++
> .../kernel/validate_select_poll_epoll.py   | 783 ++
> tests/root_regression  |   1 +
> 5 files changed, 2082 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..9a46191
> --- /dev/null
> +++ b/tests/regression/kernel/select_poll_epoll.c
> @@ -0,0 +1,872 @@
> +#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 */
> +
> +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()

All functions that take no parameter should be (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, 1022);

There are many hardcoded constants in the code. Please use a define,
or check if there is a standard define already.

> + FD_SET(fd2, );
> +
> + tv.tv_sec = 0;
> + tv.tv_usec = timeout * 1000;

1000 -> MSEC_PER_USEC ...

> +
> + if (timeout > 0)

missing brackets. Needed for tools coding style even for one-liners.

> + 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");
> + }
> +}
> +
> +void test_pselect()
> +{
> + 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 = 1000 * 1000* timeout;

missing space, and hardcoded constants.

> +
> + 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()
> +{
> + 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 * 1000;
> +
> + if (timeout > 0)

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

2016-05-11 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| 872 +
 tests/regression/kernel/test_select_poll_epoll | 420 ++
 .../kernel/validate_select_poll_epoll.py   | 783 ++
 tests/root_regression  |   1 +
 5 files changed, 2082 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..9a46191
--- /dev/null
+++ b/tests/regression/kernel/select_poll_epoll.c
@@ -0,0 +1,872 @@
+#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 */
+
+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()
+{
+   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, 1022);
+   FD_SET(fd2, );
+
+   tv.tv_sec = 0;
+   tv.tv_usec = timeout * 1000;
+
+   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");
+   }
+}
+
+void test_pselect()
+{
+   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 = 1000 * 1000* timeout;
+
+   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()
+{
+   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 * 1000;
+
+   if (timeout > 0)
+   ret = select(1, , NULL, NULL, );
+   else
+   ret = select(1, , NULL, NULL, 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");
+   }
+
+}
+
+void test_poll()
+{
+   struct pollfd ufds[NB_FD];
+   char buf[BUF_SIZE];
+   int ret;
+