Module: xenomai-forge Branch: master Commit: 46a0bc0d869f79c46522f54370d8c566bd843c32 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=46a0bc0d869f79c46522f54370d8c566bd843c32
Author: Philippe Gerum <r...@xenomai.org> Date: Tue Nov 22 10:40:16 2011 +0100 alchemy/testsuite: introduce buffer test --- lib/alchemy/testsuite/Makefile | 3 +- lib/alchemy/testsuite/buffer-1.c | 110 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletions(-) diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile index 51b2205..d490350 100644 --- a/lib/alchemy/testsuite/Makefile +++ b/lib/alchemy/testsuite/Makefile @@ -27,7 +27,8 @@ TESTS := \ sem-2 \ mutex-1 \ event-1 \ - heap-1 + heap-1 \ + buffer-1 \ CFLAGS := $(shell DESTDIR=$(DESTDIR) $(XENO_CONFIG) --skin=alchemy --cflags) -g LDFLAGS := $(shell DESTDIR=$(DESTDIR) $(XENO_CONFIG) --skin=alchemy --ldflags) diff --git a/lib/alchemy/testsuite/buffer-1.c b/lib/alchemy/testsuite/buffer-1.c new file mode 100644 index 0000000..a252270 --- /dev/null +++ b/lib/alchemy/testsuite/buffer-1.c @@ -0,0 +1,110 @@ +#include <stdio.h> +#include <stdlib.h> +#include <memory.h> +#include <copperplate/init.h> +#include <copperplate/traceobj.h> +#include <alchemy/task.h> +#include <alchemy/buffer.h> + +static struct traceobj trobj; + +static RT_TASK t_bgnd, t_fgnd; + +static RT_BUFFER buffer; + +static void foreground_task(void *arg) +{ + ssize_t ret; + char buf[6]; + int n = 0; + + traceobj_enter(&trobj); + + /* + * We should get a short read (1 bytes), then a full read (2 + * bytes), and back again. + */ + for (;;) { + memset(buf,0, sizeof(buf)); + ret = rt_buffer_read(&buffer, buf, 2, TM_INFINITE); + switch (ret) { + case 1: + traceobj_assert(&trobj, buf[0] == ((n / 2) % 26) + 'A'); + break; + case 2: + traceobj_assert(&trobj, atoi(buf) == ((n / 2) % 10) * 11); + break; + default: + traceobj_assert(&trobj, 0); + } + n++; + } + + traceobj_exit(&trobj); +} + +static void background_task(void *arg) +{ + char c = 'A', s[3]; + ssize_t ret; + int n = 0; + + traceobj_enter(&trobj); + + for (;;) { + ret = rt_buffer_write(&buffer, &c, 1, TM_INFINITE); + traceobj_assert(&trobj, ret == 1); + c++; + if (c > 'Z') + c = 'A'; + sprintf(s, "%.2d", 11 * n); + ret = rt_buffer_write(&buffer, s, 2, TM_INFINITE); + traceobj_assert(&trobj, ret == 2); + n = (n + 1) % 10; + } + + traceobj_exit(&trobj); +} + +int main(int argc, char *argv[]) +{ + int ret; + + copperplate_init(argc, argv); + + traceobj_init(&trobj, argv[0], 0); + + ret = rt_buffer_create(&buffer, NULL, 2, B_FIFO); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_shadow(NULL, "main", 30, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_create(&t_fgnd, "FGND", 0, 20, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_start(&t_fgnd, foreground_task, NULL); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_create(&t_bgnd, "BGND", 0, 10, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_start(&t_bgnd, background_task, NULL); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_sleep(1500000000); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_delete(&t_bgnd); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_delete(&t_fgnd); + traceobj_assert(&trobj, ret == 0); + + ret = rt_buffer_delete(&buffer); + traceobj_assert(&trobj, ret == 0); + + traceobj_join(&trobj); + + exit(0); +} _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git