summaryrefslogtreecommitdiffstats
path: root/testsuite/syscalls01
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-17 10:38:34 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-31 13:18:48 +0100
commitd01564c473842adfd93148bb367fa0679f99e6b8 (patch)
treec838d184a92e6df21f32950392190e9b1842adf1 /testsuite/syscalls01
parentSimplify getopt() to getopt_r() translation (diff)
downloadrtems-libbsd-d01564c473842adfd93148bb367fa0679f99e6b8.tar.bz2
Move program control to thread structure
Diffstat (limited to 'testsuite/syscalls01')
-rw-r--r--testsuite/syscalls01/test_main.c196
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);
}