From 7988979a722b4cdf287b2093956a76a3f19b9897 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Mon, 24 Oct 2016 20:22:12 +0200 Subject: add uClibc-ng test directory --- test/signal/.indent.pro | 33 ++++++++++++++++ test/signal/Makefile | 8 ++++ test/signal/Makefile.in | 6 +++ test/signal/sigchld.c | 68 ++++++++++++++++++++++++++++++++ test/signal/signal.c | 95 +++++++++++++++++++++++++++++++++++++++++++++ test/signal/tst-raise.c | 62 +++++++++++++++++++++++++++++ test/signal/tst-signal.c | 44 +++++++++++++++++++++ test/signal/tst-signalfd.c | 63 ++++++++++++++++++++++++++++++ test/signal/tst-sigset.c | 45 +++++++++++++++++++++ test/signal/tst-sigsimple.c | 56 ++++++++++++++++++++++++++ 10 files changed, 480 insertions(+) create mode 100644 test/signal/.indent.pro create mode 100644 test/signal/Makefile create mode 100644 test/signal/Makefile.in create mode 100644 test/signal/sigchld.c create mode 100644 test/signal/signal.c create mode 100644 test/signal/tst-raise.c create mode 100644 test/signal/tst-signal.c create mode 100644 test/signal/tst-signalfd.c create mode 100644 test/signal/tst-sigset.c create mode 100644 test/signal/tst-sigsimple.c (limited to 'test/signal') diff --git a/test/signal/.indent.pro b/test/signal/.indent.pro new file mode 100644 index 0000000..492ecf1 --- /dev/null +++ b/test/signal/.indent.pro @@ -0,0 +1,33 @@ +--blank-lines-after-declarations +--blank-lines-after-procedures +--break-before-boolean-operator +--no-blank-lines-after-commas +--braces-on-if-line +--braces-on-struct-decl-line +--comment-indentation25 +--declaration-comment-column25 +--no-comment-delimiters-on-blank-lines +--cuddle-else +--continuation-indentation4 +--case-indentation0 +--else-endif-column33 +--space-after-cast +--line-comments-indentation0 +--declaration-indentation1 +--dont-format-first-column-comments +--dont-format-comments +--honour-newlines +--indent-level4 +/* changed from 0 to 4 */ +--parameter-indentation4 +--line-length78 /* changed from 75 */ +--continue-at-parentheses +--no-space-after-function-call-names +--dont-break-procedure-type +--dont-star-comments +--leave-optional-blank-lines +--dont-space-special-semicolon +--tab-size4 +/* additions by Mark */ +--case-brace-indentation0 +--leave-preprocessor-space diff --git a/test/signal/Makefile b/test/signal/Makefile new file mode 100644 index 0000000..c2afb5f --- /dev/null +++ b/test/signal/Makefile @@ -0,0 +1,8 @@ +# uClibc signal tests +# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + +top_builddir=../../ +top_srcdir=../../ +include ../Rules.mak +-include Makefile.in +include ../Test.mak diff --git a/test/signal/Makefile.in b/test/signal/Makefile.in new file mode 100644 index 0000000..c8e2545 --- /dev/null +++ b/test/signal/Makefile.in @@ -0,0 +1,6 @@ +# uClibc signal tests +# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + +ifeq ($(UCLIBC_HAS_OBSOLETE_BSD_SIGNAL),) +TESTS_DISABLED := tst-sigsimple +endif diff --git a/test/signal/sigchld.c b/test/signal/sigchld.c new file mode 100644 index 0000000..22febac --- /dev/null +++ b/test/signal/sigchld.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include +#include + + +#ifdef __ARCH_USE_MMU__ + +static void test_handler(int signo) +{ + write(1, "caught SIGCHLD\n", 15); + return; +} + +int main(void) +{ + pid_t mypid; + struct sigaction siga; + static sigset_t set; + + /* Set up sighandling */ + sigfillset(&set); + siga.sa_handler = test_handler; + siga.sa_mask = set; + siga.sa_flags = 0; + if (sigaction(SIGCHLD, &siga, (struct sigaction *)NULL) != 0) { + fprintf(stderr, "sigaction choked: %s!", strerror(errno)); + exit(EXIT_FAILURE); + } + + /* Setup a child process to exercise the sig handling for us */ + mypid = getpid(); + if (fork() == 0) { + int i; + + for (i=0; i < 3; i++) { + sleep(2); + kill(mypid, SIGCHLD); + } + _exit(EXIT_SUCCESS); + } + + + /* Wait for signals */ + write(1, "waiting for a SIGCHLD\n",22); + for(;;) { + sleep(10); + if (waitpid(-1, NULL, WNOHANG | WUNTRACED) > 0) + break; + write(1, "after sleep\n", 12); + } + + printf("Bye-bye! All done!\n"); + return 0; +} + +#else + +int main(void) +{ + printf("Skipping test on non-mmu host!\n"); + return 0; +} + +#endif diff --git a/test/signal/signal.c b/test/signal/signal.c new file mode 100644 index 0000000..01d1a78 --- /dev/null +++ b/test/signal/signal.c @@ -0,0 +1,95 @@ +/* vi: set sw=4 ts=4: */ +/* + * signal testing function for uClibc + * Copyright (C) 2000-2006 by Erik Andersen + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include + + +/* -------------------------------------------------*/ +/* This stuff is common to all the testing routines */ +/* -------------------------------------------------*/ +const char *it = ""; /* Routine name for message routines. */ +size_t errors = 0; + +static void check(int thing, int number) +{ + if (!thing) { + printf("%s: flunked test %d\n", it, number); + ++errors; + } +} + +#if 0 +static void equal(const char *a, const char *b, int number) +{ + check(a != NULL && b != NULL && (strcmp(a, b) == 0), number); +} +#endif + + +/* -------------------------------------------------*/ +/* Let the tests begin.... */ +/* -------------------------------------------------*/ + +int global_int = 0; + +static void set_global_int_to_one(int signum) +{ + printf ("Received signal %d (%s).\n", signum, strsignal(signum)); + global_int = 1; + return; +} + +static void signal_test_1(void) +{ + global_int = 0; + + it = "global variable set from signal handler"; + if (signal(SIGUSR1, set_global_int_to_one) == SIG_ERR) { + perror("signal(SIGUSR1) failed"); + exit(-1); + } + raise(SIGUSR1); + + /* This should already have jumped to the signal handler */ + check((global_int == 1), 1); + + global_int = 0; + if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) { + perror("signal(SIGUSR1) failed"); + exit(-1); + } + raise(SIGUSR1); + /* This should not go to the signal handler this time since we */ + check((global_int == 0), 1); +} + + +int main(void) +{ + int status; + + signal_test_1(); + + if (errors == 0) { + status = EXIT_SUCCESS; + printf("No errors.\n"); + } else { + status = EXIT_FAILURE; + printf("%lu errors.\n", (unsigned long)errors); + } + exit(status); +} diff --git a/test/signal/tst-raise.c b/test/signal/tst-raise.c new file mode 100644 index 0000000..534ae71 --- /dev/null +++ b/test/signal/tst-raise.c @@ -0,0 +1,62 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek , 2003. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include + +volatile int count; + +static void +sh (int sig) +{ + ++count; +} + +int +main (void) +{ + struct sigaction sa; + sa.sa_handler = sh; + sigemptyset (&sa.sa_mask); + sa.sa_flags = 0; + if (sigaction (SIGUSR1, &sa, NULL) < 0) + { + printf ("sigaction failed: %s\n", strerror(errno)); + exit (1); + } + if (raise (SIGUSR1) < 0) + { + printf ("first raise failed: %s\n", strerror(errno)); + exit (1); + } + if (raise (SIGUSR1) < 0) + { + printf ("second raise failed: %s\n", strerror(errno)); + exit (1); + } + if (count != 2) + { + printf ("signal handler not called 2 times\n"); + exit (1); + } + exit (0); +} diff --git a/test/signal/tst-signal.c b/test/signal/tst-signal.c new file mode 100644 index 0000000..6d31787 --- /dev/null +++ b/test/signal/tst-signal.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +int win = 0; + +static void +handler (int sig) +{ + printf ("Received signal %d (%s).\n", sig, strsignal(sig)); + win = 1; +} + +int +main (void) +{ + if (signal (SIGTERM, handler) == SIG_ERR) + { + perror ("signal: SIGTERM"); + exit (EXIT_FAILURE); + } + + puts ("Set handler."); + + printf ("Sending myself signal %d.\n", SIGTERM); + fflush (stdout); + + if (raise (SIGTERM) < 0) + { + perror ("raise: SIGTERM"); + exit (EXIT_FAILURE); + } + + if (!win) + { + puts ("Didn't get any signal. Test FAILED!"); + exit (EXIT_FAILURE); + } + + puts ("Got a signal. Test succeeded."); + + return EXIT_SUCCESS; +} diff --git a/test/signal/tst-signalfd.c b/test/signal/tst-signalfd.c new file mode 100644 index 0000000..1fbb748 --- /dev/null +++ b/test/signal/tst-signalfd.c @@ -0,0 +1,63 @@ +/* vi: set sw=4 ts=4 sts=4: */ +/* + * signalfd test for uClibc + * Copyright (C) 2012 by Kevin Cernekee + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int +do_test(void) +{ + int fd, ret, result = 0; + struct signalfd_siginfo ssi; + sigset_t mask; + + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + sigprocmask(SIG_BLOCK, &mask, NULL); + + fd = signalfd(-1, &mask, SFD_NONBLOCK); + if (fd < 0) { + printf("signalfd() failed: %s\n", strerror(errno)); + result = 1; + } + + /* this should return immediately with EAGAIN due to SFD_NONBLOCK */ + memset(&ssi, 0, sizeof(ssi)); + ret = read(fd, &ssi, sizeof(ssi)); + if (ret != -1 || errno != EAGAIN) { + error(0, 0, "first read() returned %d", ret); + result = 1; + } + + kill(getpid(), SIGUSR1); + + /* this should return a struct ssi indicating receipt of SIGUSR1 */ + ret = read(fd, &ssi, sizeof(ssi)); + if (ret != sizeof(ssi)) { + error(0, 0, "second read() returned %d", ret); + result = 1; + } + + if (ssi.ssi_signo != SIGUSR1) { + error(0, 0, "ssi contains bogus signo"); + result = 1; + } + + return result; +} + +#define TIMEOUT 5 +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/test/signal/tst-sigset.c b/test/signal/tst-sigset.c new file mode 100644 index 0000000..bc1b057 --- /dev/null +++ b/test/signal/tst-sigset.c @@ -0,0 +1,45 @@ +/* Test sig*set functions. */ + +#include +#include +#include +#include + +#define TEST_FUNCTION do_test () +static int +do_test (void) +{ + int result = 0; + int sig = -1; + +#define TRY(call) \ + if (call) \ + { \ + printf ("%s (sig = %d): %s\n", #call, sig, strerror(errno)); \ + result = 1; \ + } \ + else + + + sigset_t set; + TRY (sigemptyset (&set) != 0); + +#ifdef SIGRTMAX + int max_sig = SIGRTMAX; +#else + int max_sig = NSIG - 1; +#endif + + for (sig = 1; sig <= max_sig; ++sig) + { + TRY (sigismember (&set, sig) != 0); + TRY (sigaddset (&set, sig) != 0); + TRY (sigismember (&set, sig) == 0); + TRY (sigdelset (&set, sig) != 0); + TRY (sigismember (&set, sig) != 0); + } + + return result; +} + +#include "../test-skeleton.c" diff --git a/test/signal/tst-sigsimple.c b/test/signal/tst-sigsimple.c new file mode 100644 index 0000000..80220ee --- /dev/null +++ b/test/signal/tst-sigsimple.c @@ -0,0 +1,56 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2003. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include + + +static int +do_test (void) +{ + int result = 0; + int e; + +#define RUN(test) \ + errno = 0; \ + e = test; \ + if (e != -1) \ + { \ + printf ("%s returned %d\n", #test, e); \ + result = 1; \ + } \ + else if (errno != EINVAL) \ + { \ + printf ("%s didn't set errno to EINVAL (%s instead)\n", \ + #test, strerror (errno)); \ + result = 1; \ + } + + RUN (sighold (-1)); + RUN (sighold (_NSIG + 100)); + + RUN (sigrelse (-1)); + RUN (sigrelse (_NSIG + 100)); + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" -- cgit v1.2.3