Tests for module 'sigprocmask'.
authorBruno Haible <bruno@clisp.org>
Thu, 7 Jul 2011 17:52:19 +0000 (19:52 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 7 Jul 2011 17:52:19 +0000 (19:52 +0200)
* modules/sigprocmask-tests: New file.
* tests/test-sigprocmask.c: New file.

ChangeLog
modules/sigprocmask-tests [new file with mode: 0644]
tests/test-sigprocmask.c [new file with mode: 0644]

index ca05f95..e4585e6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2011-07-07  Bruno Haible  <bruno@clisp.org>
 
+       Tests for module 'sigprocmask'.
+       * modules/sigprocmask-tests: New file.
+       * tests/test-sigprocmask.c: New file.
+
+2011-07-07  Bruno Haible  <bruno@clisp.org>
+
        float tests: Tweak.
        * tests/test-float.c (main): Tweak skip message.
 
diff --git a/modules/sigprocmask-tests b/modules/sigprocmask-tests
new file mode 100644 (file)
index 0000000..80fcd81
--- /dev/null
@@ -0,0 +1,13 @@
+Files:
+tests/test-sigprocmask.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+sleep
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sigprocmask
+check_PROGRAMS += test-sigprocmask
diff --git a/tests/test-sigprocmask.c b/tests/test-sigprocmask.c
new file mode 100644 (file)
index 0000000..628c1ab
--- /dev/null
@@ -0,0 +1,96 @@
+/* Test of sigprocmask.
+   Copyright (C) 2011 Free Software Foundation, Inc.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011.  */
+
+#include <config.h>
+
+#include <signal.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (sigprocmask, int, (int, const sigset_t *, sigset_t *));
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+
+static volatile int sigint_occurred;
+
+static void
+sigint_handler (int sig)
+{
+  sigint_occurred++;
+}
+
+int
+main (int argc, char *argv[])
+{
+  sigset_t set;
+  int pid = getpid ();
+  char command[80];
+
+  signal (SIGINT, sigint_handler);
+
+  sigemptyset (&set);
+  sigaddset (&set, SIGINT);
+
+  /* Check error handling.  */
+  ASSERT (sigprocmask (1729, &set, NULL) == -1);
+  ASSERT (errno == EINVAL);
+
+  /* Block SIGINT.  */
+  ASSERT (sigprocmask (SIG_BLOCK, &set, NULL) == 0);
+
+  /* Request a SIGINT signal from outside.  */
+  sprintf (command, "sh -c 'sleep 1; kill -%d %d' &", SIGINT, pid);
+  system (command);
+
+  /* Wait.  */
+  sleep (2);
+
+  /* The signal should not have arrived yet, because it is blocked.  */
+  ASSERT (sigint_occurred == 0);
+
+  /* Unblock SIGINT.  */
+  ASSERT (sigprocmask (SIG_UNBLOCK, &set, NULL) == 0);
+
+  /* The signal should have arrived now, because POSIX says
+       "If there are any pending unblocked signals after the call to
+        sigprocmask(), at least one of those signals shall be delivered
+        before the call to sigprocmask() returns."  */
+  ASSERT (sigint_occurred == 1);
+
+  return 0;
+}
+
+#else
+
+/* On native Windows, getpid() values and the arguments that are passed to
+   the (Cygwin?) 'kill' program are not necessarily related.  */
+
+int
+main ()
+{
+  fputs ("Skipping test: native Windows platform\n", stderr);
+  return 77;
+}
+
+#endif