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

Reply via email to