Skip to content

Commit

Permalink
Test signals (#140)
Browse files Browse the repository at this point in the history
* Add a basic testcase for emulated signals.

* Add a testcase for raise(SIGABRT).

* Fix style.

* Actually use all of the C-standard-required signals.

* Update expected stderr.

* Use the right version of this test file.

Co-authored-by: Pat Hickey <[email protected]>
  • Loading branch information
sunfishcode and pchickey authored Jun 3, 2020
1 parent de17ec5 commit ceabbfe
Show file tree
Hide file tree
Showing 9 changed files with 112 additions and 0 deletions.
10 changes: 10 additions & 0 deletions tests/general/sigabrt.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
fprintf(stderr, "raising SIGABRT...\n");
raise(SIGABRT);
fprintf(stderr, "oops!\n");
return EXIT_FAILURE;
}
1 change: 1 addition & 0 deletions tests/general/sigabrt.c.exit_status.expected
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
134
1 change: 1 addition & 0 deletions tests/general/sigabrt.c.options
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal
8 changes: 8 additions & 0 deletions tests/general/sigabrt.c.stderr.expected
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
raising SIGABRT...
Program recieved fatal signal: Aborted
Error: failed to run main module `sigabrt.c.---.wasm`

Caused by:
0: failed to invoke `_start`
1: wasm trap: unreachable, source location: @----
wasm backtrace:
7 changes: 7 additions & 0 deletions tests/general/sigabrt.c.stderr.expected.filter
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash
set -euo pipefail

cat \
| sed -e 's/main module `sigabrt\.c\.[^`]*\.wasm`/main module `sigabrt.c.---.wasm`/' \
| sed -e 's/source location: @[[:xdigit:]]*$/source location: @----/' \
| head -n 6
79 changes: 79 additions & 0 deletions tests/general/signals.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#include <signal.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

// Make sure this exists.
#include <sys/signal.h>

volatile sig_atomic_t flag = 0;

static void handler(int n) {
// This is undefined behavior by the spec, but this is just a testcase.
fflush(stdout);
printf("handler for signal %s\n", strsignal(n));
fflush(stdout);
flag = 1;
}

int main(void) {
// Test various raise cases that don't abort.
assert(raise(SIGCHLD) == 0);
#ifdef SIGCLD
assert(raise(SIGCLD) == 0);
#endif
assert(raise(SIGURG) == 0);
assert(raise(SIGWINCH) == 0);

errno = 0;
assert(raise(_NSIG) == -1 && errno == EINVAL);

// Test psignal.
psignal(SIGINT, "psignal message for SIGINT");

// Test strsignal.
printf("strsignal for SIGHUP: '%s'\n", strsignal(SIGHUP));

// Some signals can't be ignored.
errno = 0;
assert(signal(SIGKILL, SIG_IGN) == SIG_ERR && errno == EINVAL);
errno = 0;
assert(signal(SIGSTOP, SIG_IGN) == SIG_ERR && errno == EINVAL);

// Test that all the C-standard-required signals can be
// ignored with `SIG_IGN`.
int some_fatal_sigs[] = {
SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM
};
for (size_t i = 0;
i < sizeof(some_fatal_sigs) / sizeof(some_fatal_sigs[0]);
++i)
{
int sig = some_fatal_sigs[i];
assert(signal(sig, SIG_IGN) == SIG_DFL);
raise(sig);
assert(signal(sig, SIG_DFL) == SIG_IGN);
assert(signal(sig, SIG_DFL) == SIG_DFL);
}

// Install a handler and invoke it.
printf("beginning handler test:\n");
assert(signal(SIGWINCH, handler) == SIG_DFL);
fflush(stdout);
assert(raise(SIGWINCH) == 0);
fflush(stdout);
assert(flag == 1);
printf("finished handler test\n");

// Check various API invariants.
assert(signal(SIGWINCH, SIG_IGN) == handler);
assert(raise(SIGWINCH) == 0);
assert(signal(SIGWINCH, SIG_DFL) == SIG_IGN);
assert(raise(SIGWINCH) == 0);
assert(signal(SIGWINCH, SIG_DFL) == SIG_DFL);
assert(raise(SIGWINCH) == 0);

return EXIT_SUCCESS;
}
1 change: 1 addition & 0 deletions tests/general/signals.c.options
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal
1 change: 1 addition & 0 deletions tests/general/signals.c.stderr.expected
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
psignal message for SIGINT: Interrupt
4 changes: 4 additions & 0 deletions tests/general/signals.c.stdout.expected
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
strsignal for SIGHUP: 'Hangup'
beginning handler test:
handler for signal Window changed
finished handler test

0 comments on commit ceabbfe

Please sign in to comment.