diff options
author | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2016-10-24 20:22:12 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2016-10-24 20:22:12 +0200 |
commit | 7988979a722b4cdf287b2093956a76a3f19b9897 (patch) | |
tree | d35e251d0472ceca55a2eef61cff261c8ee68fab /test/librt |
add uClibc-ng test directory
Diffstat (limited to 'test/librt')
-rw-r--r-- | test/librt/Makefile | 8 | ||||
-rw-r--r-- | test/librt/Makefile.in | 8 | ||||
-rw-r--r-- | test/librt/shmtest.c | 104 |
3 files changed, 120 insertions, 0 deletions
diff --git a/test/librt/Makefile b/test/librt/Makefile new file mode 100644 index 0000000..1021afe --- /dev/null +++ b/test/librt/Makefile @@ -0,0 +1,8 @@ +# uClibc shm tests +# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + +top_builddir=../../ +top_srcdir=../../ +include ../Rules.mak +-include Makefile.in +include ../Test.mak diff --git a/test/librt/Makefile.in b/test/librt/Makefile.in new file mode 100644 index 0000000..f25522c --- /dev/null +++ b/test/librt/Makefile.in @@ -0,0 +1,8 @@ +# uClibc shm tests +# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + +LDFLAGS_shmtest := -lrt + +ifeq ($(ARCH_USE_MMU),) +TESTS_DISABLED := shmtest +endif diff --git a/test/librt/shmtest.c b/test/librt/shmtest.c new file mode 100644 index 0000000..a14302d --- /dev/null +++ b/test/librt/shmtest.c @@ -0,0 +1,104 @@ +/* Copyright (C) 2009 Mikael Lund Jepsen <mlj@iccc.dk> + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include <errno.h> +#include <fcntl.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <sys/wait.h> + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +char shared_name[] = "/sharetest"; +int test_data[11] = {0,1,2,3,4,5,6,7,8,9,10}; + +int main(void) { + int pfds[2]; + pid_t pid; + int fd; + int test_data_fails = 0; + char *ptest_data; + unsigned int i; + char buf[30]; + int rv; + + pipe(pfds); + + switch(pid = fork()) { + case -1: + perror("fork"); + exit(1); /* parent exits */ + + case 0: + /* Child */ + + /* wait for parent */ + read(pfds[0], buf, 5); + + fd = shm_open(shared_name, O_RDWR, DEFFILEMODE); + if (fd == -1) { + perror("CHILD - shm_open(existing):"); + exit(1); + } else { + ptest_data = mmap(0, sizeof(test_data), PROT_READ + PROT_WRITE, MAP_SHARED, fd, 0); + if (ptest_data != MAP_FAILED) { + for (i=0; i < ARRAY_SIZE(test_data); i++) { + if (ptest_data[i] != test_data[i]) { + printf("%-40s: Offset %d, local %d, shm %d\n", "Compare memory error", i, test_data[i], ptest_data[i]); + test_data_fails++; + } + } + if (test_data_fails == 0) + printf("%-40s: %s\n", "Compare memory", "Success"); + + munmap(ptest_data, sizeof(test_data)); + } + } + exit(0); + + default: + /* Parent */ + fd = shm_open(shared_name, O_RDWR+O_CREAT+O_EXCL, DEFFILEMODE ); + if (fd == -1) { + perror("PARENT - shm_open(create):"); + } else { + if ((ftruncate(fd, sizeof(test_data))) == -1) + { + printf("%-40s: %s", "ftruncate", strerror(errno)); + shm_unlink(shared_name); + return 0; + } + + ptest_data = mmap(0, sizeof(test_data), PROT_READ + PROT_WRITE, MAP_SHARED, fd, 0); + if (ptest_data == MAP_FAILED) + { + perror("PARENT - mmap:"); + if (shm_unlink(shared_name) == -1) { + perror("PARENT - shm_unlink:"); + } + return 0; + } + for (i=0; i < ARRAY_SIZE(test_data); i++) + ptest_data[i] = test_data[i]; + + /* signal child */ + write(pfds[1], "rdy", 5); + /* wait for child */ + wait(&rv); + + /* Cleanup */ + munmap(ptest_data, sizeof(test_data)); + if (shm_unlink(shared_name) == -1) { + perror("PARENT - shm_unlink:"); + } + } + } + return 0; +} |