/* * Copyright (C) 2011 Canonical Ltd * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authored by * Michal Hruby * */ #include "config.h" #include #include #include #include #include static void on_peer_found (DeePeer *peer, gchar *name, gint *n_peers) { (*n_peers)++; } static void on_peer_lost (DeePeer *peer, gchar *name, gint *n_peers) { (*n_peers)++; } static int peer_function (gchar *argv[]) { DeePeer *peer; gint n_peers = 0; peer = (DeePeer*) dee_client_new (argv[1]); g_signal_connect (peer, "peer-found", G_CALLBACK (on_peer_found), &n_peers); g_signal_connect (peer, "peer-lost", G_CALLBACK (on_peer_lost), &n_peers); if (gtx_wait_for_signal (G_OBJECT (peer), 10000, "notify::swarm-leader", NULL)) g_error ("Peer helper timed out waiting for swarm leader"); /* The main process should be swarm leaders. Not us */ g_assert_cmpint (0, ==, dee_peer_is_swarm_leader (peer)); /* At this point we shouldn't have emitted 'peer-found' yet */ g_assert_cmpint (0, ==, n_peers); if (gtx_wait_for_signal (G_OBJECT (peer), 10000, "peer-found", NULL)) g_error ("Peer helper timed out waiting for 'peer-found' signal"); g_assert_cmpint (1, ==, n_peers); g_assert_cmpint (1, ==, g_strv_length (dee_peer_list_peers (peer))); gtx_assert_last_unref (peer); return 0; } static gint finished_children = 0; static void child_exited (GPid pid, gint status, gpointer user_data) { finished_children++; } gint main (gint argc, gchar *argv[]) { int num_clients, i; #if !GLIB_CHECK_VERSION(2, 35, 1) g_type_init (); #endif if (argc < 3) g_error ("Invalid invocation"); num_clients = i = atoi (argv[2]); while (i-- > 0) { GPid pid = (GPid) fork (); if (pid != 0) g_child_watch_add (pid, child_exited, NULL); else { return peer_function (argv); } } for (i = 0; i < 10; i++) { gtx_yield_main_loop (200); if (finished_children == num_clients) break; } /* Give a window of opportunity for children to * flush stdout/err before we exit */ gtx_yield_main_loop (200); g_assert_cmpint (num_clients, ==, finished_children); return 0; }