From 6a5b055dd32fd6c70100fb54021238bf26dd3123 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 27 May 2015 10:00:17 -0500 Subject: Stealing the eventually code from indicator messages --- tests/media-player-user.cc | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tests/media-player-user.cc b/tests/media-player-user.cc index 8d2fcb1..23bed06 100644 --- a/tests/media-player-user.cc +++ b/tests/media-player-user.cc @@ -17,6 +17,9 @@ * Ted Gould */ +#include +#include + #include #include #include @@ -37,6 +40,8 @@ class MediaPlayerUserTest : public ::testing::Test GDBusConnection * system = NULL; GDBusProxy * proxy = NULL; + std::chrono::milliseconds _eventuallyTime = std::chrono::seconds{5}; + virtual void SetUp() { service = dbus_test_service_new(NULL); dbus_test_service_set_bus(service, DBUS_TEST_SERVICE_BUS_SYSTEM); @@ -95,8 +100,78 @@ class MediaPlayerUserTest : public ::testing::Test void set_property (const gchar * name, GVariant * value) { dbus_test_dbus_mock_object_update_property((DbusTestDbusMock *)service_mock, service_mock.get_sound(), name, value, NULL); } + + testing::AssertionResult expectEventually (std::function &testfunc) { + auto loop = std::shared_ptr(g_main_loop_new(nullptr, FALSE), [](GMainLoop * loop) { if (loop != nullptr) g_main_loop_unref(loop); }); + + std::promise retpromise; + auto retfuture = retpromise.get_future(); + auto start = std::chrono::steady_clock::now(); + + /* The core of the idle function as an object so we can use the C++-isms + of attaching the variables and make this code reasonably readable */ + std::function idlefunc = [&loop, &retpromise, &testfunc, &start, this]() -> void { + auto result = testfunc(); + + if (result == false && _eventuallyTime > (std::chrono::steady_clock::now() - start)) { + return; + } + + retpromise.set_value(result); + g_main_loop_quit(loop.get()); + }; + + auto idlesrc = g_idle_add([](gpointer data) -> gboolean { + auto func = reinterpret_cast *>(data); + (*func)(); + return G_SOURCE_CONTINUE; + }, &idlefunc); + + g_main_loop_run(loop.get()); + g_source_remove(idlesrc); + + return retfuture.get(); + } + + /* Eventually Helpers */ + #define _EVENTUALLY_HELPER(oper) \ + template testing::AssertionResult expectEventually##oper (Args&& ... args) { \ + std::function func = [&]() { \ + return testing::internal::CmpHelper##oper(std::forward(args)...); \ + }; \ + return expectEventually(func); \ + } + + _EVENTUALLY_HELPER(EQ); + _EVENTUALLY_HELPER(NE); + _EVENTUALLY_HELPER(LT); + _EVENTUALLY_HELPER(GT); + _EVENTUALLY_HELPER(STREQ); + _EVENTUALLY_HELPER(STRNE); + + #undef _EVENTUALLY_HELPER }; +/* Helpers */ +#define EXPECT_EVENTUALLY_EQ(expected, actual) \ + EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallyEQ, expected, actual) + +#define EXPECT_EVENTUALLY_NE(expected, actual) \ + EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallyNE, expected, actual) + +#define EXPECT_EVENTUALLY_LT(expected, actual) \ + EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallyLT, expected, actual) + +#define EXPECT_EVENTUALLY_GT(expected, actual) \ + EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallyGT, expected, actual) + +#define EXPECT_EVENTUALLY_STREQ(expected, actual) \ + EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallySTREQ, expected, actual) + +#define EXPECT_EVENTUALLY_STRNE(expected, actual) \ + EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallySTRNE, expected, actual) + + TEST_F(MediaPlayerUserTest, BasicObject) { MediaPlayerUser * player = media_player_user_new("user"); ASSERT_NE(nullptr, player); -- cgit v1.2.3 From 5b25b56f67582e9a0bd4a6bdf39d84cbca37ca6f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 27 May 2015 11:10:19 -0500 Subject: Switch to an eventually world --- tests/media-player-user.cc | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/tests/media-player-user.cc b/tests/media-player-user.cc index 23bed06..51e7a49 100644 --- a/tests/media-player-user.cc +++ b/tests/media-player-user.cc @@ -200,6 +200,11 @@ TEST_F(MediaPlayerUserTest, BasicObject) { g_clear_object(&player); } +void +running_update (GObject * obj, GParamSpec * pspec, bool * running) { + *running = media_player_get_is_running(MEDIA_PLAYER(obj)) == TRUE; +}; + TEST_F(MediaPlayerUserTest, DataSet) { /* Put data into Acts */ set_property("Timestamp", g_variant_new_uint64(g_get_monotonic_time())); @@ -216,11 +221,10 @@ TEST_F(MediaPlayerUserTest, DataSet) { MediaPlayerUser * player = media_player_user_new("user"); ASSERT_NE(nullptr, player); - /* Get the proxy -- and it's precious precious data -- oh, my, precious! */ - loop(100); - /* Ensure even with the proxy we don't have anything */ - EXPECT_TRUE(media_player_get_is_running(MEDIA_PLAYER(player))); + bool running = false; + g_signal_connect(G_OBJECT(player), "notify::is-running", G_CALLBACK(running_update), &running); + EXPECT_EVENTUALLY_EQ(true, running); EXPECT_TRUE(media_player_get_can_raise(MEDIA_PLAYER(player))); EXPECT_STREQ("user", media_player_get_id(MEDIA_PLAYER(player))); EXPECT_STREQ("The Player Formerly Known as Prince", media_player_get_name(MEDIA_PLAYER(player))); @@ -255,24 +259,25 @@ TEST_F(MediaPlayerUserTest, TimeoutTest) { set_property("Album", g_variant_new_string("Vinyl is dead")); set_property("ArtUrl", g_variant_new_string("http://art.url")); - /* Ensure the properties get set before we pull them */ - loop(100); - /* Build our media player */ MediaPlayerUser * player = media_player_user_new("user"); ASSERT_NE(nullptr, player); - /* Get the proxy -- and the old data, so old, like forever */ - loop(100); + bool running = false; + g_signal_connect(G_OBJECT(player), "notify::is-running", G_CALLBACK(running_update), &running); /* Ensure that we show up as not running */ - EXPECT_FALSE(media_player_get_is_running(MEDIA_PLAYER(player))); + EXPECT_EVENTUALLY_EQ(false, running); /* Update to make running */ set_property("Timestamp", g_variant_new_uint64(g_get_monotonic_time())); - loop(100); - EXPECT_TRUE(media_player_get_is_running(MEDIA_PLAYER(player))); + EXPECT_EVENTUALLY_EQ(true, running); + + /* Clear to not run */ + set_property("Timestamp", g_variant_new_uint64(1)); + + EXPECT_EVENTUALLY_EQ(false, running); g_clear_object(&in_icon); g_clear_object(&player); -- cgit v1.2.3 From ce5f08b92eb0af68088cf2cc517c1035419bf38c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 27 May 2015 11:11:52 -0500 Subject: Using eventually to avoid arbitrary timeouts in tests --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 4d0314b..827f5f5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +indicator-sound (12.10.2+15.10.20150507-0ubuntu2) wily; urgency=medium + + * Using eventually to avoid arbitrary timeouts in tests + + -- Ted Gould Wed, 27 May 2015 11:11:19 -0500 + indicator-sound (12.10.2+15.10.20150507-0ubuntu1) wily; urgency=medium [ Charles Kerr ] -- cgit v1.2.3 From 1f2effb760005ab21a7916708cfe2f52cacba6dc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 27 May 2015 11:19:00 -0500 Subject: Baking version number for PPA --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 827f5f5..f2f18e9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -indicator-sound (12.10.2+15.10.20150507-0ubuntu2) wily; urgency=medium +indicator-sound (12.10.2+15.10.20150507+eventually1-0ubuntu1) wily; urgency=medium * Using eventually to avoid arbitrary timeouts in tests -- cgit v1.2.3 From 83e25c49ed45d5e16667fe89eb2338f4c3593b52 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 27 May 2015 11:45:11 -0500 Subject: Adding in a session bus --- debian/changelog | 2 +- tests/media-player-user.cc | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/debian/changelog b/debian/changelog index f2f18e9..ddae1f3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -indicator-sound (12.10.2+15.10.20150507+eventually1-0ubuntu1) wily; urgency=medium +indicator-sound (12.10.2+15.10.20150507+eventually2-0ubuntu1) wily; urgency=medium * Using eventually to avoid arbitrary timeouts in tests diff --git a/tests/media-player-user.cc b/tests/media-player-user.cc index 51e7a49..12e967e 100644 --- a/tests/media-player-user.cc +++ b/tests/media-player-user.cc @@ -34,26 +34,42 @@ class MediaPlayerUserTest : public ::testing::Test { protected: - DbusTestService * service = NULL; + DbusTestService * testsystem = NULL; AccountsServiceMock service_mock; + DbusTestService * testsession = NULL; + GDBusConnection * system = NULL; + GDBusConnection * session = NULL; GDBusProxy * proxy = NULL; std::chrono::milliseconds _eventuallyTime = std::chrono::seconds{5}; virtual void SetUp() { - service = dbus_test_service_new(NULL); - dbus_test_service_set_bus(service, DBUS_TEST_SERVICE_BUS_SYSTEM); + /* System Bus */ + testsystem = dbus_test_service_new(NULL); + dbus_test_service_set_bus(testsystem, DBUS_TEST_SERVICE_BUS_SYSTEM); - dbus_test_service_add_task(service, (DbusTestTask*)service_mock); - dbus_test_service_start_tasks(service); + dbus_test_service_add_task(testsystem, (DbusTestTask*)service_mock); + dbus_test_service_start_tasks(testsystem); system = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL); ASSERT_NE(nullptr, system); g_dbus_connection_set_exit_on_close(system, FALSE); g_object_add_weak_pointer(G_OBJECT(system), (gpointer *)&system); + /* Session Bus */ + testsession = dbus_test_service_new(NULL); + dbus_test_service_set_bus(testsession, DBUS_TEST_SERVICE_BUS_SESSION); + + dbus_test_service_start_tasks(testsession); + + session = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL); + ASSERT_NE(nullptr, session); + g_dbus_connection_set_exit_on_close(session, FALSE); + g_object_add_weak_pointer(G_OBJECT(session), (gpointer *)&session); + + /* Setup proxy */ proxy = g_dbus_proxy_new_sync(system, G_DBUS_PROXY_FLAGS_NONE, NULL, @@ -66,9 +82,11 @@ class MediaPlayerUserTest : public ::testing::Test virtual void TearDown() { g_clear_object(&proxy); - g_clear_object(&service); + g_clear_object(&testsystem); + g_clear_object(&testsession); g_object_unref(system); + g_object_unref(session); #if 0 /* Accounts Service keeps a bunch of references around so we -- cgit v1.2.3 From 56f4bcf07cfd06bb7a13d5bdebc6111f57b9f0b3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 27 May 2015 13:59:34 -0500 Subject: Preset the value to ensure no race condition --- tests/media-player-user.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/media-player-user.cc b/tests/media-player-user.cc index 12e967e..28568d2 100644 --- a/tests/media-player-user.cc +++ b/tests/media-player-user.cc @@ -242,6 +242,7 @@ TEST_F(MediaPlayerUserTest, DataSet) { /* Ensure even with the proxy we don't have anything */ bool running = false; g_signal_connect(G_OBJECT(player), "notify::is-running", G_CALLBACK(running_update), &running); + running_update(G_OBJECT(player), nullptr, &running); EXPECT_EVENTUALLY_EQ(true, running); EXPECT_TRUE(media_player_get_can_raise(MEDIA_PLAYER(player))); EXPECT_STREQ("user", media_player_get_id(MEDIA_PLAYER(player))); @@ -283,6 +284,7 @@ TEST_F(MediaPlayerUserTest, TimeoutTest) { bool running = false; g_signal_connect(G_OBJECT(player), "notify::is-running", G_CALLBACK(running_update), &running); + running_update(G_OBJECT(player), nullptr, &running); /* Ensure that we show up as not running */ EXPECT_EVENTUALLY_EQ(false, running); -- cgit v1.2.3 From b830d51de707f2b3ce4722fe6a01bf8149b26e27 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 27 May 2015 13:59:59 -0500 Subject: Erg, PPAs --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index ddae1f3..e910f16 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -indicator-sound (12.10.2+15.10.20150507+eventually2-0ubuntu1) wily; urgency=medium +indicator-sound (12.10.2+15.10.20150507+eventually3-0ubuntu1) wily; urgency=medium * Using eventually to avoid arbitrary timeouts in tests -- cgit v1.2.3 From 3f933e4575281846afeb1a98c258bef19f15ab11 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 28 May 2015 08:47:18 -0500 Subject: Dumping the bus, old school style --- tests/media-player-user.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/media-player-user.cc b/tests/media-player-user.cc index 28568d2..ca20b5f 100644 --- a/tests/media-player-user.cc +++ b/tests/media-player-user.cc @@ -39,6 +39,9 @@ class MediaPlayerUserTest : public ::testing::Test DbusTestService * testsession = NULL; + DbusTestProcess * systemmonitor = nullptr; + DbusTestProcess * sessionmonitor = nullptr; + GDBusConnection * system = NULL; GDBusConnection * session = NULL; GDBusProxy * proxy = NULL; @@ -50,6 +53,11 @@ class MediaPlayerUserTest : public ::testing::Test testsystem = dbus_test_service_new(NULL); dbus_test_service_set_bus(testsystem, DBUS_TEST_SERVICE_BUS_SYSTEM); + systemmonitor = dbus_test_process_new("dbus-monitor"); + dbus_test_process_append_param(systemmonitor, "--system"); + dbus_test_task_set_name(DBUS_TEST_TASK(systemmonitor), "System"); + dbus_test_service_add_task(testsystem, DBUS_TEST_TASK(systemmonitor)); + dbus_test_service_add_task(testsystem, (DbusTestTask*)service_mock); dbus_test_service_start_tasks(testsystem); @@ -62,6 +70,11 @@ class MediaPlayerUserTest : public ::testing::Test testsession = dbus_test_service_new(NULL); dbus_test_service_set_bus(testsession, DBUS_TEST_SERVICE_BUS_SESSION); + sessionmonitor = dbus_test_process_new("dbus-monitor"); + dbus_test_process_append_param(sessionmonitor, "--session"); + dbus_test_task_set_name(DBUS_TEST_TASK(sessionmonitor), "Session"); + dbus_test_service_add_task(testsession, DBUS_TEST_TASK(sessionmonitor)); + dbus_test_service_start_tasks(testsession); session = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL); @@ -81,6 +94,9 @@ class MediaPlayerUserTest : public ::testing::Test } virtual void TearDown() { + g_clear_object(&sessionmonitor); + g_clear_object(&systemmonitor); + g_clear_object(&proxy); g_clear_object(&testsystem); g_clear_object(&testsession); -- cgit v1.2.3 From 52b6aaeede8ec6192844a5b9813f7509bd313b60 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 28 May 2015 08:47:33 -0500 Subject: For Launchpad --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index e910f16..c360efd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -indicator-sound (12.10.2+15.10.20150507+eventually3-0ubuntu1) wily; urgency=medium +indicator-sound (12.10.2+15.10.20150507+eventually4-0ubuntu1) wily; urgency=medium * Using eventually to avoid arbitrary timeouts in tests -- cgit v1.2.3