Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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