|
|
#include "../../unity/unity.h" |
|
|
#include <stdlib.h> |
|
|
#include <string.h> |
|
|
#include <stdio.h> |
|
|
#include <errno.h> |
|
|
#include <unistd.h> |
|
|
#include <sys/types.h> |
|
|
#include <sys/wait.h> |
|
|
#include <signal.h> |
|
|
#include <inttypes.h> |
|
|
#include <limits.h> |
|
|
|
|
|
|
|
|
static void pid_to_str(pid_t pid, char *buf, size_t buflen) { |
|
|
snprintf(buf, buflen, "%jd", (intmax_t)pid); |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void test_send_signals_self_pid_signal0_success(void) { |
|
|
char pidbuf[64]; |
|
|
pid_to_str(getpid(), pidbuf, sizeof(pidbuf)); |
|
|
char *argv[] = { pidbuf, NULL }; |
|
|
|
|
|
int rc = send_signals(0, argv); |
|
|
TEST_ASSERT_EQUAL_INT(EXIT_SUCCESS, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_send_signals_invalid_pid_string_failure(void) { |
|
|
char invalid[] = "abc"; |
|
|
char *argv[] = { invalid, NULL }; |
|
|
|
|
|
int rc = send_signals(0, argv); |
|
|
TEST_ASSERT_EQUAL_INT(EXIT_FAILURE, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_send_signals_empty_string_failure(void) { |
|
|
char empty[] = ""; |
|
|
char *argv[] = { empty, NULL }; |
|
|
|
|
|
int rc = send_signals(0, argv); |
|
|
TEST_ASSERT_EQUAL_INT(EXIT_FAILURE, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_send_signals_trailing_chars_failure(void) { |
|
|
char bad[] = "123abc"; |
|
|
char *argv[] = { bad, NULL }; |
|
|
|
|
|
int rc = send_signals(0, argv); |
|
|
TEST_ASSERT_EQUAL_INT(EXIT_FAILURE, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_send_signals_trailing_space_failure(void) { |
|
|
char bad[] = "123 "; |
|
|
char *argv[] = { bad, NULL }; |
|
|
|
|
|
int rc = send_signals(0, argv); |
|
|
TEST_ASSERT_EQUAL_INT(EXIT_FAILURE, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_send_signals_overflow_pid_failure(void) { |
|
|
char huge[1024]; |
|
|
|
|
|
memset(huge, '9', sizeof(huge)-1); |
|
|
huge[sizeof(huge)-1] = '\0'; |
|
|
char *argv[] = { huge, NULL }; |
|
|
|
|
|
int rc = send_signals(0, argv); |
|
|
TEST_ASSERT_EQUAL_INT(EXIT_FAILURE, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_send_signals_invalid_signal_einval_failure(void) { |
|
|
char pidbuf[64]; |
|
|
pid_to_str(getpid(), pidbuf, sizeof(pidbuf)); |
|
|
char *argv[] = { pidbuf, NULL }; |
|
|
|
|
|
int rc = send_signals(-1, argv); |
|
|
TEST_ASSERT_EQUAL_INT(EXIT_FAILURE, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_send_signals_nonexistent_pid_esrch_failure(void) { |
|
|
pid_t child = fork(); |
|
|
TEST_ASSERT_MESSAGE(child >= 0, "fork() failed unexpectedly"); |
|
|
|
|
|
if (child == 0) { |
|
|
_exit(0); |
|
|
} |
|
|
|
|
|
int status = 0; |
|
|
pid_t w = waitpid(child, &status, 0); |
|
|
TEST_ASSERT_EQUAL_INT_MESSAGE(child, w, "waitpid did not return child pid"); |
|
|
|
|
|
char pidbuf[64]; |
|
|
pid_to_str(child, pidbuf, sizeof(pidbuf)); |
|
|
char *argv[] = { pidbuf, NULL }; |
|
|
|
|
|
int rc = send_signals(0, argv); |
|
|
TEST_ASSERT_EQUAL_INT(EXIT_FAILURE, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_send_signals_mixed_operands_returns_failure(void) { |
|
|
char pidbuf1[64]; |
|
|
pid_to_str(getpid(), pidbuf1, sizeof(pidbuf1)); |
|
|
char bad[] = "notanumber"; |
|
|
char pidbuf2[64]; |
|
|
pid_to_str(getpid(), pidbuf2, sizeof(pidbuf2)); |
|
|
|
|
|
char *argv[] = { pidbuf1, bad, pidbuf2, NULL }; |
|
|
|
|
|
int rc = send_signals(0, argv); |
|
|
TEST_ASSERT_EQUAL_INT(EXIT_FAILURE, rc); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
|
|
|
RUN_TEST(test_send_signals_self_pid_signal0_success); |
|
|
RUN_TEST(test_send_signals_invalid_pid_string_failure); |
|
|
RUN_TEST(test_send_signals_empty_string_failure); |
|
|
RUN_TEST(test_send_signals_trailing_chars_failure); |
|
|
RUN_TEST(test_send_signals_trailing_space_failure); |
|
|
RUN_TEST(test_send_signals_overflow_pid_failure); |
|
|
RUN_TEST(test_send_signals_invalid_signal_einval_failure); |
|
|
RUN_TEST(test_send_signals_nonexistent_pid_esrch_failure); |
|
|
RUN_TEST(test_send_signals_mixed_operands_returns_failure); |
|
|
|
|
|
return UNITY_END(); |
|
|
} |