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

Reply via email to