[glib: 1/2] GSource: move test to glib/tests/




commit 70a8811cccc21526fa6875d9069a9cee3edb0649
Author: Nishal Kulkarni <nishalkulkarni gmail com>
Date:   Wed Dec 1 14:04:46 2021 +0530

    GSource: move test to glib/tests/
    
    Previously tests existed in two places,
    `$top_srcdir/tests/sources.c` contained additional tests,
    they have now been moved to `$top_srcdir/glib/tests/mainloop.c`
    and `$top_srcdir/tests/sources.c` was deleted.
    
    Related to: #1434

 glib/tests/mainloop.c | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/meson.build     |   1 -
 tests/sources.c       | 185 -------------------------------------------------
 3 files changed, 188 insertions(+), 186 deletions(-)
---
diff --git a/glib/tests/mainloop.c b/glib/tests/mainloop.c
index 7d4fc2d7e..25ef4f42e 100644
--- a/glib/tests/mainloop.c
+++ b/glib/tests/mainloop.c
@@ -1878,6 +1878,191 @@ test_nfds (void)
   g_main_context_unref (ctx);
 }
 
+static gboolean
+nsources_cb (gpointer user_data)
+{
+  g_assert_not_reached ();
+  return FALSE;
+}
+
+static void
+shuffle_nsources (GSource **sources, int num)
+{
+  int i, a, b;
+  GSource *tmp;
+
+  for (i = 0; i < num * 10; i++)
+    {
+      a = g_random_int_range (0, num);
+      b = g_random_int_range (0, num);
+      tmp = sources[a];
+      sources[a] = sources[b];
+      sources[b] = tmp;
+    }
+}
+
+static void
+test_nsources_same_priority (void)
+{
+  GMainContext *context;
+  GSource **sources;
+  gint64 start, end;
+  gsize n_sources = 50000, i;
+
+  context = g_main_context_default ();
+  sources = g_new0 (GSource *, n_sources);
+
+  start = g_get_monotonic_time ();
+  for (i = 0; i < n_sources; i++)
+    {
+      sources[i] = g_idle_source_new ();
+      g_source_set_callback (sources[i], nsources_cb, NULL, NULL);
+      g_source_attach (sources[i], context);
+    }
+  end = g_get_monotonic_time ();
+  g_test_message ("Add same-priority sources: %" G_GINT64_FORMAT,
+                  (end - start) / 1000);
+
+  start = g_get_monotonic_time ();
+  for (i = 0; i < n_sources; i++)
+    g_assert_true (sources[i] == g_main_context_find_source_by_id (context, g_source_get_id (sources[i])));
+  end = g_get_monotonic_time ();
+  g_test_message ("Find each source: %" G_GINT64_FORMAT,
+                  (end - start) / 1000);
+
+  shuffle_nsources (sources, n_sources);
+
+  start = g_get_monotonic_time ();
+  for (i = 0; i < n_sources; i++)
+    {
+      g_source_destroy (sources[i]);
+      g_source_unref (sources[i]);
+    }
+  end = g_get_monotonic_time ();
+  g_test_message ("Remove in random order: %" G_GINT64_FORMAT,
+                  (end - start) / 1000);
+
+  /* Make sure they really did get removed */
+  g_main_context_iteration (context, FALSE);
+
+  g_free (sources);
+}
+
+static void
+test_nsources_different_priority (void)
+{
+  GMainContext *context;
+  GSource **sources;
+  gint64 start, end;
+  gsize n_sources = 50000, i;
+
+  context = g_main_context_default ();
+  sources = g_new0 (GSource *, n_sources);
+
+  start = g_get_monotonic_time ();
+  for (i = 0; i < n_sources; i++)
+    {
+      sources[i] = g_idle_source_new ();
+      g_source_set_callback (sources[i], nsources_cb, NULL, NULL);
+      g_source_set_priority (sources[i], i % 100);
+      g_source_attach (sources[i], context);
+    }
+  end = g_get_monotonic_time ();
+  g_test_message ("Add different-priority sources: %" G_GINT64_FORMAT,
+                  (end - start) / 1000);
+
+  start = g_get_monotonic_time ();
+  for (i = 0; i < n_sources; i++)
+    g_assert_true (sources[i] == g_main_context_find_source_by_id (context, g_source_get_id (sources[i])));
+  end = g_get_monotonic_time ();
+  g_test_message ("Find each source: %" G_GINT64_FORMAT,
+                  (end - start) / 1000);
+
+  shuffle_nsources (sources, n_sources);
+
+  start = g_get_monotonic_time ();
+  for (i = 0; i < n_sources; i++)
+    {
+      g_source_destroy (sources[i]);
+      g_source_unref (sources[i]);
+    }
+  end = g_get_monotonic_time ();
+  g_test_message ("Remove in random order: %" G_GINT64_FORMAT,
+                  (end - start) / 1000);
+
+  /* Make sure they really did get removed */
+  g_main_context_iteration (context, FALSE);
+
+  g_free (sources);
+}
+
+static void
+thread_pool_attach_func (gpointer data,
+                         gpointer user_data)
+{
+  GMainContext *context = user_data;
+  GSource *source = data;
+
+  g_source_attach (source, context);
+  g_source_unref (source);
+}
+
+static void
+thread_pool_destroy_func (gpointer data,
+                          gpointer user_data)
+{
+  GSource *source = data;
+
+  g_source_destroy (source);
+}
+
+static void
+test_nsources_threadpool (void)
+{
+  GMainContext *context;
+  GSource **sources;
+  GThreadPool *pool;
+  GError *error = NULL;
+  gint64 start, end;
+  gsize n_sources = 50000, i;
+
+  context = g_main_context_default ();
+  sources = g_new0 (GSource *, n_sources);
+
+  pool = g_thread_pool_new (thread_pool_attach_func, context,
+                            20, TRUE, NULL);
+  start = g_get_monotonic_time ();
+  for (i = 0; i < n_sources; i++)
+    {
+      sources[i] = g_idle_source_new ();
+      g_source_set_callback (sources[i], nsources_cb, NULL, NULL);
+      g_thread_pool_push (pool, sources[i], &error);
+      g_assert_no_error (error);
+    }
+  g_thread_pool_free (pool, FALSE, TRUE);
+  end = g_get_monotonic_time ();
+  g_test_message ("Add sources from threads: %" G_GINT64_FORMAT,
+                  (end - start) / 1000);
+
+  pool = g_thread_pool_new (thread_pool_destroy_func, context,
+                            20, TRUE, NULL);
+  start = g_get_monotonic_time ();
+  for (i = 0; i < n_sources; i++)
+    {
+      g_thread_pool_push (pool, sources[i], &error);
+      g_assert_no_error (error);
+    }
+  g_thread_pool_free (pool, FALSE, TRUE);
+  end = g_get_monotonic_time ();
+  g_test_message ("Remove sources from threads: %" G_GINT64_FORMAT,
+                  (end - start) / 1000);
+
+  /* Make sure they really did get removed */
+  g_main_context_iteration (context, FALSE);
+
+  g_free (sources);
+}
+
 static gboolean source_finalize_called = FALSE;
 static guint source_dispose_called = 0;
 static gboolean source_dispose_recycle = FALSE;
@@ -2158,6 +2343,9 @@ main (int argc, char *argv[])
   g_test_init (&argc, &argv, NULL);
 
   g_test_add_func ("/maincontext/basic", test_maincontext_basic);
+  g_test_add_func ("/maincontext/nsources_same_priority", test_nsources_same_priority);
+  g_test_add_func ("/maincontext/nsources_different_priority", test_nsources_different_priority);
+  g_test_add_func ("/maincontext/nsources_threadpool", test_nsources_threadpool);
   g_test_add_func ("/maincontext/source_finalization", test_maincontext_source_finalization);
   for (i = 0; i < 10; i++)
     {
diff --git a/tests/meson.build b/tests/meson.build
index 1bb146afc..9317e57bc 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -35,7 +35,6 @@ tests = {
   'slice-threadinit' : {
     'dependencies' : [libgthread_dep],
   },
-  'sources' : {},
   'spawn-test' : {},
   'thread-test' : {},
   'threadpool-test' : {'suite' : ['slow']},


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]