summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCharlie Shepherd <charlie@ctshepherd.com>2013-08-08 03:23:14 +0100
committerKevin Wolf <kwolf@redhat.com>2013-11-28 10:30:52 +0100
commitf8d1daea6f3ccd7450c2177ffb8903f0202711ee (patch)
tree5ca5435565aa8c68f2133ab5c28d9042b4d0a801 /tests
parentb276d2499428795629eee8ee93ba1ea100bb1bc9 (diff)
downloadqemu-f8d1daea6f3ccd7450c2177ffb8903f0202711ee.tar.gz
qemu-f8d1daea6f3ccd7450c2177ffb8903f0202711ee.tar.bz2
qemu-f8d1daea6f3ccd7450c2177ffb8903f0202711ee.zip
Test coroutine execution order
This patch adds a test for coroutine execution order in test-coroutine - this catches a bug in the CPC coroutine implementation. Signed-off-by: Charlie Shepherd <charlie@ctshepherd.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/test-coroutine.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/test-coroutine.c b/tests/test-coroutine.c
index 15a885e882..760636ddc4 100644
--- a/tests/test-coroutine.c
+++ b/tests/test-coroutine.c
@@ -150,6 +150,59 @@ static void test_lifecycle(void)
g_assert(done); /* expect done to be true (second time) */
}
+
+#define RECORD_SIZE 10 /* Leave some room for expansion */
+struct coroutine_position {
+ int func;
+ int state;
+};
+static struct coroutine_position records[RECORD_SIZE];
+static unsigned record_pos;
+
+static void record_push(int func, int state)
+{
+ struct coroutine_position *cp = &records[record_pos++];
+ g_assert_cmpint(record_pos, <, RECORD_SIZE);
+ cp->func = func;
+ cp->state = state;
+}
+
+static void coroutine_fn co_order_test(void *opaque)
+{
+ record_push(2, 1);
+ g_assert(qemu_in_coroutine());
+ qemu_coroutine_yield();
+ record_push(2, 2);
+ g_assert(qemu_in_coroutine());
+}
+
+static void do_order_test(void)
+{
+ Coroutine *co;
+
+ co = qemu_coroutine_create(co_order_test);
+ record_push(1, 1);
+ qemu_coroutine_enter(co, NULL);
+ record_push(1, 2);
+ g_assert(!qemu_in_coroutine());
+ qemu_coroutine_enter(co, NULL);
+ record_push(1, 3);
+ g_assert(!qemu_in_coroutine());
+}
+
+static void test_order(void)
+{
+ int i;
+ const struct coroutine_position expected_pos[] = {
+ {1, 1,}, {2, 1}, {1, 2}, {2, 2}, {1, 3}
+ };
+ do_order_test();
+ g_assert_cmpint(record_pos, ==, 5);
+ for (i = 0; i < record_pos; i++) {
+ g_assert_cmpint(records[i].func , ==, expected_pos[i].func );
+ g_assert_cmpint(records[i].state, ==, expected_pos[i].state);
+ }
+}
/*
* Lifecycle benchmark
*/
@@ -243,6 +296,7 @@ int main(int argc, char **argv)
g_test_add_func("/basic/nesting", test_nesting);
g_test_add_func("/basic/self", test_self);
g_test_add_func("/basic/in_coroutine", test_in_coroutine);
+ g_test_add_func("/basic/order", test_order);
if (g_test_perf()) {
g_test_add_func("/perf/lifecycle", perf_lifecycle);
g_test_add_func("/perf/nesting", perf_nesting);