diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-17 10:38:34 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-31 13:18:48 +0100 |
commit | d01564c473842adfd93148bb367fa0679f99e6b8 (patch) | |
tree | c838d184a92e6df21f32950392190e9b1842adf1 /testsuite/syscalls01 | |
parent | Simplify getopt() to getopt_r() translation (diff) | |
download | rtems-libbsd-d01564c473842adfd93148bb367fa0679f99e6b8.tar.bz2 |
Move program control to thread structure
Diffstat (limited to 'testsuite/syscalls01')
-rw-r--r-- | testsuite/syscalls01/test_main.c | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/testsuite/syscalls01/test_main.c b/testsuite/syscalls01/test_main.c index cfac1354..6f64c21e 100644 --- a/testsuite/syscalls01/test_main.c +++ b/testsuite/syscalls01/test_main.c @@ -36,6 +36,7 @@ #include <sys/filio.h> #include <netinet/in.h> #include <arpa/inet.h> +#include <err.h> #include <assert.h> #include <errno.h> @@ -45,6 +46,10 @@ #include <string.h> #include <unistd.h> +#define RTEMS_BSD_PROGRAM_NO_EXIT_WRAP +#define RTEMS_BSD_PROGRAM_NO_PRINTF_WRAP +#include <machine/rtems-bsd-program.h> + #include <rtems/libcsupport.h> #define TEST_NAME "LIBBSD SYSCALLS 1" @@ -1201,6 +1206,193 @@ test_socket_recv_and_recvfrom_and_recvmsg(void) assert(rtems_resource_snapshot_check(&snapshot)); } +static const char prog_name[] = "prog"; + +static int +invalid_prog(void *ctx) +{ + (void) ctx; + + assert(0); +} + +static int +invalid_main(int argc, char **argv) +{ + (void) argc; + (void) argv; + + assert(0); +} + +static void *const some_context = (void *) 0xcafe; + +static int +some_prog(void *ctx) +{ + assert(ctx == some_context); + assert(strcmp(rtems_bsd_program_get_name(), prog_name) == 0); + assert(rtems_bsd_program_get_context() == some_context); + errno = 0; + rtems_bsd_program_exit(456); +} + +static const int some_argc = 1; + +static char *some_argv[] = { "a", NULL }; + +static int +some_main(int argc, char **argv) +{ + assert(argc == some_argc); + assert(argv == some_argv); + assert(strcmp(rtems_bsd_program_get_name(), prog_name) == 0); + errno = 0; + rtems_bsd_program_exit(789); +} + +static void +no_mem_bsd_program(int fd) +{ + (void) fd; + + assert(rtems_bsd_program_call(prog_name, invalid_prog, NULL) + == EXIT_FAILURE); + assert(rtems_bsd_program_call_main(prog_name, invalid_main, some_argc, + some_argv) == EXIT_FAILURE); + assert(strcmp(rtems_bsd_program_get_name(), "?") == 0); + assert(rtems_bsd_program_get_context() == NULL); +} + +static void +test_bsd_program(void) +{ + rtems_resource_snapshot snapshot; + int exit_code; + void *greedy; + char *invalid_argv[2] = { "a", "b" }; + + assert(rtems_configuration_get_unified_work_area()); + + puts("test BSD program"); + + rtems_resource_snapshot_take(&snapshot); + + do_no_mem_test(no_mem_bsd_program, -1); + + greedy = rtems_workspace_greedy_allocate(NULL, 0); + no_mem_bsd_program(-1); + rtems_workspace_greedy_free(greedy); + + errno = 0; + exit_code = rtems_bsd_program_call_main(prog_name, NULL, 1, invalid_argv); + assert(errno == EFAULT); + assert(exit_code == EXIT_FAILURE); + + errno = EINVAL; + exit_code = rtems_bsd_program_call(prog_name, some_prog, some_context); + assert(errno == 0); + assert(exit_code == 456); + assert(strcmp(rtems_bsd_program_get_name(), "?") == 0); + assert(rtems_bsd_program_get_context() == NULL); + + errno = EINVAL; + exit_code = rtems_bsd_program_call_main(prog_name, some_main, + some_argc, some_argv); + assert(errno == 0); + assert(exit_code == 789); + assert(strcmp(rtems_bsd_program_get_name(), "?") == 0); + assert(rtems_bsd_program_get_context() == NULL); + + assert(rtems_resource_snapshot_check(&snapshot)); +} + +static void +test_warn(void) +{ + puts("test warn"); + + errno = EAGAIN; + warn("%s", "warn"); + + errno = ENAMETOOLONG; + warn(NULL); + + errno = 0; + warnc(EDOM, "%s", "warnc"); + + errno = 0; + warnc(ERANGE, NULL); + + warnx("%s", "warnx"); + + warnx(NULL); +} + +static int +call_err(void *ctx) +{ + errno = EAGAIN; + err(10, "%s", "call_err"); +} + +static int +call_err_null(void *ctx) +{ + errno = ENAMETOOLONG; + err(11, NULL); +} + +static int +call_errc(void *ctx) +{ + errc(12, EDOM, "%s", "call_errc"); +} + +static int +call_errc_null(void *ctx) +{ + errc(13, ERANGE, NULL); +} + +static int +call_errx(void *ctx) +{ + errx(14, "%s", "call_errx"); +} + +static int +call_errx_null(void *ctx) +{ + errx(15, NULL); +} + +static void +test_err(void) +{ + int exit_code; + + puts("test err"); + + exit_code = rtems_bsd_program_call("err", call_err, NULL); + assert(exit_code == 10); + + exit_code = rtems_bsd_program_call("err", call_err_null, NULL); + assert(exit_code == 11); + + exit_code = rtems_bsd_program_call("errc", call_errc, NULL); + assert(exit_code == 12); + + exit_code = rtems_bsd_program_call("errc", call_errc_null, NULL); + assert(exit_code == 13); + + exit_code = rtems_bsd_program_call("errx", call_errx, NULL); + assert(exit_code == 14); + + exit_code = rtems_bsd_program_call("errx", call_errx_null, NULL); + assert(exit_code == 15); +} + static void test_main(void) { @@ -1221,6 +1413,10 @@ test_main(void) test_socket_send_and_sendto_and_sendmsg(); test_socket_recv_and_recvfrom_and_recvmsg(); + test_bsd_program(); + test_warn(); + test_err(); + puts("*** END OF " TEST_NAME " TEST ***"); exit(0); } |