summaryrefslogtreecommitdiffstats
path: root/testsuite
diff options
context:
space:
mode:
authorChristian Mauderer <Christian.Mauderer@embedded-brains.de>2016-07-14 11:01:43 +0200
committerChristian Mauderer <Christian.Mauderer@embedded-brains.de>2016-08-02 10:21:46 +0200
commitd31a3658d0986fe0f78c9167b7aa9b304d7c2a45 (patch)
treec8991ae4d896aae22daab0304aeb4049b41fd8f0 /testsuite
parentrtemsbsd: Add call to program with a data restore (diff)
downloadrtems-libbsd-d31a3658d0986fe0f78c9167b7aa9b304d7c2a45.tar.bz2
rtemsbsd: Add wrapper for open, fopen, malloc, ...
Add the following rtems_bsd_program_... wrapper: * rtems_bsd_program_open * rtems_bsd_program_socket * rtems_bsd_program_close * rtems_bsd_program_fopen * rtems_bsd_program_fclose * rtems_bsd_program_malloc * rtems_bsd_program_calloc * rtems_bsd_program_realloc * rtems_bsd_program_free * rtems_bsd_program_strdup * rtems_bsd_program_vasprintf * rtems_bsd_program_asprintf
Diffstat (limited to 'testsuite')
-rw-r--r--testsuite/program01/test_main.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/testsuite/program01/test_main.c b/testsuite/program01/test_main.c
index ca14a36d..a670afeb 100644
--- a/testsuite/program01/test_main.c
+++ b/testsuite/program01/test_main.c
@@ -48,6 +48,25 @@
#define TEST_NAME "LIBBSD SYSCALLS 1"
+struct alloc_ctx {
+ enum alloc_type {
+ ALLOC_MALLOC = 0,
+ ALLOC_CALLOC = 1,
+ ALLOC_REALLOC = 2,
+ ALLOC_STRDUP = 3,
+ ALLOC_ASPRINTF = 4,
+ ALLOC_LAST = 5,
+ } type;
+ unsigned free;
+#define ALLOC_FREE_NONE 0x0
+#define ALLOC_FREE_FIRST 0x1
+#define ALLOC_FREE_SECOND 0x2
+#define ALLOC_FREE_THIRD 0x4
+#define ALLOC_FREE_ALL (ALLOC_FREE_FIRST | \
+ ALLOC_FREE_SECOND | \
+ ALLOC_FREE_THIRD)
+};
+
typedef void (*no_mem_test_body)(int fd);
typedef struct {
@@ -339,12 +358,228 @@ test_err(void)
assert(exit_code == 15);
}
+static int
+call_socket(void *ctx)
+{
+ int fd = socket(PF_INET, SOCK_DGRAM, 0);
+ assert (fd != -1);
+ return 0;
+}
+
+static int
+call_socket_close(void *ctx)
+{
+ int rv;
+ int fd = socket(PF_INET, SOCK_DGRAM, 0);
+ assert (fd != -1);
+
+ rv = close(fd);
+ assert(rv == 0);
+
+ return 0;
+}
+
+static int
+call_open(void *ctx)
+{
+ int fd = open("/testfile", O_RDWR | O_CREAT, S_IRWXU);
+ assert (fd != -1);
+ return 0;
+}
+
+static int
+call_open_close(void *ctx)
+{
+ int rv;
+ int fd = open("/testfile", O_RDWR);
+ assert (fd != -1);
+
+ rv = close(fd);
+ assert(rv == 0);
+
+ return 0;
+}
+
+static int
+call_fopen(void *ctx)
+{
+ FILE *file = fopen("/testfile", "rw");
+ assert (file != NULL);
+ return 0;
+}
+
+static int
+call_fopen_fclose(void *ctx)
+{
+ int rv;
+
+ FILE *file = fopen("/testfile", "rw");
+ assert (file != NULL);
+
+ rv = fclose(file);
+ assert(rv == 0);
+
+ return 0;
+}
+
+static void
+test_open_close(void)
+{
+ int exit_code;
+ rtems_resource_snapshot snapshot;
+
+ puts("test open, socket and close");
+
+ /* Call a first time to create all resources before taking a memory
+ * snapshot. */
+ exit_code = rtems_bsd_program_call("socket", call_socket, NULL);
+ assert(exit_code == 0);
+ exit_code = rtems_bsd_program_call("open", call_open, NULL);
+ assert(exit_code == 0);
+ exit_code = rtems_bsd_program_call("fopen", call_fopen, NULL);
+ assert(exit_code == 0);
+
+ rtems_resource_snapshot_take(&snapshot);
+
+ exit_code = rtems_bsd_program_call("open", call_open, NULL);
+ assert(exit_code == 0);
+ assert(rtems_resource_snapshot_check(&snapshot));
+
+ exit_code = rtems_bsd_program_call("open_close", call_open_close, NULL);
+ assert(exit_code == 0);
+ assert(rtems_resource_snapshot_check(&snapshot));
+
+ rtems_resource_snapshot_take(&snapshot);
+
+ exit_code = rtems_bsd_program_call("socket", call_socket, NULL);
+ assert(exit_code == 0);
+ assert(rtems_resource_snapshot_check(&snapshot));
+
+ exit_code = rtems_bsd_program_call("socket_close", call_socket_close,
+ NULL);
+ assert(exit_code == 0);
+ assert(rtems_resource_snapshot_check(&snapshot));
+
+ exit_code = rtems_bsd_program_call("fopen", call_fopen, NULL);
+ assert(exit_code == 0);
+ assert(rtems_resource_snapshot_check(&snapshot));
+
+ exit_code = rtems_bsd_program_call("fopen_fclose", call_fopen_fclose,
+ NULL);
+ assert(exit_code == 0);
+ assert(rtems_resource_snapshot_check(&snapshot));
+}
+
+static int
+call_alloc(void *ctx)
+{
+ struct alloc_ctx *context = ctx;
+ char *first, *second, *third;
+ const int random_size = 64;
+ const char teststring[] = "test";
+
+ switch(context->type) {
+ case ALLOC_MALLOC:
+ first = malloc(random_size * sizeof(int));
+ second = malloc(random_size * sizeof(int));
+ third = malloc(random_size * sizeof(int));
+ break;
+ case ALLOC_CALLOC:
+ first = calloc(random_size, sizeof(int));
+ second = calloc(random_size, sizeof(int));
+ third = calloc(random_size, sizeof(int));
+ break;
+ case ALLOC_REALLOC:
+ first = malloc(sizeof(int));
+ second = malloc(sizeof(int));
+ third = malloc(sizeof(int));
+ assert(first != NULL);
+ assert(second != NULL);
+ assert(third != NULL);
+ first = realloc(first, sizeof(int) * random_size);
+ second = realloc(second, sizeof(int) * random_size);
+ third = realloc(third, sizeof(int) * random_size);
+ break;
+ case ALLOC_STRDUP:
+ first = strdup(teststring);
+ second = strdup(teststring);
+ third = strdup(teststring);
+ break;
+ case ALLOC_ASPRINTF:
+ asprintf(&first, "a number %d", 0x123456);
+ asprintf(&second, "some string: %s", "abcdefghijklm");
+ asprintf(&third, "just something");
+ break;
+ default:
+ assert(false);
+ break;
+ }
+
+ assert(first != NULL);
+ assert(second != NULL);
+ assert(third != NULL);
+
+ if((context->free & ALLOC_FREE_FIRST) != 0) {
+ free(first);
+ }
+ if((context->free & ALLOC_FREE_SECOND) != 0) {
+ free(second);
+ }
+ if((context->free & ALLOC_FREE_THIRD) != 0) {
+ free(third);
+ }
+
+ return 0;
+}
+
+static int
+call_free_on_null(void *ctx)
+{
+ void *new = NULL;
+ free(new);
+ return 0;
+}
+
+static void
+test_alloc_free(void)
+{
+ int exit_code;
+ rtems_resource_snapshot snapshot;
+ struct alloc_ctx context;
+ enum alloc_type type;
+
+ puts("test alloc and free");
+
+ rtems_resource_snapshot_take(&snapshot);
+
+ for(type = ALLOC_MALLOC; type < ALLOC_LAST; ++type) {
+ unsigned free;
+
+ for(free = ALLOC_FREE_NONE; free < ALLOC_FREE_ALL; ++free) {
+ context.type = type;
+ context.free = free;
+
+ exit_code = rtems_bsd_program_call("alloc", call_alloc,
+ &context);
+ assert(exit_code == 0);
+ assert(rtems_resource_snapshot_check(&snapshot));
+ }
+ }
+
+ exit_code = rtems_bsd_program_call("free_on_null", call_free_on_null,
+ NULL);
+ assert(exit_code == 0);
+ assert(rtems_resource_snapshot_check(&snapshot));
+}
+
static void
test_main(void)
{
test_bsd_program();
test_warn();
test_err();
+ test_open_close();
+ test_alloc_free();
exit(0);
}