I haven't retested this, I'll just assume all tests are passing this time, ACK. Christophe On Tue, Nov 19, 2013 at 04:14:24PM +0100, Marc-André Lureau wrote: > --- > tests/Makefile.am | 18 +++++--- > tests/coroutine.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 147 insertions(+), 7 deletions(-) > create mode 100644 tests/coroutine.c > > diff --git a/tests/Makefile.am b/tests/Makefile.am > index 9510e2c..6f80d93 100644 > --- a/tests/Makefile.am > +++ b/tests/Makefile.am > @@ -1,18 +1,22 @@ > NULL = > > -noinst_PROGRAMS = util > +noinst_PROGRAMS = \ > + coroutine \ > + util \ > + $(NULL) > + > TESTS = $(noinst_PROGRAMS) > > AM_CPPFLAGS = \ > $(GIO_CFLAGS) -I$(top_srcdir)/gtk \ > -DG_LOG_DOMAIN=\"GSpice\" \ > $(NULL) > -AM_LDFLAGS = $(GIO_LIBS) > > -util_SOURCES = \ > - $(top_srcdir)/gtk/spice-util-priv.h \ > - $(top_srcdir)/gtk/spice-util.c \ > - $(top_srcdir)/gtk/spice-util.h \ > - util.c \ > +AM_LDFLAGS = $(GIO_LIBS) -static > + > +LDADD = \ > + $(top_builddir)/gtk/libspice-client-glib-2.0.la \ > $(NULL) > > +util_SOURCES = util.c > +coroutine_SOURCES = coroutine.c > diff --git a/tests/coroutine.c b/tests/coroutine.c > new file mode 100644 > index 0000000..09bb74a > --- /dev/null > +++ b/tests/coroutine.c > @@ -0,0 +1,136 @@ > +#include <glib.h> > +#include <stdio.h> > +#include <string.h> > +#include <stdlib.h> > + > +#include "coroutine.h" > + > +static gpointer co_entry_check_self(gpointer data) > +{ > + g_assert(data == coroutine_self()); > + g_assert(!coroutine_self_is_main()); > + > + return NULL; > +} > + > +static gpointer co_entry_42(gpointer data) > +{ > + g_assert(GPOINTER_TO_INT(data) == 42); > + g_assert(!coroutine_self_is_main()); > + > + return GINT_TO_POINTER(0x42); > +} > + > +static void test_coroutine_simple(void) > +{ > + struct coroutine *self = coroutine_self(); > + struct coroutine co = { > + .stack_size = 16 << 20, > + .entry = co_entry_42, > + }; > + gpointer result; > + > + g_assert(coroutine_self_is_main()); > + > + g_assert(coroutine_init(&co) == 0); > + result = coroutine_yieldto(&co, GINT_TO_POINTER(42)); > + g_assert_cmpint(GPOINTER_TO_INT(result), ==, 0x42); > + > +#if GLIB_CHECK_VERSION(2,34,0) > + g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "*!to->exited*"); > + coroutine_yieldto(&co, GINT_TO_POINTER(42)); > + g_test_assert_expected_messages(); > +#endif > + > + g_assert(self == coroutine_self()); > + g_assert(coroutine_self_is_main()); > +} > + > +static gpointer co_entry_two(gpointer data) > +{ > + struct coroutine *self = coroutine_self(); > + struct coroutine co = { > + .stack_size = 16 << 20, > + .entry = co_entry_check_self, > + }; > + > + g_assert(!coroutine_self_is_main()); > + g_assert(coroutine_init(&co) == 0); > + coroutine_yieldto(&co, &co); > + > + g_assert(self == coroutine_self()); > + return NULL; > +} > + > +static void test_coroutine_two(void) > +{ > + struct coroutine *self = coroutine_self(); > + struct coroutine co = { > + .stack_size = 16 << 20, > + .entry = co_entry_two, > + }; > + > + g_assert(coroutine_init(&co) == 0); > + coroutine_yieldto(&co, NULL); > + > + g_assert(self == coroutine_self()); > +} > + > +static gpointer co_entry_yield(gpointer data) > +{ > + gpointer val; > + > + g_assert(data == NULL); > + val = coroutine_yield(GINT_TO_POINTER(1)); > + g_assert_cmpint(GPOINTER_TO_INT(val), ==, 2); > + > + g_assert(!coroutine_self_is_main()); > + > + val = coroutine_yield(GINT_TO_POINTER(3)); > + g_assert_cmpint(GPOINTER_TO_INT(val), ==, 4); > + > + return NULL; > +} > + > +static void test_coroutine_yield(void) > +{ > + struct coroutine *self = coroutine_self(); > + struct coroutine co = { > + .stack_size = 16 << 20, > + .entry = co_entry_yield, > + }; > + gpointer val; > + > + g_assert (coroutine_init(&co) == 0); > + val = coroutine_yieldto(&co, NULL); > + > + g_assert(self == coroutine_self()); > + g_assert_cmpint(GPOINTER_TO_INT(val), ==, 1); > + > + val = coroutine_yieldto(&co, GINT_TO_POINTER(2)); > + > + g_assert(self == coroutine_self()); > + g_assert_cmpint(GPOINTER_TO_INT(val), ==, 3); > + > + val = coroutine_yieldto(&co, GINT_TO_POINTER(4)); > + > + g_assert(self == coroutine_self()); > + g_assert(val == NULL); > + > +#if GLIB_CHECK_VERSION(2,34,0) > + g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "*!to->exited*"); > + coroutine_yieldto(&co, GINT_TO_POINTER(42)); > + g_test_assert_expected_messages(); > +#endif > +} > + > +int main(int argc, char* argv[]) > +{ > + g_test_init(&argc, &argv, NULL); > + > + g_test_add_func("/coroutine/simple", test_coroutine_simple); > + g_test_add_func("/coroutine/two", test_coroutine_two); > + g_test_add_func("/coroutine/yield", test_coroutine_yield); > + > + return g_test_run (); > +} > -- > 1.8.3.1 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel
Attachment:
pgp0m2fmyiykc.pgp
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel