From 41259bd708b7c0bd7f3ffb8d5e44b865f7062b43 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 5 Feb 2015 09:30:17 -0600 Subject: Adding a basic mock outline --- tests/notifications-mock.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/notifications-mock.h (limited to 'tests') diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h new file mode 100644 index 0000000..5b7206a --- /dev/null +++ b/tests/notifications-mock.h @@ -0,0 +1,52 @@ +/* + * Copyright © 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 3. + * + * 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 . + * + * Authors: + * Ted Gould + */ + +#include + +class NotificationsMock +{ + DbusTestDbusMock * mock = nullptr; + + public: + AccountsServiceMock () { + mock = dbus_test_dbus_mock_new("org.freedesktop.Notifications"); + dbus_test_task_set_bus(DBUS_TEST_TASK(mock), DBUS_TEST_SERVICE_BUS_SESSION); + } + + ~AccountsServiceMock () { + g_debug("Destroying the Accounts Service Mock"); + g_clear_object(&mock); + } + + operator std::shared_ptr () { + return std::make_shared(g_object_ref(mock), [](DbusTestTask * task) { g_clear_object(&task); }); + } + + operator DbusTestTask* () { + return DBUS_TEST_TASK(mock); + } + + operator DbusTestDbusMock* () { + return mock; + } + + DbusTestDbusMockObject * get_sound () { + return soundobj; + } +}; -- cgit v1.2.3 From ca507bc64f0ad0aa399fc7e54bf7a13cc2d94678 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 5 Feb 2015 09:39:27 -0600 Subject: Connecting into the indicator test --- tests/indicator-test.cc | 6 ++++++ tests/notifications-mock.h | 12 +++++------- 2 files changed, 11 insertions(+), 7 deletions(-) (limited to 'tests') diff --git a/tests/indicator-test.cc b/tests/indicator-test.cc index 636db1d..97c4948 100644 --- a/tests/indicator-test.cc +++ b/tests/indicator-test.cc @@ -22,6 +22,7 @@ #include "indicator-fixture.h" #include "accounts-service-mock.h" +#include "notifications-mock.h" class IndicatorTest : public IndicatorFixture { @@ -32,6 +33,7 @@ protected: } std::shared_ptr as; + std::shared_ptr notification; virtual void SetUp() override { @@ -45,12 +47,16 @@ protected: as = std::make_shared(); addMock(*as); + notification = std::make_shared(); + addMock(*notification); + IndicatorFixture::SetUp(); } virtual void TearDown() override { as.reset(); + notification.reset(); IndicatorFixture::TearDown(); } diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h index 5b7206a..ef5acd4 100644 --- a/tests/notifications-mock.h +++ b/tests/notifications-mock.h @@ -24,18 +24,20 @@ class NotificationsMock DbusTestDbusMock * mock = nullptr; public: - AccountsServiceMock () { + NotificationsMock () { mock = dbus_test_dbus_mock_new("org.freedesktop.Notifications"); dbus_test_task_set_bus(DBUS_TEST_TASK(mock), DBUS_TEST_SERVICE_BUS_SESSION); + dbus_test_task_set_name(DBUS_TEST_TASK(mock), "Notifications"); } - ~AccountsServiceMock () { + ~NotificationsMock () { g_debug("Destroying the Accounts Service Mock"); g_clear_object(&mock); } operator std::shared_ptr () { - return std::make_shared(g_object_ref(mock), [](DbusTestTask * task) { g_clear_object(&task); }); + std::shared_ptr retval(DBUS_TEST_TASK(g_object_ref(mock)), [](DbusTestTask * task) { g_clear_object(&task); }); + return retval; } operator DbusTestTask* () { @@ -45,8 +47,4 @@ class NotificationsMock operator DbusTestDbusMock* () { return mock; } - - DbusTestDbusMockObject * get_sound () { - return soundobj; - } }; -- cgit v1.2.3 From 6ac4cc8173c25b12cf8c18869f7d1e142c28ad44 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Feb 2015 08:16:34 -0600 Subject: Add in capabilities support --- tests/notifications-mock.h | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h index ef5acd4..48da344 100644 --- a/tests/notifications-mock.h +++ b/tests/notifications-mock.h @@ -24,10 +24,18 @@ class NotificationsMock DbusTestDbusMock * mock = nullptr; public: - NotificationsMock () { + NotificationsMock (std::vector capabilities = {"body", "body-markup", "icon-static", "image/svg+xml", "x-canonical-private-synchronous", "x-canonical-append", "x-canonical-private-icon-only", "x-canonical-truncation", "private-synchronous", "append", "private-icon-only", "truncation"}) { mock = dbus_test_dbus_mock_new("org.freedesktop.Notifications"); dbus_test_task_set_bus(DBUS_TEST_TASK(mock), DBUS_TEST_SERVICE_BUS_SESSION); - dbus_test_task_set_name(DBUS_TEST_TASK(mock), "Notifications"); + dbus_test_task_set_name(DBUS_TEST_TASK(mock), "Notify"); + + DbusTestDbusMockObject * baseobj =dbus_test_dbus_mock_get_object(mock, "/org/freedesktop/Notifications", "org.freedesktop.Notifications", NULL); + + std::string capspython("ret = "); + capspython += vector2py(capabilities); + dbus_test_dbus_mock_object_add_method(mock, baseobj, + "GetCapabilities", NULL, G_VARIANT_TYPE("as"), + capspython.c_str(), NULL); } ~NotificationsMock () { @@ -35,6 +43,22 @@ class NotificationsMock g_clear_object(&mock); } + std::string vector2py (std::vector vect) { + std::string retval("[ "); + + std::for_each(vect.begin(), vect.end() - 1, [&retval](std::string entry) { + retval += "'"; + retval += entry; + retval += "', "; + }); + + retval += "'"; + retval += *(vect.end() - 1); + retval += "']"; + + return retval; + } + operator std::shared_ptr () { std::shared_ptr retval(DBUS_TEST_TASK(g_object_ref(mock)), [](DbusTestTask * task) { g_clear_object(&task); }); return retval; -- cgit v1.2.3 From 4d580e2c10e2df20480efc99c0c85367aae4d49e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 13:45:21 -0600 Subject: Support getting the notifications back out --- tests/notifications-mock.h | 69 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h index 48da344..6abe9d8 100644 --- a/tests/notifications-mock.h +++ b/tests/notifications-mock.h @@ -16,12 +16,16 @@ * Authors: * Ted Gould */ +#include +#include +#include #include class NotificationsMock { DbusTestDbusMock * mock = nullptr; + DbusTestDbusMockObject * baseobj = nullptr; public: NotificationsMock (std::vector capabilities = {"body", "body-markup", "icon-static", "image/svg+xml", "x-canonical-private-synchronous", "x-canonical-append", "x-canonical-private-icon-only", "x-canonical-truncation", "private-synchronous", "append", "private-icon-only", "truncation"}) { @@ -29,13 +33,17 @@ class NotificationsMock dbus_test_task_set_bus(DBUS_TEST_TASK(mock), DBUS_TEST_SERVICE_BUS_SESSION); dbus_test_task_set_name(DBUS_TEST_TASK(mock), "Notify"); - DbusTestDbusMockObject * baseobj =dbus_test_dbus_mock_get_object(mock, "/org/freedesktop/Notifications", "org.freedesktop.Notifications", NULL); + baseobj =dbus_test_dbus_mock_get_object(mock, "/org/freedesktop/Notifications", "org.freedesktop.Notifications", NULL); std::string capspython("ret = "); capspython += vector2py(capabilities); dbus_test_dbus_mock_object_add_method(mock, baseobj, "GetCapabilities", NULL, G_VARIANT_TYPE("as"), capspython.c_str(), NULL); + + dbus_test_dbus_mock_object_add_method(mock, baseobj, + "Notify", NULL, G_VARIANT_TYPE("(susssasa{sv}i)"), + "ret = 10", NULL); } ~NotificationsMock () { @@ -71,4 +79,63 @@ class NotificationsMock operator DbusTestDbusMock* () { return mock; } + + struct Notification { + std::string app_name; + unsigned int replace_id; + std::string app_icon; + std::string summary; + std::string body; + std::vector actions; + std::map> hints; + int timeout; + }; + + std::shared_ptr childGet (GVariant * tuple, gsize index) { + return std::shared_ptr(g_variant_get_child_value(tuple, index), + [](GVariant * v){ if (v != nullptr) g_variant_unref(v); }); + } + + std::vector getNotifications (void) { + std::vector notifications; + + unsigned int cnt, i; + auto calls = dbus_test_dbus_mock_object_get_method_calls(mock, baseobj, "Notify", &cnt, NULL); + + for (i = 0; i < cnt; i++) { + auto call = calls[i]; + Notification notification; + + notification.app_name = g_variant_get_string(childGet(call.params, 0).get(), nullptr); + notification.replace_id = g_variant_get_uint32(childGet(call.params, 1).get()); + notification.app_icon = g_variant_get_string(childGet(call.params, 2).get(), nullptr); + notification.summary = g_variant_get_string(childGet(call.params, 3).get(), nullptr); + notification.body = g_variant_get_string(childGet(call.params, 4).get(), nullptr); + notification.timeout = g_variant_get_int32(childGet(call.params, 7).get()); + + auto vactions = childGet(call.params, 5); + GVariantIter iactions = {0}; + g_variant_iter_init(&iactions, vactions.get()); + const gchar * action = NULL; + while (g_variant_iter_loop(&iactions, "&s", &action)) { + std::string saction(action); + notification.actions.push_back(saction); + } + + auto vhints = childGet(call.params, 6); + GVariantIter ihints = {0}; + g_variant_iter_init(&ihints, vhints.get()); + const gchar * hint_key = NULL; + GVariant * hint_value = NULL; + while (g_variant_iter_loop(&ihints, "{&sv}", &hint_key, &hint_value)) { + std::string key(hint_key); + std::shared_ptr value(g_variant_ref(hint_value), [](GVariant * v){ if (v != nullptr) g_variant_unref(v); }); + notification.hints[key] = value; + } + + notifications.push_back(notification); + } + + return notifications; + } }; -- cgit v1.2.3 From ea846294e73c242b6574085533a9899a585eecf9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 14:14:15 -0600 Subject: Switch to testing the pulse backend --- tests/volume-control-test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/volume-control-test.cc b/tests/volume-control-test.cc index 9970241..41e1886 100644 --- a/tests/volume-control-test.cc +++ b/tests/volume-control-test.cc @@ -71,13 +71,13 @@ class VolumeControlTest : public ::testing::Test }; TEST_F(VolumeControlTest, BasicObject) { - VolumeControl * control = volume_control_new(); + VolumeControlPulse * control = volume_control_pulse_new(); /* Setup the PA backend */ loop(100); /* Ready */ - EXPECT_TRUE(volume_control_get_ready(control)); + EXPECT_TRUE(volume_control_get_ready(VOLUME_CONTROL(control))); g_clear_object(&control); } -- cgit v1.2.3 From 6808a4cb98497c61e3d6a202f94f09469f7a20a2 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 15:25:54 -0600 Subject: Creating a skeleton to start testing --- tests/CMakeLists.txt | 21 +++++++++++ tests/notifications-mock.h | 2 + tests/notifications-test.cc | 91 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 tests/notifications-test.cc (limited to 'tests') diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 38a76ae..f6f8644 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -65,6 +65,10 @@ vala_add(vala-mocks media-player-mock.vala ) +vala_add(vala-mocks + volume-control-mock.vala +) + vala_finish(vala-mocks SOURCES vala_mocks_VALA_SOURCES @@ -183,6 +187,23 @@ target_link_libraries ( add_test(sound-menu-test sound-menu-test) +########################### +# Notification Test +########################### + +include_directories(${CMAKE_SOURCE_DIR}/src) +add_executable (notifications-test notifications-test.cc) +target_link_libraries ( + notifications-test + indicator-sound-service-lib + vala-mocks-lib + gtest + ${SOUNDSERVICE_LIBRARIES} + ${TEST_LIBRARIES} +) + +add_test(notifications-test notifications-test) + ########################### # Accounts Service User ########################### diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h index 6abe9d8..0298f8c 100644 --- a/tests/notifications-mock.h +++ b/tests/notifications-mock.h @@ -16,6 +16,8 @@ * Authors: * Ted Gould */ + +#include #include #include #include diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc new file mode 100644 index 0000000..05a5da5 --- /dev/null +++ b/tests/notifications-test.cc @@ -0,0 +1,91 @@ +/* + * Copyright © 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 3. + * + * 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 . + * + * Authors: + * Ted Gould + */ + +#include +#include +#include + +#include "notifications-mock.h" + +extern "C" { +#include "indicator-sound-service.h" +#include "vala-mocks.h" +} + +class NotificationsTest : public ::testing::Test +{ + protected: + DbusTestService * service = NULL; + DbusTestDbusMock * mock = NULL; + + GDBusConnection * session = NULL; + std::shared_ptr notifications; + + virtual void SetUp() { + service = dbus_test_service_new(NULL); + dbus_test_service_set_bus(service, DBUS_TEST_SERVICE_BUS_BOTH); + + notifications = std::make_shared(); + + dbus_test_service_add_task(service, (DbusTestTask*)*notifications); + dbus_test_service_start_tasks(service); + + session = g_bus_get_sync(G_BUS_TYPE_SESSION, 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); + } + + virtual void TearDown() { + g_clear_object(&mock); + g_clear_object(&service); + + g_object_unref(session); + + unsigned int cleartry = 0; + while (session != NULL && cleartry < 100) { + loop(100); + cleartry++; + } + + ASSERT_EQ(nullptr, session); + } + + static gboolean timeout_cb (gpointer user_data) { + GMainLoop * loop = static_cast(user_data); + g_main_loop_quit(loop); + return G_SOURCE_REMOVE; + } + + void loop (unsigned int ms) { + GMainLoop * loop = g_main_loop_new(NULL, FALSE); + g_timeout_add(ms, timeout_cb, loop); + g_main_loop_run(loop); + g_main_loop_unref(loop); + } + + static int unref_idle (gpointer user_data) { + g_variant_unref(static_cast(user_data)); + return G_SOURCE_REMOVE; + } +}; + +TEST_F(NotificationsTest, BasicObject) { + +} -- cgit v1.2.3 From 50ce4102a1a6853fb0a9c375ca4edf6dce5e2484 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 15:32:14 -0600 Subject: A mock media player list --- tests/CMakeLists.txt | 4 ++++ tests/media-player-list-mock.vala | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 tests/media-player-list-mock.vala (limited to 'tests') diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f6f8644..4e3cdfa 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -65,6 +65,10 @@ vala_add(vala-mocks media-player-mock.vala ) +vala_add(vala-mocks + media-player-list-mock.vala +) + vala_add(vala-mocks volume-control-mock.vala ) diff --git a/tests/media-player-list-mock.vala b/tests/media-player-list-mock.vala new file mode 100644 index 0000000..44a6ae6 --- /dev/null +++ b/tests/media-player-list-mock.vala @@ -0,0 +1,25 @@ +/* + * Copyright © 2014 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 3. + * + * 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 . + * + * Authors: + * Ted Gould + */ + +public class MediaPlayerListMock : MediaPlayerList { + public override MediaPlayerList.Iterator iterator () { return new MediaPlayerList.Iterator(); } + + public override void sync (string[] ids) { return; } +} + -- cgit v1.2.3 From e1f522fc6d3cb172df021be150454bbeb5602ac7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 16:04:51 -0600 Subject: The file too --- tests/volume-control-mock.vala | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 tests/volume-control-mock.vala (limited to 'tests') diff --git a/tests/volume-control-mock.vala b/tests/volume-control-mock.vala new file mode 100644 index 0000000..ba5475c --- /dev/null +++ b/tests/volume-control-mock.vala @@ -0,0 +1,39 @@ +/* + * -*- Mode:Vala; indent-tabs-mode:t; tab-width:4; encoding:utf8 -*- + * Copyright © 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 3. + * + * 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 . + * + * Authors: + * Ted Gould + */ + +public class VolumeControlMock : VolumeControl +{ + public override string stream { get { return ""; } } + public override bool ready { get { return false; } set { } } + public override bool active_mic { get { return false; } set { } } + public override bool high_volume { get { return false; } } + public override bool mute { get { return false; } } + public override bool is_playing { get { return false; } } + public override double volume { get { return 0.0; } set { } } + public override double mic_volume { get { return 0.0; } set { } } + + public override void set_mute (bool mute) { + + } + + public VolumeControlMock() { + ready = true; + } +} -- cgit v1.2.3 From 99ccf6fa240695e7b5f22bcc2637d5f72c96d241 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 16:10:22 -0600 Subject: Connect the tests together. --- tests/CMakeLists.txt | 1 + tests/notifications-test.cc | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4e3cdfa..6e30bf5 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -201,6 +201,7 @@ target_link_libraries ( notifications-test indicator-sound-service-lib vala-mocks-lib + pulse-mock gtest ${SOUNDSERVICE_LIBRARIES} ${TEST_LIBRARIES} diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 05a5da5..6e531fd 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -17,6 +17,8 @@ * Ted Gould */ +#include + #include #include #include @@ -39,7 +41,7 @@ class NotificationsTest : public ::testing::Test virtual void SetUp() { service = dbus_test_service_new(NULL); - dbus_test_service_set_bus(service, DBUS_TEST_SERVICE_BUS_BOTH); + dbus_test_service_set_bus(service, DBUS_TEST_SERVICE_BUS_SESSION); notifications = std::make_shared(); @@ -87,5 +89,10 @@ class NotificationsTest : public ::testing::Test }; TEST_F(NotificationsTest, BasicObject) { + auto playerList = std::shared_ptr(MEDIA_PLAYER_LIST(media_player_list_mock_new()), [](MediaPlayerList * list){g_clear_object(&list);}); + auto volumeControl = std::shared_ptr(VOLUME_CONTROL(volume_control_mock_new()), [](VolumeControl * control){g_clear_object(&control);}); + auto soundService = std::shared_ptr(indicator_sound_service_new(playerList.get(), volumeControl.get()), [](IndicatorSoundService * service){g_clear_object(&service);}); + /* Give some time settle */ + loop(50); } -- cgit v1.2.3 From 043af330ce48ea89d820e50c1f915ac9a9b278c6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 16:35:05 -0600 Subject: Make it so that the accounts service object is made outside of the service object --- tests/notifications-test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 6e531fd..c738027 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -91,7 +91,7 @@ class NotificationsTest : public ::testing::Test TEST_F(NotificationsTest, BasicObject) { auto playerList = std::shared_ptr(MEDIA_PLAYER_LIST(media_player_list_mock_new()), [](MediaPlayerList * list){g_clear_object(&list);}); auto volumeControl = std::shared_ptr(VOLUME_CONTROL(volume_control_mock_new()), [](VolumeControl * control){g_clear_object(&control);}); - auto soundService = std::shared_ptr(indicator_sound_service_new(playerList.get(), volumeControl.get()), [](IndicatorSoundService * service){g_clear_object(&service);}); + auto soundService = std::shared_ptr(indicator_sound_service_new(playerList.get(), volumeControl.get(), nullptr), [](IndicatorSoundService * service){g_clear_object(&service);}); /* Give some time settle */ loop(50); -- cgit v1.2.3 From 53fe663dc4bc02731246a75b5ef2b0c4e356063f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 16:45:39 -0600 Subject: Remove an unused variable --- tests/notifications-test.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index c738027..1b231eb 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -34,7 +34,6 @@ class NotificationsTest : public ::testing::Test { protected: DbusTestService * service = NULL; - DbusTestDbusMock * mock = NULL; GDBusConnection * session = NULL; std::shared_ptr notifications; @@ -55,7 +54,7 @@ class NotificationsTest : public ::testing::Test } virtual void TearDown() { - g_clear_object(&mock); + notifications.reset(); g_clear_object(&service); g_object_unref(session); -- cgit v1.2.3 From 92658ca183935e2691acfe84be1464b0b9d43259 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 17:04:12 -0600 Subject: Initialize notify, which is normally done in the main --- tests/notifications-test.cc | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 1b231eb..c2680ab 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -22,6 +22,7 @@ #include #include #include +#include #include "notifications-mock.h" @@ -51,9 +52,15 @@ class NotificationsTest : public ::testing::Test ASSERT_NE(nullptr, session); g_dbus_connection_set_exit_on_close(session, FALSE); g_object_add_weak_pointer(G_OBJECT(session), (gpointer *)&session); + + /* This is done in main.c */ + notify_init("indicator-sound"); } virtual void TearDown() { + if (notify_is_initted()) + notify_uninit(); + notifications.reset(); g_clear_object(&service); -- cgit v1.2.3 From 21f2318408b8a179d547ccde45ab38fc5d4367ef Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 22:54:58 -0600 Subject: Make sure to use the testing gsettings --- tests/notifications-test.cc | 3 +++ 1 file changed, 3 insertions(+) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index c2680ab..708061e 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -40,6 +40,9 @@ class NotificationsTest : public ::testing::Test std::shared_ptr notifications; virtual void SetUp() { + g_setenv("GSETTINGS_SCHEMA_DIR", SCHEMA_DIR, TRUE); + g_setenv("GSETTINGS_BACKEND", "memory", TRUE); + service = dbus_test_service_new(NULL); dbus_test_service_set_bus(service, DBUS_TEST_SERVICE_BUS_SESSION); -- cgit v1.2.3 From 2881e3723f86dc21a1deb144803645c9df8e0f0d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 23:08:13 -0600 Subject: Fix string --- tests/notifications-mock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h index 0298f8c..e9318d1 100644 --- a/tests/notifications-mock.h +++ b/tests/notifications-mock.h @@ -49,7 +49,7 @@ class NotificationsMock } ~NotificationsMock () { - g_debug("Destroying the Accounts Service Mock"); + g_debug("Destroying the Notifications Mock"); g_clear_object(&mock); } -- cgit v1.2.3 From 627d27b6bed6f3238f3c87fc8f3c9dcb808d3c27 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Feb 2015 23:08:27 -0600 Subject: Test to ensure we get a notification --- tests/notifications-test.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 708061e..3b54a95 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -104,4 +104,23 @@ TEST_F(NotificationsTest, BasicObject) { /* Give some time settle */ loop(50); + + /* Auto free */ +} + +TEST_F(NotificationsTest, VolumeChanges) { + auto playerList = std::shared_ptr(MEDIA_PLAYER_LIST(media_player_list_mock_new()), [](MediaPlayerList * list){g_clear_object(&list);}); + auto volumeControl = std::shared_ptr(VOLUME_CONTROL(volume_control_mock_new()), [](VolumeControl * control){g_clear_object(&control);}); + auto soundService = std::shared_ptr(indicator_sound_service_new(playerList.get(), volumeControl.get(), nullptr), [](IndicatorSoundService * service){g_clear_object(&service);}); + + loop(50); + + volume_control_set_volume(volumeControl.get(), 50.0); + + loop(50); + + auto notev = notifications->getNotifications(); + + ASSERT_EQ(1, notev.size()); + EXPECT_EQ("indicator-sound", notev[0].app_name); } -- cgit v1.2.3 From d86b21181d8812cbb32f4a4f6375d9595d4d7aa9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 10 Feb 2015 10:55:39 -0600 Subject: Store values in the volume control mock --- tests/volume-control-mock.vala | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'tests') diff --git a/tests/volume-control-mock.vala b/tests/volume-control-mock.vala index ba5475c..e1b6fc1 100644 --- a/tests/volume-control-mock.vala +++ b/tests/volume-control-mock.vala @@ -20,14 +20,18 @@ public class VolumeControlMock : VolumeControl { - public override string stream { get { return ""; } } - public override bool ready { get { return false; } set { } } - public override bool active_mic { get { return false; } set { } } - public override bool high_volume { get { return false; } } - public override bool mute { get { return false; } } - public override bool is_playing { get { return false; } } - public override double volume { get { return 0.0; } set { } } - public override double mic_volume { get { return 0.0; } set { } } + public string mock_stream { get; set; } + public override string stream { get { return mock_stream; } } + public override bool ready { get; set; } + public override bool active_mic { get; set; } + public bool mock_high_volume { get; set; } + public override bool high_volume { get { return mock_high_volume; } } + public bool mock_mute { get; set; } + public override bool mute { get { return mock_mute; } } + public bool mock_is_playing { get; set; } + public override bool is_playing { get { return mock_is_playing; } } + public override double volume { get; set; } + public override double mic_volume { get; set; } public override void set_mute (bool mute) { -- cgit v1.2.3 From b6e5f6ee48849f7077239653c3c574ba5f9254ee Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 10 Feb 2015 11:09:55 -0600 Subject: Fleshing out the mock some more --- tests/notifications-mock.h | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'tests') diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h index e9318d1..0cdcbe5 100644 --- a/tests/notifications-mock.h +++ b/tests/notifications-mock.h @@ -35,17 +35,25 @@ class NotificationsMock dbus_test_task_set_bus(DBUS_TEST_TASK(mock), DBUS_TEST_SERVICE_BUS_SESSION); dbus_test_task_set_name(DBUS_TEST_TASK(mock), "Notify"); - baseobj =dbus_test_dbus_mock_get_object(mock, "/org/freedesktop/Notifications", "org.freedesktop.Notifications", NULL); + baseobj =dbus_test_dbus_mock_get_object(mock, "/org/freedesktop/Notifications", "org.freedesktop.Notifications", nullptr); std::string capspython("ret = "); capspython += vector2py(capabilities); dbus_test_dbus_mock_object_add_method(mock, baseobj, - "GetCapabilities", NULL, G_VARIANT_TYPE("as"), - capspython.c_str(), NULL); + "GetCapabilities", nullptr, G_VARIANT_TYPE("as"), + capspython.c_str(), nullptr); dbus_test_dbus_mock_object_add_method(mock, baseobj, - "Notify", NULL, G_VARIANT_TYPE("(susssasa{sv}i)"), - "ret = 10", NULL); + "GetServerInformation", nullptr, G_VARIANT_TYPE("(ssss)"), + "ret = ['notification-mock', 'Testing harness', '1.0', '1.1']", nullptr); + + dbus_test_dbus_mock_object_add_method(mock, baseobj, + "Notify", G_VARIANT_TYPE("u"), G_VARIANT_TYPE("(susssasa{sv}i)"), + "ret = 10", nullptr); + + dbus_test_dbus_mock_object_add_method(mock, baseobj, + "CloseNotification", G_VARIANT_TYPE("u"), nullptr, + "", nullptr); } ~NotificationsMock () { @@ -102,7 +110,7 @@ class NotificationsMock std::vector notifications; unsigned int cnt, i; - auto calls = dbus_test_dbus_mock_object_get_method_calls(mock, baseobj, "Notify", &cnt, NULL); + auto calls = dbus_test_dbus_mock_object_get_method_calls(mock, baseobj, "Notify", &cnt, nullptr); for (i = 0; i < cnt; i++) { auto call = calls[i]; @@ -118,7 +126,7 @@ class NotificationsMock auto vactions = childGet(call.params, 5); GVariantIter iactions = {0}; g_variant_iter_init(&iactions, vactions.get()); - const gchar * action = NULL; + const gchar * action = nullptr; while (g_variant_iter_loop(&iactions, "&s", &action)) { std::string saction(action); notification.actions.push_back(saction); @@ -127,8 +135,8 @@ class NotificationsMock auto vhints = childGet(call.params, 6); GVariantIter ihints = {0}; g_variant_iter_init(&ihints, vhints.get()); - const gchar * hint_key = NULL; - GVariant * hint_value = NULL; + const gchar * hint_key = nullptr; + GVariant * hint_value = nullptr; while (g_variant_iter_loop(&ihints, "{&sv}", &hint_key, &hint_value)) { std::string key(hint_key); std::shared_ptr value(g_variant_ref(hint_value), [](GVariant * v){ if (v != nullptr) g_variant_unref(v); }); -- cgit v1.2.3 From 48117fc3ea085d123567ccb621809f43a4358938 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 10 Feb 2015 15:05:28 -0600 Subject: Putting things in the right order --- tests/notifications-mock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h index 0cdcbe5..b727eec 100644 --- a/tests/notifications-mock.h +++ b/tests/notifications-mock.h @@ -48,7 +48,7 @@ class NotificationsMock "ret = ['notification-mock', 'Testing harness', '1.0', '1.1']", nullptr); dbus_test_dbus_mock_object_add_method(mock, baseobj, - "Notify", G_VARIANT_TYPE("u"), G_VARIANT_TYPE("(susssasa{sv}i)"), + "Notify", G_VARIANT_TYPE("(susssasa{sv}i)"), G_VARIANT_TYPE("u"), "ret = 10", nullptr); dbus_test_dbus_mock_object_add_method(mock, baseobj, -- cgit v1.2.3 From af70cff9cef989be42968b11d356e8da09635c4d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 12 Feb 2015 09:12:56 -0600 Subject: Adding a bustle block for fun --- tests/notifications-test.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 3b54a95..3da41cd 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -46,6 +46,19 @@ class NotificationsTest : public ::testing::Test service = dbus_test_service_new(NULL); dbus_test_service_set_bus(service, DBUS_TEST_SERVICE_BUS_SESSION); + /* Useful for debugging test failures, not needed all the time (until it fails) */ + #if 0 + auto bustle = std::shared_ptr([]() { + DbusTestTask * bustle = DBUS_TEST_TASK(dbus_test_bustle_new("notifications-test.bustle")); + dbus_test_task_set_name(bustle, "Bustle"); + dbus_test_task_set_bus(bustle, DBUS_TEST_SERVICE_BUS_SESSION); + return bustle; + }(), [](DbusTestTask * bustle) { + g_clear_object(&bustle); + }); + dbus_test_service_add_task(service, bustle.get()); + #endif + notifications = std::make_shared(); dbus_test_service_add_task(service, (DbusTestTask*)*notifications); -- cgit v1.2.3 From e50350bd0bd5f85cf57cc1d42e6fb34c687063a4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 12 Feb 2015 09:15:42 -0600 Subject: Setting the default stream --- tests/volume-control-mock.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/volume-control-mock.vala b/tests/volume-control-mock.vala index e1b6fc1..4de5975 100644 --- a/tests/volume-control-mock.vala +++ b/tests/volume-control-mock.vala @@ -20,7 +20,7 @@ public class VolumeControlMock : VolumeControl { - public string mock_stream { get; set; } + public string mock_stream { get; set; default = "multimedia"; } public override string stream { get { return mock_stream; } } public override bool ready { get; set; } public override bool active_mic { get; set; } -- cgit v1.2.3 From 95fdfc766027896c19062f8b7e6d9589471be4b0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 12 Feb 2015 15:12:38 -0600 Subject: More notification testings. --- tests/notifications-mock.h | 4 ++++ tests/notifications-test.cc | 21 ++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) (limited to 'tests') diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h index b727eec..b0f3b74 100644 --- a/tests/notifications-mock.h +++ b/tests/notifications-mock.h @@ -148,4 +148,8 @@ class NotificationsMock return notifications; } + + bool clearNotifications (void) { + return dbus_test_dbus_mock_object_clear_method_calls(mock, baseobj, nullptr); + } }; diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 3da41cd..06eac7a 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -126,14 +126,25 @@ TEST_F(NotificationsTest, VolumeChanges) { auto volumeControl = std::shared_ptr(VOLUME_CONTROL(volume_control_mock_new()), [](VolumeControl * control){g_clear_object(&control);}); auto soundService = std::shared_ptr(indicator_sound_service_new(playerList.get(), volumeControl.get(), nullptr), [](IndicatorSoundService * service){g_clear_object(&service);}); - loop(50); - + /* Set a volume */ + notifications->clearNotifications(); volume_control_set_volume(volumeControl.get(), 50.0); - loop(50); - auto notev = notifications->getNotifications(); - ASSERT_EQ(1, notev.size()); EXPECT_EQ("indicator-sound", notev[0].app_name); + + /* Set a different volume */ + notifications->clearNotifications(); + volume_control_set_volume(volumeControl.get(), 60.0); + loop(50); + notev = notifications->getNotifications(); + ASSERT_EQ(1, notev.size()); + + /* Set the same volume */ + notifications->clearNotifications(); + volume_control_set_volume(volumeControl.get(), 60.0); + loop(50); + notev = notifications->getNotifications(); + ASSERT_EQ(0, notev.size()); } -- cgit v1.2.3 From a5037dcedc828117f2a81e56c71913a5c7ef9b46 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 12 Feb 2015 16:09:13 -0600 Subject: Add in ability to easily check GVariants --- tests/gtest-gvariant.h | 95 +++++++++++++++++++++++++++++++++++++++++++++ tests/notifications-test.cc | 6 +++ 2 files changed, 101 insertions(+) create mode 100644 tests/gtest-gvariant.h (limited to 'tests') diff --git a/tests/gtest-gvariant.h b/tests/gtest-gvariant.h new file mode 100644 index 0000000..5a24dfa --- /dev/null +++ b/tests/gtest-gvariant.h @@ -0,0 +1,95 @@ +/* + * Copyright © 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 3. + * + * 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 . + * + * Authors: + * Ted Gould + */ + +#include +#include + +namespace GTestGVariant { + +testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gchar * haveStr, GVariant * expect, GVariant * have) +{ + if (expect == nullptr && have == nullptr) { + auto result = testing::AssertionSuccess(); + return result; + } + + if (expect == nullptr || have == nullptr) { + gchar * havePrint; + if (have == nullptr) { + havePrint = g_strdup("(nullptr)"); + } else { + havePrint = g_variant_print(have, TRUE); + } + + auto result = testing::AssertionFailure(); + result << + " Result: " << haveStr << std::endl << + " Value: " << havePrint << std::endl << + " Expected: " << expectStr << std::endl; + + g_free(havePrint); + return result; + } + + if (g_variant_equal(expect, have)) { + auto result = testing::AssertionSuccess(); + return result; + } else { + gchar * havePrint = g_variant_print(have, TRUE); + gchar * expectPrint = g_variant_print(expect, TRUE); + + auto result = testing::AssertionFailure(); + result << + " Result: " << haveStr << std::endl << + " Value: " << havePrint << std::endl << + " Expected: " << expectStr << std::endl << + " Expected: " << expectPrint << std::endl; + + g_free(havePrint); + g_free(expectPrint); + + return result; + } +} + +testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gchar * haveStr, std::shared_ptr expect, std::shared_ptr have) +{ + return expectVariantEqual(expectStr, haveStr, expect.get(), have.get()); +} + +testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gchar * haveStr, const char * expect, std::shared_ptr have) +{ + auto expectv = std::shared_ptr([expect]() { + auto variant = g_variant_parse(nullptr, expect, nullptr, nullptr, nullptr); + if (variant != nullptr) + g_variant_ref_sink(variant); + return variant; + }(), + [](GVariant * variant) { + if (variant != nullptr) + g_variant_unref(variant); + }); + + return expectVariantEqual(expectStr, haveStr, expectv, have); +} + +}; // ns GTestGVariant + +#define EXPECT_GVARIANT_EQ(expect, have) \ + EXPECT_PRED_FORMAT2(GTestGVariant::expectVariantEqual, expect, have) diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 06eac7a..1b101f5 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -25,6 +25,7 @@ #include #include "notifications-mock.h" +#include "gtest-gvariant.h" extern "C" { #include "indicator-sound-service.h" @@ -133,6 +134,10 @@ TEST_F(NotificationsTest, VolumeChanges) { auto notev = notifications->getNotifications(); ASSERT_EQ(1, notev.size()); EXPECT_EQ("indicator-sound", notev[0].app_name); + EXPECT_EQ("Volume", notev[0].summary); + EXPECT_EQ(0, notev[0].actions.size()); + EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-private-synchronous"]); + EXPECT_GVARIANT_EQ("@i 5000", notev[0].hints["value"]); /* Set a different volume */ notifications->clearNotifications(); @@ -140,6 +145,7 @@ TEST_F(NotificationsTest, VolumeChanges) { loop(50); notev = notifications->getNotifications(); ASSERT_EQ(1, notev.size()); + EXPECT_GVARIANT_EQ("@i 6000", notev[0].hints["value"]); /* Set the same volume */ notifications->clearNotifications(); -- cgit v1.2.3 From 415bca4595a4d24253b543b598c501abe5ba8949 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 12 Feb 2015 16:18:08 -0600 Subject: Remove unnecissary parameter list --- tests/gtest-gvariant.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/gtest-gvariant.h b/tests/gtest-gvariant.h index 5a24dfa..6f93906 100644 --- a/tests/gtest-gvariant.h +++ b/tests/gtest-gvariant.h @@ -75,7 +75,7 @@ testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gcha testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gchar * haveStr, const char * expect, std::shared_ptr have) { - auto expectv = std::shared_ptr([expect]() { + auto expectv = std::shared_ptr([expect] { auto variant = g_variant_parse(nullptr, expect, nullptr, nullptr, nullptr); if (variant != nullptr) g_variant_ref_sink(variant); -- cgit v1.2.3 From 202d0be7d82b6c35ba444d433e6d64784d460699 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 12 Feb 2015 16:33:32 -0600 Subject: Have a version for those who want parse and have a GVariant pointer --- tests/gtest-gvariant.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'tests') diff --git a/tests/gtest-gvariant.h b/tests/gtest-gvariant.h index 6f93906..38fde0f 100644 --- a/tests/gtest-gvariant.h +++ b/tests/gtest-gvariant.h @@ -89,6 +89,21 @@ testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gcha return expectVariantEqual(expectStr, haveStr, expectv, have); } +testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gchar * haveStr, const char * expect, GVariant * have) +{ + auto havep = std::shared_ptr([have] { + if (have != nullptr) + g_variant_ref_sink(have); + return have; + }(), + [](GVariant * variant) { + if (variant != nullptr) + g_variant_unref(variant); + }); + + return expectVariantEqual(expectStr, haveStr, expect, havep); +} + }; // ns GTestGVariant #define EXPECT_GVARIANT_EQ(expect, have) \ -- cgit v1.2.3 From 0a7342ad2b88e0c35d818ba4feecbe1f897e897e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 13 Feb 2015 08:59:11 -0600 Subject: Fine change test --- tests/notifications-test.cc | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 1b101f5..74be5d0 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -153,4 +153,11 @@ TEST_F(NotificationsTest, VolumeChanges) { loop(50); notev = notifications->getNotifications(); ASSERT_EQ(0, notev.size()); + + /* Change just a little */ + notifications->clearNotifications(); + volume_control_set_volume(volumeControl.get(), 60.001); + loop(50); + notev = notifications->getNotifications(); + ASSERT_EQ(0, notev.size()); } -- cgit v1.2.3 From 8ab16462724ab3108d1a16e3cea1c66a10ce775b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 13 Feb 2015 09:24:21 -0600 Subject: Clean up some of the boiler plate --- tests/notifications-test.cc | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 74be5d0..2aff7ae 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -109,12 +109,38 @@ class NotificationsTest : public ::testing::Test g_variant_unref(static_cast(user_data)); return G_SOURCE_REMOVE; } + + std::shared_ptr playerListMock () { + auto playerList = std::shared_ptr( + MEDIA_PLAYER_LIST(media_player_list_mock_new()), + [](MediaPlayerList * list) { + g_clear_object(&list); + }); + return playerList; + } + + std::shared_ptr volumeControlMock () { + auto volumeControl = std::shared_ptr( + VOLUME_CONTROL(volume_control_mock_new()), + [](VolumeControl * control){ + g_clear_object(&control); + }); + return volumeControl; + } + + std::shared_ptr standardService (std::shared_ptr volumeControl, std::shared_ptr playerList) { + auto soundService = std::shared_ptr( + indicator_sound_service_new(playerList.get(), volumeControl.get(), nullptr), + [](IndicatorSoundService * service){ + g_clear_object(&service); + }); + + return soundService; + } }; TEST_F(NotificationsTest, BasicObject) { - auto playerList = std::shared_ptr(MEDIA_PLAYER_LIST(media_player_list_mock_new()), [](MediaPlayerList * list){g_clear_object(&list);}); - auto volumeControl = std::shared_ptr(VOLUME_CONTROL(volume_control_mock_new()), [](VolumeControl * control){g_clear_object(&control);}); - auto soundService = std::shared_ptr(indicator_sound_service_new(playerList.get(), volumeControl.get(), nullptr), [](IndicatorSoundService * service){g_clear_object(&service);}); + auto soundService = standardService(volumeControlMock(), playerListMock()); /* Give some time settle */ loop(50); @@ -123,9 +149,8 @@ TEST_F(NotificationsTest, BasicObject) { } TEST_F(NotificationsTest, VolumeChanges) { - auto playerList = std::shared_ptr(MEDIA_PLAYER_LIST(media_player_list_mock_new()), [](MediaPlayerList * list){g_clear_object(&list);}); - auto volumeControl = std::shared_ptr(VOLUME_CONTROL(volume_control_mock_new()), [](VolumeControl * control){g_clear_object(&control);}); - auto soundService = std::shared_ptr(indicator_sound_service_new(playerList.get(), volumeControl.get(), nullptr), [](IndicatorSoundService * service){g_clear_object(&service);}); + auto volumeControl = volumeControlMock(); + auto soundService = standardService(volumeControl, playerListMock()); /* Set a volume */ notifications->clearNotifications(); -- cgit v1.2.3 From 8159d6abf29c3618d2a3a7d8084f303d5a057594 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 13 Feb 2015 09:56:22 -0600 Subject: Test stream change base cases --- tests/notifications-test.cc | 28 ++++++++++++++++++++++++++++ tests/volume-control-mock.vala | 4 ++++ 2 files changed, 32 insertions(+) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 2aff7ae..b43b691 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -186,3 +186,31 @@ TEST_F(NotificationsTest, VolumeChanges) { notev = notifications->getNotifications(); ASSERT_EQ(0, notev.size()); } + +TEST_F(NotificationsTest, StreamChanges) { + auto volumeControl = volumeControlMock(); + auto soundService = standardService(volumeControl, playerListMock()); + + /* Set a volume */ + notifications->clearNotifications(); + volume_control_set_volume(volumeControl.get(), 50.0); + loop(50); + auto notev = notifications->getNotifications(); + ASSERT_EQ(1, notev.size()); + + /* Change Streams, no volume change */ + notifications->clearNotifications(); + volume_control_mock_set_mock_stream(VOLUME_CONTROL_MOCK(volumeControl.get()), "alarm"); + volume_control_set_volume(volumeControl.get(), 50.0); + loop(50); + notev = notifications->getNotifications(); + EXPECT_EQ(0, notev.size()); + + /* Change Streams, volume change */ + notifications->clearNotifications(); + volume_control_mock_set_mock_stream(VOLUME_CONTROL_MOCK(volumeControl.get()), "alert"); + volume_control_set_volume(volumeControl.get(), 60.0); + loop(50); + notev = notifications->getNotifications(); + EXPECT_EQ(0, notev.size()); +} diff --git a/tests/volume-control-mock.vala b/tests/volume-control-mock.vala index 4de5975..4b846bf 100644 --- a/tests/volume-control-mock.vala +++ b/tests/volume-control-mock.vala @@ -39,5 +39,9 @@ public class VolumeControlMock : VolumeControl public VolumeControlMock() { ready = true; + this.notify["mock-stream"].connect(() => this.notify_property("stream")); + this.notify["mock-high-volume"].connect(() => this.notify_property("high-volume")); + this.notify["mock-mute"].connect(() => this.notify_property("mute")); + this.notify["mock-is-playing"].connect(() => this.notify_property("is-playing")); } } -- cgit v1.2.3 From 3e94a74628c519978b2cb108623b12c198c6431f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 13 Feb 2015 09:58:43 -0600 Subject: Change streams press volume up --- tests/notifications-test.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index b43b691..3ce58f8 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -213,4 +213,14 @@ TEST_F(NotificationsTest, StreamChanges) { loop(50); notev = notifications->getNotifications(); EXPECT_EQ(0, notev.size()); + + /* Change Streams, no volume change, volume up */ + notifications->clearNotifications(); + volume_control_mock_set_mock_stream(VOLUME_CONTROL_MOCK(volumeControl.get()), "multimedia"); + volume_control_set_volume(volumeControl.get(), 60.0); + loop(50); + volume_control_set_volume(volumeControl.get(), 65.0); + notev = notifications->getNotifications(); + EXPECT_EQ(1, notev.size()); + EXPECT_GVARIANT_EQ("@i 6500", notev[0].hints["value"]); } -- cgit v1.2.3 From d97e4bc15eb9edd7a25d4cf9e7ce773fcce94f73 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 13 Feb 2015 10:16:20 -0600 Subject: Adding icon testing, which made me realize our other volumes were really loud --- tests/notifications-test.cc | 58 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 12 deletions(-) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 3ce58f8..c5e3748 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -154,7 +154,7 @@ TEST_F(NotificationsTest, VolumeChanges) { /* Set a volume */ notifications->clearNotifications(); - volume_control_set_volume(volumeControl.get(), 50.0); + volume_control_set_volume(volumeControl.get(), 0.50); loop(50); auto notev = notifications->getNotifications(); ASSERT_EQ(1, notev.size()); @@ -162,26 +162,26 @@ TEST_F(NotificationsTest, VolumeChanges) { EXPECT_EQ("Volume", notev[0].summary); EXPECT_EQ(0, notev[0].actions.size()); EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-private-synchronous"]); - EXPECT_GVARIANT_EQ("@i 5000", notev[0].hints["value"]); + EXPECT_GVARIANT_EQ("@i 50", notev[0].hints["value"]); /* Set a different volume */ notifications->clearNotifications(); - volume_control_set_volume(volumeControl.get(), 60.0); + volume_control_set_volume(volumeControl.get(), 0.60); loop(50); notev = notifications->getNotifications(); ASSERT_EQ(1, notev.size()); - EXPECT_GVARIANT_EQ("@i 6000", notev[0].hints["value"]); + EXPECT_GVARIANT_EQ("@i 60", notev[0].hints["value"]); /* Set the same volume */ notifications->clearNotifications(); - volume_control_set_volume(volumeControl.get(), 60.0); + volume_control_set_volume(volumeControl.get(), 0.60); loop(50); notev = notifications->getNotifications(); ASSERT_EQ(0, notev.size()); /* Change just a little */ notifications->clearNotifications(); - volume_control_set_volume(volumeControl.get(), 60.001); + volume_control_set_volume(volumeControl.get(), 0.60001); loop(50); notev = notifications->getNotifications(); ASSERT_EQ(0, notev.size()); @@ -193,7 +193,7 @@ TEST_F(NotificationsTest, StreamChanges) { /* Set a volume */ notifications->clearNotifications(); - volume_control_set_volume(volumeControl.get(), 50.0); + volume_control_set_volume(volumeControl.get(), 0.5); loop(50); auto notev = notifications->getNotifications(); ASSERT_EQ(1, notev.size()); @@ -201,7 +201,7 @@ TEST_F(NotificationsTest, StreamChanges) { /* Change Streams, no volume change */ notifications->clearNotifications(); volume_control_mock_set_mock_stream(VOLUME_CONTROL_MOCK(volumeControl.get()), "alarm"); - volume_control_set_volume(volumeControl.get(), 50.0); + volume_control_set_volume(volumeControl.get(), 0.5); loop(50); notev = notifications->getNotifications(); EXPECT_EQ(0, notev.size()); @@ -209,7 +209,7 @@ TEST_F(NotificationsTest, StreamChanges) { /* Change Streams, volume change */ notifications->clearNotifications(); volume_control_mock_set_mock_stream(VOLUME_CONTROL_MOCK(volumeControl.get()), "alert"); - volume_control_set_volume(volumeControl.get(), 60.0); + volume_control_set_volume(volumeControl.get(), 0.60); loop(50); notev = notifications->getNotifications(); EXPECT_EQ(0, notev.size()); @@ -217,10 +217,44 @@ TEST_F(NotificationsTest, StreamChanges) { /* Change Streams, no volume change, volume up */ notifications->clearNotifications(); volume_control_mock_set_mock_stream(VOLUME_CONTROL_MOCK(volumeControl.get()), "multimedia"); - volume_control_set_volume(volumeControl.get(), 60.0); + volume_control_set_volume(volumeControl.get(), 0.60); loop(50); - volume_control_set_volume(volumeControl.get(), 65.0); + volume_control_set_volume(volumeControl.get(), 0.65); notev = notifications->getNotifications(); EXPECT_EQ(1, notev.size()); - EXPECT_GVARIANT_EQ("@i 6500", notev[0].hints["value"]); + EXPECT_GVARIANT_EQ("@i 65", notev[0].hints["value"]); +} + +TEST_F(NotificationsTest, IconTesting) { + auto volumeControl = volumeControlMock(); + auto soundService = standardService(volumeControl, playerListMock()); + + /* Set an initial volume */ + notifications->clearNotifications(); + volume_control_set_volume(volumeControl.get(), 0.5); + loop(50); + auto notev = notifications->getNotifications(); + ASSERT_EQ(1, notev.size()); + + /* Generate a set of notifications */ + notifications->clearNotifications(); + for (float i = 0.0; i < 1.01; i += 0.1) { + volume_control_set_volume(volumeControl.get(), i); + } + + loop(50); + notev = notifications->getNotifications(); + ASSERT_EQ(11, notev.size()); + + EXPECT_EQ("audio-volume-muted", notev[0].app_icon); + EXPECT_EQ("audio-volume-low", notev[1].app_icon); + EXPECT_EQ("audio-volume-low", notev[2].app_icon); + EXPECT_EQ("audio-volume-medium", notev[3].app_icon); + EXPECT_EQ("audio-volume-medium", notev[4].app_icon); + EXPECT_EQ("audio-volume-medium", notev[5].app_icon); + EXPECT_EQ("audio-volume-medium", notev[6].app_icon); + EXPECT_EQ("audio-volume-high", notev[7].app_icon); + EXPECT_EQ("audio-volume-high", notev[8].app_icon); + EXPECT_EQ("audio-volume-high", notev[9].app_icon); + EXPECT_EQ("audio-volume-high", notev[10].app_icon); } -- cgit v1.2.3 From d1000c6d613b4cd26bd9ab3d890c3dee295f86a8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 13 Feb 2015 12:47:47 -0600 Subject: Adding a test for notification servers coming on and off the bus, and fixing the code for it --- tests/notifications-test.cc | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index c5e3748..0a4fd4a 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -258,3 +258,51 @@ TEST_F(NotificationsTest, IconTesting) { EXPECT_EQ("audio-volume-high", notev[9].app_icon); EXPECT_EQ("audio-volume-high", notev[10].app_icon); } + +TEST_F(NotificationsTest, ServerRestart) { + auto volumeControl = volumeControlMock(); + auto soundService = standardService(volumeControl, playerListMock()); + + /* Set a volume */ + notifications->clearNotifications(); + volume_control_set_volume(volumeControl.get(), 0.50); + loop(50); + auto notev = notifications->getNotifications(); + ASSERT_EQ(1, notev.size()); + + /* Restart server without sync notifications */ + notifications->clearNotifications(); + dbus_test_service_remove_task(service, (DbusTestTask*)*notifications); + notifications.reset(); + + loop(50); + + notifications = std::make_shared(std::vector({"body", "body-markup", "icon-static"})); + dbus_test_service_add_task(service, (DbusTestTask*)*notifications); + dbus_test_task_run((DbusTestTask*)*notifications); + + /* Change the volume */ + notifications->clearNotifications(); + volume_control_set_volume(volumeControl.get(), 0.60); + loop(50); + notev = notifications->getNotifications(); + ASSERT_EQ(0, notev.size()); + + /* Put a good server back */ + dbus_test_service_remove_task(service, (DbusTestTask*)*notifications); + notifications.reset(); + + loop(50); + + notifications = std::make_shared(); + dbus_test_service_add_task(service, (DbusTestTask*)*notifications); + dbus_test_task_run((DbusTestTask*)*notifications); + + /* Change the volume again */ + notifications->clearNotifications(); + volume_control_set_volume(volumeControl.get(), 0.70); + loop(50); + notev = notifications->getNotifications(); + ASSERT_EQ(1, notev.size()); +} + -- cgit v1.2.3 From 0a8a0f7185b4082ea189c43bc2e02eee506a623f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 13 Feb 2015 13:03:09 -0600 Subject: Add a high volume notification test --- tests/notifications-test.cc | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 0a4fd4a..9c98e4f 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -306,3 +306,47 @@ TEST_F(NotificationsTest, ServerRestart) { ASSERT_EQ(1, notev.size()); } +TEST_F(NotificationsTest, HighVolume) { + auto volumeControl = volumeControlMock(); + auto soundService = standardService(volumeControl, playerListMock()); + + /* Set a volume */ + notifications->clearNotifications(); + volume_control_set_volume(volumeControl.get(), 0.50); + loop(50); + auto notev = notifications->getNotifications(); + ASSERT_EQ(1, notev.size()); + EXPECT_EQ("Volume", notev[0].summary); + EXPECT_EQ("", notev[0].body); + EXPECT_GVARIANT_EQ("@s 'false'", notev[0].hints["x-canonical-value-bar-tint"]); + EXPECT_GVARIANT_EQ("@i 50", notev[0].hints["value"]); + + /* Set high volume with volume change */ + notifications->clearNotifications(); + volume_control_mock_set_mock_high_volume(VOLUME_CONTROL_MOCK(volumeControl.get()), TRUE); + volume_control_set_volume(volumeControl.get(), 0.90); + loop(50); + notev = notifications->getNotifications(); + ASSERT_EQ(1, notev.size()); + EXPECT_EQ("Volume", notev[0].summary); + EXPECT_EQ("High volume", notev[0].body); + EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-value-bar-tint"]); + EXPECT_GVARIANT_EQ("@i 90", notev[0].hints["value"]); + + /* Move it back */ + volume_control_mock_set_mock_high_volume(VOLUME_CONTROL_MOCK(volumeControl.get()), FALSE); + volume_control_set_volume(volumeControl.get(), 0.50); + loop(50); + + /* Set high volume without level change */ + /* NOTE: This can happen if headphones are plugged in */ + notifications->clearNotifications(); + volume_control_mock_set_mock_high_volume(VOLUME_CONTROL_MOCK(volumeControl.get()), TRUE); + loop(50); + notev = notifications->getNotifications(); + ASSERT_EQ(1, notev.size()); + EXPECT_EQ("Volume", notev[0].summary); + EXPECT_EQ("High volume", notev[0].body); + EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-value-bar-tint"]); + EXPECT_GVARIANT_EQ("@i 90", notev[0].hints["value"]); +} -- cgit v1.2.3 From eb8a797c9e7ce01e3345edc20db1486764c84d08 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 13 Feb 2015 13:48:31 -0600 Subject: Block notifications in the volume event instead of in the notification one so that high volume warnings can get through --- tests/notifications-test.cc | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 9c98e4f..22402cd 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -319,7 +319,6 @@ TEST_F(NotificationsTest, HighVolume) { EXPECT_EQ("Volume", notev[0].summary); EXPECT_EQ("", notev[0].body); EXPECT_GVARIANT_EQ("@s 'false'", notev[0].hints["x-canonical-value-bar-tint"]); - EXPECT_GVARIANT_EQ("@i 50", notev[0].hints["value"]); /* Set high volume with volume change */ notifications->clearNotifications(); @@ -327,11 +326,10 @@ TEST_F(NotificationsTest, HighVolume) { volume_control_set_volume(volumeControl.get(), 0.90); loop(50); notev = notifications->getNotifications(); - ASSERT_EQ(1, notev.size()); + ASSERT_LT(0, notev.size()); EXPECT_EQ("Volume", notev[0].summary); EXPECT_EQ("High volume", notev[0].body); EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-value-bar-tint"]); - EXPECT_GVARIANT_EQ("@i 90", notev[0].hints["value"]); /* Move it back */ volume_control_mock_set_mock_high_volume(VOLUME_CONTROL_MOCK(volumeControl.get()), FALSE); @@ -348,5 +346,4 @@ TEST_F(NotificationsTest, HighVolume) { EXPECT_EQ("Volume", notev[0].summary); EXPECT_EQ("High volume", notev[0].body); EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-value-bar-tint"]); - EXPECT_GVARIANT_EQ("@i 90", notev[0].hints["value"]); } -- cgit v1.2.3 From 0b6f800a6e99e6485508aef14f666a7aa51a2f6d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 13 Feb 2015 13:49:43 -0600 Subject: Adding a comment for an odd check --- tests/notifications-test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 22402cd..79b6e8e 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -326,7 +326,7 @@ TEST_F(NotificationsTest, HighVolume) { volume_control_set_volume(volumeControl.get(), 0.90); loop(50); notev = notifications->getNotifications(); - ASSERT_LT(0, notev.size()); + ASSERT_LT(0, notev.size()); /* This passes with one or two since it would just be an update to the first if a second was sent */ EXPECT_EQ("Volume", notev[0].summary); EXPECT_EQ("High volume", notev[0].body); EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-value-bar-tint"]); -- cgit v1.2.3