Update contrib.
1 /* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
8 #include <glib-object.h>
11 #include "glib_global.h"
12 #include "mrt2_glib2_test.h"
14 //#define TEST_STOP_EMISSION
27 #define G_TYPE_TEST (g_test_get_type ())
28 #define G_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
29 #define G_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
30 #define G_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
31 #define G_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
32 #define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
36 typedef struct _GTest GTest;
37 typedef struct _GTestClass GTestClass;
48 GObjectClass parent_class;
50 void (*test_signal1) (GTest * test, gint an_int);
51 void (*test_signal2) (GTest * test, gint an_int);
54 static GType g_test_get_type (void);
55 static volatile gboolean stopping;
57 /* Element signals and args */
72 static void g_test_class_init (GTestClass * klass);
73 static void g_test_init (GTest * test);
74 static void g_test_dispose (GObject * object);
76 static void signal2_handler (GTest * test, gint anint);
78 static void g_test_set_property (GObject * object, guint prop_id,
79 const GValue * value, GParamSpec * pspec);
80 static void g_test_get_property (GObject * object, guint prop_id,
81 GValue * value, GParamSpec * pspec);
83 static GObjectClass *parent_class = NULL;
85 static guint g_test_signals[LAST_SIGNAL] = { 0 };
88 g_test_get_type (void)
90 static GType test_type = 0;
93 static const GTypeInfo test_info = {
97 (GClassInitFunc) g_test_class_init,
102 (GInstanceInitFunc) g_test_init,
106 grand = g_rand_new();
108 test_type = g_type_register_static (G_TYPE_OBJECT, "GTest",
115 g_test_class_init (GTestClass * klass)
117 GObjectClass *gobject_class;
119 gobject_class = (GObjectClass *) klass;
121 parent_class = g_type_class_ref (G_TYPE_OBJECT);
123 if (!g_thread_supported ())
124 g_thread_init (NULL);
128 if (!g_thread_supported ())
129 g_thread_init (NULL);
130 #endif /*MULTITHREAD*/
134 gobject_class->dispose = g_test_dispose;
135 gobject_class->set_property = g_test_set_property;
136 gobject_class->get_property = g_test_get_property;
138 g_test_signals[TEST_SIGNAL1] =
139 g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass),
140 G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal1), NULL,
141 NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
142 g_test_signals[TEST_SIGNAL2] =
143 g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass),
144 G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal2), NULL,
145 NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
147 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP,
148 g_param_spec_int ("test-prop", "Test Prop", "Test property",
149 0, 1, 0, G_PARAM_READWRITE));
151 klass->test_signal2 = signal2_handler;
155 g_test_init (GTest * test)
158 g_print ("init %p\n", test);
162 g_print ("init %p\n", test);
171 g_test_dispose (GObject * object)
175 test = G_TEST (object);
177 g_print ("dispose %p!\n", object);
179 G_OBJECT_CLASS (parent_class)->dispose (object);
183 g_test_set_property (GObject * object, guint prop_id,
184 const GValue * value, GParamSpec * pspec)
188 test = G_TEST (object);
192 test->value = g_value_get_int (value);
195 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
201 g_test_get_property (GObject * object, guint prop_id,
202 GValue * value, GParamSpec * pspec)
206 test = G_TEST (object);
210 g_value_set_int (value, test->value);
213 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
219 g_test_do_signal1 (GTest * test)
221 g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL1], 0, 0);
225 signal2_handler (GTest * test, gint anint)
228 g_print ("Function: signal2_handler called\n");
235 g_test_do_signal2 (GTest * test)
237 g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL2], 0, 0);
241 g_test_do_prop (GTest * test)
243 test->value = g_rand_int (grand);
244 g_object_notify (G_OBJECT (test), "test-prop");
248 run_thread (GTest * test)
256 g_test_do_signal1 (test);
258 g_test_do_signal2 (test);
260 g_test_do_prop (test);
261 if ((i++ % 10000) == 0) {
263 g_thread_yield(); /*force context switch */
272 g_test_do_signal1 (test);
274 g_test_do_signal2 (test);
276 g_test_do_prop (test);
277 if ((i++ % 10/*000*/) == 0)
282 g_thread_yield(); /* force context switch */
286 for(i=0;i <= LOOP;i++)
289 g_test_do_signal1 (test);
291 g_test_do_signal2 (test);
293 g_test_do_prop (test);
299 #endif /*MULTITHREAD*/
310 notify (GObject *object, GParamSpec *spec, gpointer user_data)
316 g_print ("Function: notify called\n");
319 g_object_get (object, "test-prop", &value, NULL);
320 //g_print ("+ %d", value);
327 g_print ("Function: hook_function called\n");
334 main (int argc, char **argv)
337 GTest *test1, *test2;
338 GArray *test_threads;
339 const gint n_threads = 1;
342 g_log_set_handler (NULL, G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
343 g_set_print_handler(mrtPrintHandler);
346 g_thread_init (NULL);
349 g_print ("START: %s\n", argv[0]);
353 g_print ("START: %s\n", argv[0]);
357 g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
360 test1 = g_object_new (G_TYPE_TEST, NULL);
361 test2 = g_object_new (G_TYPE_TEST, NULL);
363 g_signal_connect (test1, "notify::test-prop", G_CALLBACK (notify), NULL);
364 g_signal_connect (test1, "test-signal1", G_CALLBACK (notify), NULL);
365 g_signal_connect (test1, "test-signal2", G_CALLBACK (notify), NULL);
371 test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
375 for (i = 0; i < n_threads; i++) {
378 thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
379 g_array_append_val (test_threads, thread);
381 thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
382 g_array_append_val (test_threads, thread);
388 g_print ("\nstopping\n");
390 /* join all threads */
391 for (i = 0; i < 2 * n_threads; i++) {
394 thread = g_array_index (test_threads, GThread *, i);
395 g_thread_join (thread);
398 g_print ("stopped:%d\n",TESTNUM);
403 test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
408 for (i = 0; i < n_threads; i++)
412 thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
413 g_array_append_val (test_threads, thread);
415 thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
416 g_array_append_val (test_threads, thread);
423 g_print ("\nstopping\n");
425 /* join all threads */
426 for (i = 0; i < 2 * n_threads; i++)
430 thread = g_array_index (test_threads, GThread *, i);
431 g_thread_join (thread);
434 g_assert(notifynum != 0);
435 g_assert(handlernum == 0);
437 g_array_free (test_threads, TRUE);
440 g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM);
445 test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
451 for (i = 0; i < n_threads; i++)
455 thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
456 g_array_append_val (test_threads, thread);
458 thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
459 g_array_append_val (test_threads, thread);
466 g_print ("\nstopping\n");
468 /* join all threads */
469 for (i = 0; i < 2 * n_threads; i++)
473 thread = g_array_index (test_threads, GThread *, i);
474 g_thread_join (thread);
477 g_assert(notifynum != 0);
478 g_assert(handlernum != 0);
480 g_array_free (test_threads, TRUE);
483 g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM);
487 test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
493 for (i = 0; i < n_threads; i++)
497 thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
498 g_array_append_val (test_threads, thread);
500 thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
501 g_array_append_val (test_threads, thread);
508 g_print ("\nstopping\n");
510 /* join all threads */
511 for (i = 0; i < 2 * n_threads; i++)
515 thread = g_array_index (test_threads, GThread *, i);
516 g_thread_join (thread);
519 g_assert(notifynum != 0);
520 g_assert(handlernum == 0);
522 g_array_free (test_threads, TRUE);
525 g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM);
528 #else /* ! MULTITHREAD*/
533 g_print ("\nStarting with TESTNUM=%d\n",TESTNUM);
539 g_assert(notifynum == LOOP +1);
540 g_assert(handlernum ==0);
545 g_assert(notifynum == 0);
546 g_assert(handlernum == 0);
550 g_print ("\nStarting with TESTNUM=%d\n",TESTNUM);
556 g_assert(notifynum == LOOP+1);
557 g_assert(handlernum == LOOP+1);
562 g_assert(notifynum == 0);
563 g_assert(handlernum == LOOP+1);
567 g_print ("\nStarting with TESTNUM=%d\n",TESTNUM);
573 g_assert(notifynum == LOOP +1);
574 g_assert(handlernum ==0);
579 g_assert(notifynum == 0);
580 g_assert(handlernum == 0);
582 g_assert(g_signal_has_handler_pending(G_OBJECT(test1),g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,TRUE)==TRUE);
583 g_assert(g_signal_has_handler_pending(G_OBJECT(test2),g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,TRUE)==FALSE);
585 g_assert(g_signal_handler_is_connected(G_OBJECT(test1),g_signal_lookup("test-signal1",G_TYPE_TEST))==TRUE);
586 g_assert(g_signal_handler_is_connected(G_OBJECT(test2),g_signal_lookup("test-signal2",G_TYPE_TEST))==FALSE);
588 handlernum=g_signal_lookup("test-signal1",G_TYPE_TEST);
590 g_print("Signal id: %d\n",handlernum);
593 g_signal_connect (test2, "test-signal1", G_CALLBACK (notify), NULL);
595 hookid=g_signal_add_emission_hook(handlernum,NULL,(GSignalEmissionHook) hook_function,NULL,NULL);
598 g_print("Hookid: %d\n",hookid);
600 /********************/
602 #ifdef TEST_STOP_EMISSION
606 g_print("The following call stops signal emission\n");
607 g_signal_stop_emission(G_OBJECT(test1),g_signal_lookup("test-signal1",G_TYPE_TEST),0);
609 g_print("The following call should abort and it is normal\n");
611 printf("Notifynum: %d and Handlernum: %d\n",notifynum,handlernum);
616 g_signal_stop_emission_by_name(G_OBJECT(test1),"test-signal1");
618 g_print("Notifynum: %d and Handlernum: %d\n",notifynum,handlernum);
621 #endif /*TEST_STOP_EMISSION*/
623 /*******************/
627 g_signal_emit(G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0);
628 g_signal_emit(G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0);
629 g_assert(handlernum==2);
632 g_signal_remove_emission_hook(g_signal_lookup("test-signal1",G_TYPE_TEST),hookid);
635 g_print("Emitting signal again after removing emission hook\n");
639 g_signal_emit (G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0);
640 g_signal_emit (G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0);
641 g_assert(handlernum==0);
643 g_assert (strcmp ("test-signal1", g_signal_name (g_signal_lookup("test-signal1",G_TYPE_TEST))) == 0);
644 g_assert (strcmp ("test-signal2", g_signal_name (g_signal_lookup("test-signal2",G_TYPE_TEST))) == 0);
647 memset(&gv,0,sizeof(gv));
648 g_value_init(&gv,G_TYPE_OBJECT);
649 g_value_set_object(&gv,test1);
652 g_signal_list_ids(G_OBJECT_TYPE(test1),&gi);
653 g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gi);
656 g_signal_emitv (&gv, g_test_signals[TEST_SIGNAL1], 0, &gv);
657 g_assert(notifynum==1);
659 g_signal_query(g_signal_lookup("test-signal1",G_TYPE_TEST),&gq);
660 g_assert(strcmp("test-signal1",gq.signal_name)==0);
661 g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gq.signal_id);
664 g_assert(g_signal_handler_find(G_OBJECT(test1), G_SIGNAL_RUN_LAST,g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,NULL,NULL,NULL)==2);
667 notifynum=g_signal_handlers_block_matched(G_OBJECT(test1),G_SIGNAL_MATCH_FUNC,g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,NULL,(gpointer)G_CALLBACK(notify),NULL);
668 handlernum=g_signal_handlers_unblock_matched(G_OBJECT(test1),G_SIGNAL_MATCH_FUNC,g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,NULL,(gpointer)G_CALLBACK(notify),NULL);
669 g_assert(notifynum==handlernum);
671 #endif /*MULTITHREAD*/
674 g_printf ("\nsignals.c: Completed all tests\n");
682 testResultXml("signals-multithread");
683 #endif /* EMULATOR */