blob: c78c1e54d5c8beaebd3e6d60e6a1bd794888c5f5 [file] [log] [blame]
#include <utest/utest.h>
#include <pthread.h>
TEST_SUITE("SIGNALS");
/* <--- Begin definition of test cases ---> */
bool test_sigmask(void)
{
int count = 0;
pthread_t sigphandle;
void *thread_handler(void *arg)
{
sigset_t s;
sigemptyset(&s);
sigaddset(&s, SIGUSR2);
pthread_sigmask(SIG_BLOCK, &s, NULL);
for (int i=0; i<100000; i++)
pthread_yield();
return 0;
}
void signal_handler(int signo)
{
sigphandle = pthread_self();
__sync_fetch_and_add(&count, 1);
}
struct sigaction sigact = {.sa_handler = signal_handler, 0};
sigaction(SIGUSR1, &sigact, 0);
sigaction(SIGUSR2, &sigact, 0);
pthread_t phandle;
pthread_create(&phandle, NULL, thread_handler, NULL);
for (int i=0; i<100; i++)
pthread_yield();
pthread_kill(phandle, SIGUSR1);
pthread_kill(phandle, SIGUSR2);
pthread_join(phandle, NULL);
UT_ASSERT_M("Should only receive one signal", count == 1);
UT_ASSERT_M("Signal handler run on wrong thread", sigphandle ==
phandle);
return true;
}
/* <--- End definition of test cases ---> */
struct utest utests[] = {
UTEST_REG(sigmask),
};
int num_utests = sizeof(utests) / sizeof(struct utest);
int main(int argc, char *argv[]) {
char **whitelist = &argv[1];
int whitelist_len = argc - 1;
RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len);
}