/* * Copyright (C) 2010 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 Mikkel Kamstrup Erlandsen * */ #include #include #include #include #define TIMEOUT 100 #define PEER_NAME "com.canonical.Dee.Peer.Tests.Interactions" /* A command line that launches the appropriate peer-helper-* executable, * giving $name as first argument */ #define PEER_HELPER(helper,name) \ (gchar *[]) { "./peer-helper-"#helper, name, NULL } typedef struct { DeePeer *peer; } Fixture; static void peer_setup (Fixture *fix, gconstpointer data); static void peer_teardown (Fixture *fix, gconstpointer data); static void test_allocation (Fixture *fix, gconstpointer data); static void test_become_leader (Fixture *fix, gconstpointer data); static void test_1peer (Fixture *fix, gconstpointer data); void test_peer_interactions_create_suite (void) { #define DOMAIN "/Peer/Interactions" g_test_add (DOMAIN"/Allocation", Fixture, 0, peer_setup, test_allocation, peer_teardown); g_test_add (DOMAIN"/BecomeLeader", Fixture, 0, peer_setup, test_become_leader, peer_teardown); g_test_add (DOMAIN"/OnePeer", Fixture, 0, peer_setup, test_1peer, peer_teardown); } static void peer_setup (Fixture *fix, gconstpointer data) { fix->peer = dee_peer_new (PEER_NAME); g_assert_cmpint (0, ==, dee_peer_is_swarm_leader (fix->peer)); g_assert (DEE_IS_PEER (fix->peer)); } static void peer_teardown (Fixture *fix, gconstpointer data) { gtx_assert_last_unref (fix->peer); /* Spin the mainloop a bit to check if we have any post-test * async effect crashing us */ gtx_yield_main_loop (200); } static void test_allocation (Fixture *fix, gconstpointer data) { /* Do nothing, this test basically just asserts that * the fix->peer is cleaned up after immediate construction */ } static void test_become_leader (Fixture *fix, gconstpointer data) { gtx_wait_for_signal (G_OBJECT (fix->peer), TIMEOUT, "notify::swarm-leader", NULL); /* Assert that we have become swarm leaders. * No other peers should be running */ g_assert_cmpint (0, !=, dee_peer_is_swarm_leader (fix->peer)); } static void test_1peer (Fixture *fix, gconstpointer data) { /* Wait for us to become swarm leaders */ gtx_wait_for_signal (G_OBJECT (fix->peer), TIMEOUT, "notify::swarm-leader", NULL); g_assert_cmpint (0, !=, dee_peer_is_swarm_leader (fix->peer)); /* We are now leaders - launch the helper */ if (gtx_wait_for_command (TESTDIR, PEER_HELPER (1peer, PEER_NAME), 1000)) g_critical ("Peer helper timed out"); gtx_assert_last_command_status (0); }