[LTP] [PATCH v1] syscalls/rt_sigqueueinfo01: rewrote testcase

Sumit Garg sumit.garg@linaro.org
Thu Apr 25 09:58:11 CEST 2019


On Thu, 25 Apr 2019 at 13:08, Christian Amann <camann@suse.com> wrote:
>
> The previous implementation only tested if the syscall can
> be called at all. Now it also checks if the correct signal
> and data is sent and received.
>

Thanks Christian for these changes.

> Also, this patch adds testing for the very similar
> rt_tgsigqueueinfo() syscall.
>

There are already testcases for rt_tgsigqueueinfo() syscall here
(testcases/kernel/syscalls/rt_tgsigqueueinfo/rt_tgsigqueueinfo01.c).
It does adds similar testcase as in this patch with two additional
cases as follows:

 * - Sender of signal along with data is different thread.
 * - Sender and receiver of signal along with data is the same thread.

-Sumit

> Signed-off-by: Christian Amann <camann@suse.com>
> ---
>  testcases/kernel/syscalls/rt_sigqueueinfo/Makefile |   2 +
>  .../syscalls/rt_sigqueueinfo/rt_sigqueueinfo.h     |  42 +++++
>  .../syscalls/rt_sigqueueinfo/rt_sigqueueinfo01.c   | 197 ++++++++++++---------
>  3 files changed, 154 insertions(+), 87 deletions(-)
>  create mode 100644 testcases/kernel/syscalls/rt_sigqueueinfo/rt_sigqueueinfo.h
>
> diff --git a/testcases/kernel/syscalls/rt_sigqueueinfo/Makefile b/testcases/kernel/syscalls/rt_sigqueueinfo/Makefile
> index 2ef86f06f..498ba8e31 100644
> --- a/testcases/kernel/syscalls/rt_sigqueueinfo/Makefile
> +++ b/testcases/kernel/syscalls/rt_sigqueueinfo/Makefile
> @@ -21,3 +21,5 @@ top_srcdir            ?= ../../../..
>  include $(top_srcdir)/include/mk/testcases.mk
>
>  include $(top_srcdir)/include/mk/generic_leaf_target.mk
> +
> +rt_sigqueueinfo01: CFLAGS += -pthread
> diff --git a/testcases/kernel/syscalls/rt_sigqueueinfo/rt_sigqueueinfo.h b/testcases/kernel/syscalls/rt_sigqueueinfo/rt_sigqueueinfo.h
> new file mode 100644
> index 000000000..583963b68
> --- /dev/null
> +++ b/testcases/kernel/syscalls/rt_sigqueueinfo/rt_sigqueueinfo.h
> @@ -0,0 +1,42 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2019 SUSE LLC
> + * Author: Christian Amann <camann@suse.com>
> + */
> +
> +#ifdef HAVE_STRUCT_SIGACTION_SA_SIGACTION
> +
> +#ifndef __RT_SIGQUEUEINFO_H__
> +#define __RT_SIGQUEUEINFO_H__
> +
> +#include "lapi/syscalls.h"
> +
> +#define TEST_VARIANTS  2
> +
> +#define gettid() syscall(SYS_gettid)
> +
> +static char *get_syscall_name(void)
> +{
> +       switch (tst_variant) {
> +       case 0:
> +               return "rt_sigqueueinfo()";
> +       case 1:
> +               return "rt_tgsigqueueinfo()";
> +       }
> +       return "";
> +}
> +
> +static int sys_sigqueueinfo(pid_t tgid, pid_t tid, int sig, siginfo_t *uinfo)
> +{
> +       switch (tst_variant) {
> +       case 0:
> +               return tst_syscall(__NR_rt_sigqueueinfo, tgid, sig, uinfo);
> +       case 1:
> +               return tst_syscall(__NR_rt_tgsigqueueinfo,
> +                               tgid, tid, sig, uinfo);
> +       }
> +       return -1;
> +}
> +
> +#endif /* __RT_SIGQUEUEINFO_H__ */
> +#endif /* HAVE_STRUCT_SIGACTION_SA_SIGACTION */
> diff --git a/testcases/kernel/syscalls/rt_sigqueueinfo/rt_sigqueueinfo01.c b/testcases/kernel/syscalls/rt_sigqueueinfo/rt_sigqueueinfo01.c
> index 9d0cff96d..2e8d39a21 100644
> --- a/testcases/kernel/syscalls/rt_sigqueueinfo/rt_sigqueueinfo01.c
> +++ b/testcases/kernel/syscalls/rt_sigqueueinfo/rt_sigqueueinfo01.c
> @@ -1,102 +1,125 @@
> -/******************************************************************************/
> -/* Copyright (c) Crackerjack Project., 2007                                   */
> -/*                                                                            */
> -/* This program is free software;  you can redistribute it and/or modify      */
> -/* it under the terms of the GNU General Public License as published by       */
> -/* the Free Software Foundation; either version 2 of the License, or          */
> -/* (at your option) any later version.                                        */
> -/*                                                                            */
> -/* This program is distributed in the hope that it will be useful,            */
> -/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
> -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
> -/* the GNU General Public License for more details.                           */
> -/*                                                                            */
> -/* You should have received a copy of the GNU General Public License          */
> -/* along with this program;  if not, write to the Free Software               */
> -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    */
> -/*                                                                            */
> -/******************************************************************************/
> -/******************************************************************************/
> -/*                                                                            */
> -/* File:        rt_sigqueueinfo01.c                                           */
> -/*                                                                            */
> -/* Description: This tests the rt_sigqueueinfo() syscall.                     */
> -/*             rt_sigqueueinfo() Send signal information to a signal         */
> -/*                                                                           */
> -/* Usage:  <for command-line>                                                 */
> -/* rt_sigqueueinfo01 [-c n] [-e][-i n] [-I x] [-p x] [-t]                     */
> -/*      where,  -c n : Run n copies concurrently.                             */
> -/*              -e   : Turn on errno logging.                                 */
> -/*              -i n : Execute test n times.                                  */
> -/*              -I x : Execute test for x seconds.                            */
> -/*              -P x : Pause for x seconds between iterations.                */
> -/*              -t   : Turn on syscall timing.                                */
> -/*                                                                            */
> -/* Total Tests: 2                                                             */
> -/*                                                                            */
> -/* Test Name:   rt_sigqueueinfo01                                              */
> -/* History:     Porting from Crackerjack to LTP is done by                    */
> -/*              Manas Kumar Nayak maknayak@in.ibm.com>                        */
> -/******************************************************************************/
> -#include <sys/wait.h>
> -#include <stdio.h>
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2019 SUSE LLC
> + * Author: Christian Amann <camann@suse.com>
> + */
> +
> +/*
> + * Description:
> + *
> + * This tests the rt_sigqueueinfo() and rt_tgsigqueueinfo() syscall.
> + *
> + * It does so by creating a thread which registers the corresponding
> + * signal handler. After that the main thread sends a signal and data
> + * to the handler thread. If the correct signal and data is received,
> + * the test is successful.
> + *
> + * Note: For unification reasons the tid is unnecessarily passed when
> + * using the rt_sigqueueinfo() syscall but is ignored.
> + * (See rt_sigqueueinfo.h)
> + */
> +
>  #include <signal.h>
> -#include <err.h>
> -#include <errno.h>
>  #include <stdlib.h>
> -#include <unistd.h>
> -#include <sys/syscall.h>
> -#include <string.h>
> +#include "config.h"
> +#include "tst_test.h"
> +#include "tst_safe_pthread.h"
> +#include "rt_sigqueueinfo.h"
>
> -#include "test.h"
> -#include "lapi/syscalls.h"
> +#ifdef HAVE_STRUCT_SIGACTION_SA_SIGACTION
>
> -char *TCID = "rt_sigqueueinfo01";
> -int testno;
> -int TST_TOTAL = 2;
> -
> -void cleanup(void)
> -{
> +#define SIGNAL SIGUSR1
> +#define DATA   777
>
> -       tst_rmdir();
> +static int thread_chckpnt, main_chckpnt;
> +static struct sigaction *sig_action;
> +static siginfo_t *uinfo;
> +static pid_t pid, tid;
>
> +static void received_signal(int sig, siginfo_t *info, void *ucontext)
> +{
> +       if (!info || !ucontext)
> +               tst_brk(TFAIL, "Signal handling went wrong!");
> +       else if (sig == SIGNAL && info->si_value.sival_int == DATA)
> +               tst_res(TPASS, "Received correct signal and data!");
> +       else
> +               tst_res(TFAIL, "Received wrong signal and/or data!");
>  }
>
> -void setup(void)
> +static void *handle_thread(void *arg)
>  {
> -       TEST_PAUSE;
> -       tst_tmpdir();
> +       int ret;
> +
> +       tid = gettid();
> +
> +       ret = sigaction(SIGNAL, sig_action, NULL);
> +       if (ret) {
> +               tst_res(TBROK, "Failed to set sigaction for handler thread!");
> +               return arg;
> +       }
> +
> +       TST_CHECKPOINT_WAKE(main_chckpnt);
> +       TST_CHECKPOINT_WAIT(thread_chckpnt);
> +       return arg;
>  }
>
> -int main(void)
> +static void verify_sigqueueinfo(void)
>  {
> -       int status;
> -       pid_t pid;
> +       pthread_t thr;
> +
>         pid = getpid();
> -       siginfo_t uinfo;
> -
> -       tst_count = 0;
> -       for (testno = 0; testno < TST_TOTAL; ++testno) {
> -               TEST(pid = fork());
> -               setup();
> -               if (TEST_RETURN < 0)
> -                       tst_brkm(TFAIL | TTERRNO, cleanup, "fork failed");
> -               else if (TEST_RETURN == 0) {
> -                       uinfo.si_errno = 0;
> -                       uinfo.si_code = SI_QUEUE;
> -                       TEST(ltp_syscall(__NR_rt_sigqueueinfo, getpid(),
> -                               SIGCHLD, &uinfo));
> -                       if (TEST_RETURN != 0)
> -                               err(1, "rt_sigqueueinfo");
> -                       exit(0);
> -               } else {
> -                       wait(&status);
> -                       if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
> -                               tst_resm(TPASS, "Test Succeeded");
> -                       else
> -                               tst_resm(TFAIL, "Test Failed");
> -               }
> -               cleanup();
> +       SAFE_PTHREAD_CREATE(&thr, NULL, handle_thread, NULL);
> +
> +       TST_CHECKPOINT_WAIT(main_chckpnt);
> +
> +       TEST(sys_sigqueueinfo(pid, tid, SIGNAL, uinfo));
> +       if (TST_RET != 0) {
> +               tst_res(TFAIL, "%s failed with %s.", get_syscall_name(),
> +                               tst_strerrno(TST_ERR));
> +               return;
>         }
> -       tst_exit();
> +
> +       TST_CHECKPOINT_WAKE(thread_chckpnt);
> +       SAFE_PTHREAD_JOIN(thr, NULL);
> +
> +       tst_res(TPASS, "%s was successful!", get_syscall_name());
>  }
> +
> +static void setup(void)
> +{
> +       tst_res(TINFO, "Testing %s.", get_syscall_name());
> +
> +       sig_action = SAFE_MALLOC(sizeof(struct sigaction));
> +
> +       memset(sig_action, 0, sizeof(*sig_action));
> +       sig_action->sa_sigaction = received_signal;
> +       sig_action->sa_flags = SA_SIGINFO;
> +
> +       uinfo = SAFE_MALLOC(sizeof(siginfo_t));
> +
> +       memset(uinfo, 0, sizeof(*uinfo));
> +       uinfo->si_code = SI_QUEUE;
> +       uinfo->si_pid = pid;
> +       uinfo->si_uid = getuid();
> +       uinfo->si_value.sival_int = DATA;
> +}
> +
> +static void cleanup(void)
> +{
> +       free(uinfo);
> +       free(sig_action);
> +}
> +
> +static struct tst_test test = {
> +       .test_all = verify_sigqueueinfo,
> +       .setup = setup,
> +       .cleanup = cleanup,
> +       .test_variants = TEST_VARIANTS,
> +       .needs_checkpoints = 1,
> +       .timeout = 20,
> +};
> +
> +#else
> +       TST_TEST_TCONF(
> +               "This system does not support rt_{tg}sigqueueinfo().");
> +#endif /* HAVE_STRUCT_SIGACTION_SA_SIGACTION */
> --
> 2.16.4
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp


More information about the ltp mailing list