/* * Copyright 2014-2016 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 warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, 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: * Charles Kerr */ #include #include #include #include "notification-fixture.h" /*** **** ***/ using namespace ayatana::indicator::datetime; namespace { static constexpr char const * APP_NAME {"indicator-datetime-service"}; gboolean quit_idle (gpointer gloop) { g_main_loop_quit(static_cast(gloop)); return G_SOURCE_REMOVE; }; } /*** **** ***/ TEST_F(NotificationFixture,Notification) { // Feed different combinations of system settings, // indicator-datetime settings, and event types, // then see if notifications and haptic feedback behave as expected. auto settings = std::make_shared(); auto ne = std::make_shared(APP_NAME); auto sb = std::make_shared(); auto func = [this](const Appointment&, const Alarm&){g_idle_add(quit_idle, loop);}; // combinatorial factor #1: event type struct { Appointment appt; bool expected_notify_called; bool expected_vibrate_called; } test_appts[] = { { appt, true, true }, { ualarm, true, true } }; // combinatorial factor #2: indicator-datetime's haptic mode struct { const char* haptic_mode; bool expected_notify_called; bool expected_vibrate_called; } test_haptics[] = { { "none", true, false }, { "pulse", true, true } }; // combinatorial factor #3: system settings' "other vibrations" enabled struct { bool other_vibrations; bool expected_notify_called; bool expected_vibrate_called; } test_other_vibrations[] = { { true, true, true }, { false, true, false } }; // combinatorial factor #4: system settings' notifications app blacklist const std::set> blacklist_calendar { std::make_pair(std::string{"com.lomiri.calendar"}, std::string{"calendar-app"}) }; const std::set> blacklist_empty; struct { std::set> muted_apps; // apps that should not trigger notifications bool expected_notify_called; // do we expect the notification tho show? bool expected_vibrate_called; // do we expect the phone to vibrate? } test_muted_apps[] = { { blacklist_calendar, false, false }, { blacklist_empty, true, true } }; for (const auto& test_appt : test_appts) { for (const auto& test_haptic : test_haptics) { for (const auto& test_vibes : test_other_vibrations) { for (const auto& test_muted : test_muted_apps) { auto snap = create_snap(ne, sb, settings); const bool expected_notify_called = test_appt.expected_notify_called && test_vibes.expected_notify_called && test_muted.expected_notify_called && test_haptic.expected_notify_called; const bool expected_vibrate_called = test_appt.expected_vibrate_called && test_vibes.expected_vibrate_called && test_muted.expected_vibrate_called && test_haptic.expected_vibrate_called; // clear out any previous iterations' noise GError * error = nullptr; dbus_test_dbus_mock_object_clear_method_calls(haptic_mock, haptic_obj, &error); g_assert_no_error(error); dbus_test_dbus_mock_object_clear_method_calls(notify_mock, notify_obj, &error); g_assert_no_error(error); // set the properties to match the test case settings->muted_apps.set(test_muted.muted_apps); settings->alarm_haptic.set(test_haptic.haptic_mode); dbus_test_dbus_mock_object_update_property(as_mock, as_obj, PROP_OTHER_VIBRATIONS, g_variant_new_boolean(test_vibes.other_vibrations), &error); g_assert_no_error(error); wait_msec(100); // run the test (*snap)(appt, appt.alarms.front(), func, func); wait_msec(100); // test that the notification was as expected const bool notify_called = dbus_test_dbus_mock_object_check_method_call(notify_mock, notify_obj, METHOD_NOTIFY, nullptr, &error); g_assert_no_error(error); EXPECT_EQ(expected_notify_called, notify_called); // test that the vibration was as expected const bool vibrate_called = dbus_test_dbus_mock_object_check_method_call(haptic_mock, haptic_obj, HAPTIC_METHOD_VIBRATE_PATTERN, nullptr, &error); g_assert_no_error(error); EXPECT_EQ(expected_vibrate_called, vibrate_called); } } } } }