Module: xenomai-forge Branch: master Commit: c162254fc3c1da6dd50d0580e469b82f73f67d3e URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=c162254fc3c1da6dd50d0580e469b82f73f67d3e
Author: Philippe Gerum <r...@xenomai.org> Date: Mon Nov 7 12:18:23 2011 +0100 alchemy/testsuite: introduce queue-related tests --- lib/alchemy/testsuite/Makefile | 5 +- lib/alchemy/testsuite/mq-1.c | 106 +++++++++++++++++++++++++++++++++++ lib/alchemy/testsuite/mq-2.c | 112 +++++++++++++++++++++++++++++++++++++ lib/alchemy/testsuite/mq-3.c | 120 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 342 insertions(+), 1 deletions(-) diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile index 5ca5280..fda4ff0 100644 --- a/lib/alchemy/testsuite/Makefile +++ b/lib/alchemy/testsuite/Makefile @@ -16,7 +16,10 @@ TESTS := \ task-2 \ task-3 \ task-4 \ - task-5 + task-5 \ + mq-1 \ + mq-2 \ + mq-3 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/mq-1.c b/lib/alchemy/testsuite/mq-1.c new file mode 100644 index 0000000..6c5e892 --- /dev/null +++ b/lib/alchemy/testsuite/mq-1.c @@ -0,0 +1,106 @@ +#include <stdio.h> +#include <stdlib.h> +#include <copperplate/init.h> +#include <copperplate/traceobj.h> +#include <alchemy/task.h> +#include <alchemy/queue.h> + +static struct traceobj trobj; + +#define NMESSAGES (sizeof(messages) / sizeof(messages[0])) + +static int messages[] = { + 0xfafafafa, + 0xbebebebe, + 0xcdcdcdcd, + 0xabcdefff, + 0x12121212, + 0x34343434, + 0x56565656, + 0x78787878, + 0xdededede, + 0xbcbcbcbc +}; + +static void main_task(void *arg) +{ + RT_QUEUE_INFO info; + int ret, msg = 0; + RT_QUEUE q; + + traceobj_enter(&trobj); + + ret = rt_queue_create(&q, "QUEUE", sizeof(messages), Q_UNLIMITED, 0xffffffff); + traceobj_assert(&trobj, ret == -EINVAL); + + ret = rt_queue_create(&q, "QUEUE", 0, NMESSAGES, Q_FIFO); + traceobj_assert(&trobj, ret == -EINVAL); + + ret = rt_queue_create(&q, "QUEUE", sizeof(messages), Q_UNLIMITED, Q_FIFO); + traceobj_assert(&trobj, ret == 0); + + ret = rt_queue_delete(&q); + traceobj_assert(&trobj, ret == 0); + + ret = rt_queue_create(&q, "QUEUE", sizeof(messages), NMESSAGES, Q_PRIO); + traceobj_assert(&trobj, ret == 0); + + ret = rt_queue_inquire(&q, &info); + traceobj_assert(&trobj, ret == 0); + traceobj_assert(&trobj, info.nmessages == 0); + + ret = rt_queue_write(&q, &messages[0], sizeof(int), Q_NORMAL); + traceobj_assert(&trobj, ret == 0); + + ret = rt_queue_inquire(&q, &info); + traceobj_assert(&trobj, ret == 0); + traceobj_assert(&trobj, info.nmessages == 1); + + ret = rt_queue_write(&q, &messages[1], sizeof(int), Q_NORMAL); + traceobj_assert(&trobj, ret == 0); + + ret = rt_queue_inquire(&q, &info); + traceobj_assert(&trobj, ret == 0); + traceobj_assert(&trobj, info.nmessages == 2); + + ret = rt_queue_read(&q, &msg, sizeof(msg), TM_NONBLOCK); + traceobj_assert(&trobj, ret == sizeof(msg)); + traceobj_assert(&trobj, msg == 0xfafafafa); + + ret = rt_queue_inquire(&q, &info); + traceobj_assert(&trobj, ret == 0); + traceobj_assert(&trobj, info.nmessages == 1); + + ret = rt_queue_read(&q, &msg, sizeof(msg), TM_NONBLOCK); + traceobj_assert(&trobj, ret == sizeof(msg)); + traceobj_assert(&trobj, msg == 0xbebebebe); + + ret = rt_queue_inquire(&q, &info); + traceobj_assert(&trobj, ret == 0); + traceobj_assert(&trobj, info.nmessages == 0); + + ret = rt_queue_read(&q, &msg, sizeof(msg), 1000000); + traceobj_assert(&trobj, ret == -ETIMEDOUT); + + ret = rt_queue_delete(&q); + traceobj_assert(&trobj, ret == 0); + + traceobj_exit(&trobj); +} + +int main(int argc, char *argv[]) +{ + RT_TASK t_main; + int ret; + + copperplate_init(argc, argv); + + traceobj_init(&trobj, argv[0], 0); + + ret = rt_task_spawn(&t_main, "main_task", 0, 50, 0, main_task, NULL); + traceobj_assert(&trobj, ret == 0); + + traceobj_join(&trobj); + + exit(0); +} diff --git a/lib/alchemy/testsuite/mq-2.c b/lib/alchemy/testsuite/mq-2.c new file mode 100644 index 0000000..5a069e7 --- /dev/null +++ b/lib/alchemy/testsuite/mq-2.c @@ -0,0 +1,112 @@ +#include <stdio.h> +#include <stdlib.h> +#include <copperplate/init.h> +#include <copperplate/traceobj.h> +#include <alchemy/task.h> +#include <alchemy/queue.h> + +static struct traceobj trobj; + +static int tseq[] = { + 3, 4, 5, 6, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 7, +}; + +#define NMESSAGES ((sizeof(messages) / sizeof(messages[0])) - 1) + +static int messages[] = { + 0xfafafafa, + 0xbebebebe, + 0xcdcdcdcd, + 0xabcdefff, + 0x12121212, + 0x34343434, + 0x56565656, + 0x78787878, + 0xdededede, + 0xbcbcbcbc, + 0x0 +}; + +RT_QUEUE q; + +static void peer_task(void *arg) +{ + int ret, msg, n; + + traceobj_enter(&trobj); + + n = 1; + do { + traceobj_mark(&trobj, 1); + ret = rt_queue_read(&q, &msg, sizeof(msg), TM_NONBLOCK); + traceobj_assert(&trobj, ret == sizeof(msg)); + traceobj_assert(&trobj, msg == messages[NMESSAGES - n]); + traceobj_mark(&trobj, 2); + } while (n++ < NMESSAGES); + + traceobj_exit(&trobj); +} + +static void main_task(void *arg) +{ + RT_QUEUE_INFO info; + RT_TASK t_peer; + int ret, n; + + traceobj_enter(&trobj); + + ret = rt_queue_create(&q, "QUEUE", sizeof(messages), NMESSAGES, Q_PRIO); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 3); + + ret = rt_task_set_priority(NULL, 11); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 4); + + ret = rt_task_spawn(&t_peer, "peer_task", 0, 10, 0, peer_task, NULL); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 5); + + n = 0; + do + ret = rt_queue_write(&q, &messages[n], sizeof(int), Q_URGENT); + while (n++ < NMESSAGES && ret >= 0); + + traceobj_assert(&trobj, ret == -ENOMEM && n == NMESSAGES + 1); + + traceobj_mark(&trobj, 6); + + rt_task_sleep(10000000); + + traceobj_mark(&trobj, 7); + + ret = rt_queue_inquire(&q, &info); + traceobj_assert(&trobj, ret == 0); + traceobj_assert(&trobj, info.nmessages == 0); + + traceobj_verify(&trobj, tseq, sizeof(tseq) / sizeof(int)); + + traceobj_exit(&trobj); +} + +int main(int argc, char *argv[]) +{ + RT_TASK t_main; + int ret; + + copperplate_init(argc, argv); + + traceobj_init(&trobj, argv[0], sizeof(tseq) / sizeof(int)); + + ret = rt_task_spawn(&t_main, "main_task", 0, 50, 0, main_task, NULL); + traceobj_assert(&trobj, ret == 0); + + traceobj_join(&trobj); + + exit(0); +} diff --git a/lib/alchemy/testsuite/mq-3.c b/lib/alchemy/testsuite/mq-3.c new file mode 100644 index 0000000..744e111 --- /dev/null +++ b/lib/alchemy/testsuite/mq-3.c @@ -0,0 +1,120 @@ +#include <stdio.h> +#include <stdlib.h> +#include <copperplate/init.h> +#include <copperplate/traceobj.h> +#include <alchemy/task.h> +#include <alchemy/queue.h> + +#define NMESSAGES 10 + +static struct traceobj trobj; + +static int tseq[] = { + 11, 1, 2, 3, 12, 8, 14, + 13, 4, 5, 6, 7, 9, 10 +}; + +static RT_QUEUE q; + +static void main_task(void *arg) +{ + int ret, msg, n; + + traceobj_enter(&trobj); + + traceobj_mark(&trobj, 1); + + ret = rt_queue_create(&q, "QUEUE", NMESSAGES * sizeof(int), NMESSAGES, Q_FIFO); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 2); + + for (msg = 0; msg < NMESSAGES; msg++) { + ret = rt_queue_write(&q, &msg, sizeof(int), Q_NORMAL); + traceobj_assert(&trobj, ret == 0); + } + + traceobj_mark(&trobj, 3); + + ret = rt_queue_write(&q, &msg, sizeof(int), Q_URGENT); + traceobj_assert(&trobj, ret == -ENOMEM); + + rt_task_sleep(1000000); + + ret = rt_queue_write(&q, &msg, sizeof(int), Q_URGENT); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 4); + + ret = rt_queue_read(&q, &msg, sizeof(msg), TM_INFINITE); + traceobj_assert(&trobj, ret == sizeof(int) && msg == 10); + + traceobj_mark(&trobj, 5); + + for (n = 1; n < NMESSAGES; n++) { /* peer task read #0 already. */ + ret = rt_queue_read(&q, &msg, sizeof(msg), TM_INFINITE); + traceobj_assert(&trobj, ret == sizeof(int) && msg == n); + } + + traceobj_mark(&trobj, 6); + + ret = rt_queue_delete(&q); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 7); + + traceobj_exit(&trobj); +} + +static void peer_task(void *arg) +{ + int ret, msg; + + traceobj_enter(&trobj); + + traceobj_mark(&trobj, 8); + + ret = rt_queue_read(&q, &msg, sizeof(msg), TM_INFINITE); + traceobj_assert(&trobj, ret == sizeof(int) && msg == 0); + + traceobj_mark(&trobj, 14); + + rt_task_sleep(1000000); + + traceobj_mark(&trobj, 9); + + ret = rt_queue_read(&q, &msg, sizeof(msg), TM_INFINITE); + traceobj_assert(&trobj, ret == -EIDRM || ret == -EINVAL); + + traceobj_mark(&trobj, 10); + + traceobj_exit(&trobj); +} + +int main(int argc, char *argv[]) +{ + RT_TASK t_main, t_peer; + int ret; + + copperplate_init(argc, argv); + + traceobj_init(&trobj, argv[0], sizeof(tseq) / sizeof(int)); + + traceobj_mark(&trobj, 11); + + ret = rt_task_spawn(&t_main, "main_task", 0, 50, 0, main_task, NULL); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 12); + + ret = rt_task_spawn(&t_peer, "peer_task", 0, 49, 0, peer_task, NULL); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 13); + + traceobj_join(&trobj); + + traceobj_verify(&trobj, tseq, sizeof(tseq) / sizeof(int)); + + exit(0); +} _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git