]> git.ozlabs.org Git - ccan/blobdiff - ccan/coroutine/test/api-1.c
coroutine: New module
[ccan] / ccan / coroutine / test / api-1.c
diff --git a/ccan/coroutine/test/api-1.c b/ccan/coroutine/test/api-1.c
new file mode 100644 (file)
index 0000000..fbf66df
--- /dev/null
@@ -0,0 +1,52 @@
+#include <stdlib.h>
+
+#include <ccan/coroutine/coroutine.h>
+#include <ccan/tap/tap.h>
+
+static int global = 0;
+
+static void trivial_fn(void *p)
+{
+       struct coroutine_state *ret = (struct coroutine_state *)p;
+
+       global = 1;
+
+       coroutine_jump(ret);
+}
+
+static void test_trivial(struct coroutine_stack *stack)
+{
+       struct coroutine_state t, master;
+
+       if (!COROUTINE_AVAILABLE) {
+               skip(1, "Coroutines not available");
+               return;
+       }
+
+       coroutine_init(&t, trivial_fn, &master, stack);
+       coroutine_switch(&master, &t);
+
+       ok1(global == 1);
+}
+
+
+int main(void)
+{
+       char buf[COROUTINE_MIN_STKSZ + COROUTINE_STK_OVERHEAD];
+       struct coroutine_stack *stack;
+
+       /* This is how many tests you plan to run */
+       plan_tests(4);
+
+       stack = coroutine_stack_init(buf, sizeof(buf), 0);
+       ok1(stack != NULL);
+       ok1(coroutine_stack_check(stack, NULL) == stack);
+       ok1(coroutine_stack_size(stack) == COROUTINE_MIN_STKSZ);
+
+       test_trivial(stack);
+
+       coroutine_stack_release(stack, 0);
+
+       /* This exits depending on whether all tests passed */
+       return exit_status();
+}