Module: xenomai-forge
Branch: master
Commit: 08779315c399e85f61c0eaeae9a49ed974eacd4e
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=08779315c399e85f61c0eaeae9a49ed974eacd4e

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sun Nov  6 18:48:48 2011 +0100

alchemy/testsuite: more task related tests

---

 lib/alchemy/testsuite/Makefile |    4 +-
 lib/alchemy/testsuite/task-3.c |   45 ++++++++++++++++
 lib/alchemy/testsuite/task-4.c |  106 ++++++++++++++++++++++++++++++++++++++
 lib/alchemy/testsuite/task-5.c |  110 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 264 insertions(+), 1 deletions(-)

diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile
index 5562b49..5ca5280 100644
--- a/lib/alchemy/testsuite/Makefile
+++ b/lib/alchemy/testsuite/Makefile
@@ -14,7 +14,9 @@ endif
 TESTS :=       \
        task-1  \
        task-2  \
-       task-3
+       task-3  \
+       task-4  \
+       task-5
 
 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/task-3.c b/lib/alchemy/testsuite/task-3.c
new file mode 100644
index 0000000..9432c92
--- /dev/null
+++ b/lib/alchemy/testsuite/task-3.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <copperplate/init.h>
+#include <copperplate/traceobj.h>
+#include <alchemy/task.h>
+
+static struct traceobj trobj;
+
+static RT_TASK t_a, t_b;
+
+int main(int argc, char *argv[])
+{
+       RT_TASK t;
+       int ret;
+
+       copperplate_init(argc, argv);
+
+       traceobj_init(&trobj, argv[0], 0);
+
+       ret = rt_task_create(&t_a, "taskA", 0,  20, 0);
+       traceobj_assert(&trobj, ret == 0);
+
+       ret = rt_task_create(&t_b, "taskB", 0,  21, 0);
+       traceobj_assert(&trobj, ret == 0);
+
+       ret = rt_task_bind(&t, "taskA", TM_NONBLOCK);
+       traceobj_assert(&trobj, ret == 0);
+       traceobj_assert(&trobj, rt_task_same(&t, &t_a));
+
+       ret = rt_task_bind(&t, "taskB", TM_NONBLOCK);
+       traceobj_assert(&trobj, ret == 0);
+       traceobj_assert(&trobj, rt_task_same(&t, &t_b));
+
+       ret = rt_task_delete(&t_a);
+       traceobj_assert(&trobj, ret == 0);
+       ret = rt_task_bind(&t, "taskA", TM_NONBLOCK);
+       traceobj_assert(&trobj, ret == -EWOULDBLOCK);
+
+       ret = rt_task_delete(&t_b);
+       traceobj_assert(&trobj, ret == 0);
+       ret = rt_task_bind(&t, "taskB", TM_NONBLOCK);
+       traceobj_assert(&trobj, ret == -EWOULDBLOCK);
+
+       exit(0);
+}
diff --git a/lib/alchemy/testsuite/task-4.c b/lib/alchemy/testsuite/task-4.c
new file mode 100644
index 0000000..ca1f163
--- /dev/null
+++ b/lib/alchemy/testsuite/task-4.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/sem.h>
+
+static struct traceobj trobj;
+
+static int tseq[] = {
+       8, 1, 9, 4, 10, 2, 11, 12, 3, 5, 13
+};
+
+static RT_TASK t_bgnd, t_fgnd;
+
+static RT_SEM sem;
+
+static void background_task(void *arg)
+{
+       int ret;
+
+       traceobj_enter(&trobj);
+
+       traceobj_mark(&trobj, 1);
+
+       ret = rt_sem_p(&sem, TM_INFINITE);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 2);
+
+       ret = rt_task_suspend(&t_fgnd);
+       traceobj_assert(&trobj, ret == 0);
+
+       rt_task_sleep(20000000);
+
+       traceobj_mark(&trobj, 3);
+
+       ret = rt_task_resume(&t_fgnd);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 13);
+
+       traceobj_exit(&trobj);
+}
+
+static void foreground_task(void *arg)
+{
+       int ret;
+
+       traceobj_enter(&trobj);
+
+       traceobj_mark(&trobj, 4);
+
+       ret = rt_sem_p(&sem, TM_INFINITE);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 5);
+
+       traceobj_exit(&trobj);
+}
+
+int main(int argc, char *argv[])
+{
+       int ret;
+
+       copperplate_init(argc, argv);
+
+       traceobj_init(&trobj, argv[0], sizeof(tseq) / sizeof(int));
+
+       ret = rt_sem_create(&sem, "SEMA", 0, S_FIFO);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 8);
+
+       ret = rt_task_create(&t_bgnd, "BGND", 0,  20, 0);
+       traceobj_assert(&trobj, ret == 0);
+
+       ret = rt_task_start(&t_bgnd, background_task, NULL);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 9);
+
+       ret = rt_task_create(&t_fgnd, "FGND", 0,  21, 0);
+       traceobj_assert(&trobj, ret == 0);
+
+       ret = rt_task_start(&t_fgnd, foreground_task, NULL);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 10);
+
+       ret = rt_sem_v(&sem);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 11);
+
+       ret = rt_sem_v(&sem);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 12);
+
+       traceobj_join(&trobj);
+
+       traceobj_verify(&trobj, tseq, sizeof(tseq) / sizeof(int));
+
+       exit(0);
+}
diff --git a/lib/alchemy/testsuite/task-5.c b/lib/alchemy/testsuite/task-5.c
new file mode 100644
index 0000000..e641695
--- /dev/null
+++ b/lib/alchemy/testsuite/task-5.c
@@ -0,0 +1,110 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <copperplate/init.h>
+#include <copperplate/traceobj.h>
+#include <alchemy/task.h>
+#include <alchemy/sem.h>
+
+static struct traceobj trobj;
+
+static int tseq[] = {
+       9, 1, 10, 3, 11, 4, 5, 6, 7, 2, 8, 12
+};
+
+static RT_TASK t_bgnd, t_fgnd;
+
+static RT_SEM sem;
+
+static void background_task(void *arg)
+{
+       int ret;
+
+       traceobj_enter(&trobj);
+
+       traceobj_mark(&trobj, 1);
+
+       ret = rt_sem_p(&sem, TM_INFINITE);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 2);
+
+       traceobj_exit(&trobj);
+}
+
+static void foreground_task(void *arg)
+{
+       RT_TASK_INFO info;
+       int ret;
+
+       traceobj_enter(&trobj);
+
+       traceobj_mark(&trobj, 3);
+
+       ret = rt_sem_p(&sem, TM_INFINITE);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 4);
+
+       ret = rt_sem_v(&sem);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 5);
+
+       ret = rt_task_inquire(NULL, &info);
+       traceobj_assert(&trobj, ret == 0 && info.prio == 21);
+
+       traceobj_mark(&trobj, 6);
+
+       ret = rt_task_set_priority(&t_bgnd, info.prio);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 7);
+
+       ret = rt_task_set_priority(&t_bgnd, info.prio + 1);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 8);
+
+       traceobj_exit(&trobj);
+}
+
+int main(int argc, char *argv[])
+{
+       int ret;
+
+       copperplate_init(argc, argv);
+
+       traceobj_init(&trobj, argv[0], sizeof(tseq) / sizeof(int));
+
+       ret = rt_sem_create(&sem, "SEMA", 0, S_PRIO);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 9);
+
+       ret = rt_task_create(&t_bgnd, "BGND", 0,  20, 0);
+       traceobj_assert(&trobj, ret == 0);
+
+       ret = rt_task_start(&t_bgnd, background_task, NULL);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 10);
+
+       ret = rt_task_create(&t_fgnd, "FGND", 0,  21, 0);
+       traceobj_assert(&trobj, ret == 0);
+
+       ret = rt_task_start(&t_fgnd, foreground_task, NULL);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 11);
+
+       ret = rt_sem_v(&sem);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_mark(&trobj, 12);
+
+       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