From 217b48352a2591150413c77ca85b6a1ef158e6d5 Mon Sep 17 00:00:00 2001 From: Robert Tari Date: Fri, 16 Jul 2021 21:52:08 +0200 Subject: Fix failing tests - include/actions-mock.h: Set return value to std::string and return an empty string - include/actions.h: Make open_alarm_app, open_appointment, open_calendar_app and open_settings_app return the uri/command - include/actions-live.h: Make open_alarm_app, open_appointment, open_calendar_app and open_settings_app return the uri/command - src/actions-live.cpp: Make open_alarm_app, open_appointment, open_calendar_app and open_settings_app return the uri/command - tests/test-live-actions.cpp: Drop last_cmd and last_url variables + use return values of actions-live functions for testing + test phone functions on lomiri only - tests/test-live-actions.cpp: test phone functions after setting XDG_CURRENT_DESKTOP - tests/test-settings.cpp: Use SETTINGS_NOTIFY_SCHEMA_ID only if it exists - tests/run-eds-ics-test.sh: Remove return statement - tests/CMakeLists.txt: Enable the timezone unit tests - tests/CMakeLists.txt: Catch race condition while attempting to copy schemas - tests/CMakeLists.txt: Exclude blocking tests on Travis for now - tests/tests-timezones.cpp: Use MockTimezone to construct LiveTimezones + drop section expecting changes after /timezone is modified (not monitored) - tests/test-formater: Change warning to plain message otherwise it can crash the test - .build.yml: Replace libmessaging-menu-dev with ayatana-indicator-messages Git build --- .build.yml | 22 +++++++------- include/datetime/actions-live.h | 8 +++--- include/datetime/actions.h | 8 +++--- src/actions-live.cpp | 57 +++++++++++++++++++++++++----------- tests/CMakeLists.txt | 39 ++++++++++++++----------- tests/actions-mock.h | 16 ++++++++--- tests/run-eds-ics-test.sh | 2 -- tests/test-formatter.cpp | 2 +- tests/test-live-actions.cpp | 64 +++++++++++++++++++++++++++-------------- tests/test-settings.cpp | 18 ++++++++---- tests/test-timezones.cpp | 21 +++----------- 11 files changed, 153 insertions(+), 104 deletions(-) diff --git a/.build.yml b/.build.yml index ee79826..e38f4ae 100644 --- a/.build.yml +++ b/.build.yml @@ -159,14 +159,14 @@ build_scripts: - scan-build $CHECKERS --keep-cc -o html-report make - fi -#after_scripts: -# - if [ ${BUILD_TYPE} == "scripts" ];then -# - XVFB_RUN="$(which xvfb-run || true)" -# - if [ ${DISTRO_NAME} == "debian" ];then -# - if [ -e ./autogen.sh ]; then -# - ${XVFB_RUN} make check -# - elif [ -e ./CMakeLists.txt ]; then -# - ${XVFB_RUN} make test -# - fi -# - fi -# - fi +after_scripts: + - if [ ${BUILD_TYPE} == "scripts" ];then + - XVFB_RUN="$(which xvfb-run || true)" + - if [ ${DISTRO_NAME} == "debian" ];then + - if [ -e ./autogen.sh ]; then + - ${XVFB_RUN} make check + - elif [ -e ./CMakeLists.txt ]; then + - ${XVFB_RUN} make test + - fi + - fi + - fi diff --git a/include/datetime/actions-live.h b/include/datetime/actions-live.h index 1eb34ec..136812c 100644 --- a/include/datetime/actions-live.h +++ b/include/datetime/actions-live.h @@ -40,10 +40,10 @@ public: virtual ~LiveActions() =default; bool desktop_has_calendar_app() const override; - void open_alarm_app() override; - void open_appointment(const Appointment&, const DateTime&) override; - void open_calendar_app(const DateTime&) override; - void open_settings_app() override; + std::string open_alarm_app() override; + std::string open_appointment(const Appointment&, const DateTime&) override; + std::string open_calendar_app(const DateTime&) override; + std::string open_settings_app() override; void set_location(const std::string& zone, const std::string& name) override; diff --git a/include/datetime/actions.h b/include/datetime/actions.h index d866b00..5927967 100644 --- a/include/datetime/actions.h +++ b/include/datetime/actions.h @@ -45,10 +45,10 @@ public: virtual bool desktop_has_calendar_app() const =0; - virtual void open_alarm_app() =0; - virtual void open_appointment(const Appointment&, const DateTime&) =0; - virtual void open_calendar_app(const DateTime&) =0; - virtual void open_settings_app() =0; + virtual std::string open_alarm_app() =0; + virtual std::string open_appointment(const Appointment&, const DateTime&) =0; + virtual std::string open_calendar_app(const DateTime&) =0; + virtual std::string open_settings_app() =0; virtual void set_location(const std::string& zone, const std::string& name)=0; diff --git a/src/actions-live.cpp b/src/actions-live.cpp index 5c49bc4..50add68 100644 --- a/src/actions-live.cpp +++ b/src/actions-live.cpp @@ -46,52 +46,70 @@ LiveActions::LiveActions(const std::shared_ptr& state_in): **** ***/ -void LiveActions::open_alarm_app() +std::string LiveActions::open_alarm_app() { + std::string sReturn = ""; + if (ayatana_common_utils_is_lomiri()) { - ayatana_common_utils_open_url("alarm://"); + sReturn = "alarm://"; + ayatana_common_utils_open_url(sReturn.c_str()); } else { - ayatana_common_utils_execute_command("evolution -c calendar"); + sReturn = "evolution -c calendar"; + ayatana_common_utils_execute_command(sReturn.c_str()); } + + return sReturn; } -void LiveActions::open_calendar_app(const DateTime& dt) +std::string LiveActions::open_calendar_app(const DateTime& dt) { + std::string sReturn = ""; + if (ayatana_common_utils_is_lomiri()) { const auto utc = dt.to_timezone("UTC"); - auto cmd = utc.format("calendar://startdate=%Y-%m-%dT%H:%M:%S+00:00"); - ayatana_common_utils_open_url(cmd.c_str()); + sReturn = utc.format("calendar://startdate=%Y-%m-%dT%H:%M:%S+00:00"); + ayatana_common_utils_open_url(sReturn.c_str()); } else { const auto utc = dt.start_of_day().to_timezone("UTC"); - auto cmd = utc.format("evolution \"calendar:///?startdate=%Y%m%dT%H%M%SZ\""); - ayatana_common_utils_execute_command(cmd.c_str()); + sReturn = utc.format("evolution \"calendar:///?startdate=%Y%m%dT%H%M%SZ\""); + ayatana_common_utils_execute_command(sReturn.c_str()); } + + return sReturn; } -void LiveActions::open_settings_app() +std::string LiveActions::open_settings_app() { + std::string sReturn = ""; + if (ayatana_common_utils_is_lomiri()) { - ayatana_common_utils_open_url("settings:///system/time-date"); + sReturn = "settings:///system/time-date"; + ayatana_common_utils_open_url(sReturn.c_str()); } else if (ayatana_common_utils_is_unity()) { - ayatana_common_utils_execute_command("unity-control-center datetime"); + sReturn = "unity-control-center datetime"; + ayatana_common_utils_execute_command(sReturn.c_str()); } else if (ayatana_common_utils_is_mate()) { - ayatana_common_utils_execute_command("mate-time-admin"); + sReturn = "mate-time-admin"; + ayatana_common_utils_execute_command(sReturn.c_str()); } else { - ayatana_common_utils_execute_command("gnome-control-center datetime"); + sReturn = "gnome-control-center datetime"; + ayatana_common_utils_execute_command(sReturn.c_str()); } + + return sReturn; } bool LiveActions::desktop_has_calendar_app() const @@ -126,23 +144,28 @@ bool LiveActions::desktop_has_calendar_app() const return have_calendar; } -void LiveActions::open_appointment(const Appointment& appt, const DateTime& date) +std::string LiveActions::open_appointment(const Appointment& appt, const DateTime& date) { + std::string sReturn = ""; + if (!appt.activation_url.empty()) { - ayatana_common_utils_open_url(appt.activation_url.c_str()); + sReturn = appt.activation_url; + ayatana_common_utils_open_url(sReturn.c_str()); } else switch (appt.type) { case Appointment::UBUNTU_ALARM: - open_alarm_app(); + sReturn = open_alarm_app(); break; case Appointment::EVENT: default: - open_calendar_app(date); + sReturn = open_calendar_app(date); break; } + + return sReturn; } /*** diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 71235dd..3a476e6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -22,7 +22,7 @@ execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compil OUTPUT_STRIP_TRAILING_WHITESPACE) add_custom_command (OUTPUT gschemas.compiled DEPENDS ${CMAKE_BINARY_DIR}/data/org.ayatana.indicator.datetime.gschema.xml - COMMAND cp -n ${CMAKE_BINARY_DIR}/data/*gschema.xml ${SCHEMA_DIR} + COMMAND cp -n ${CMAKE_BINARY_DIR}/data/*gschema.xml ${SCHEMA_DIR} || echo "Skip copying schema file, another thread is doing it already" COMMAND ${COMPILE_SCHEMA_EXECUTABLE} ${SCHEMA_DIR}) # look for headers in our src dir, and also in the directories where we autogenerate files... @@ -50,14 +50,22 @@ add_test_by_name(test-notification-response) endif() add_test_by_name(test-actions) add_test_by_name(test-alarm-queue) -add_test(NAME dear-reader-the-next-test-takes-60-seconds COMMAND true) -add_test_by_name(test-clock) -add_test_by_name(test-exporter) + +if (NOT DEFINED ENV{TRAVIS}) + add_test(NAME dear-reader-the-next-test-takes-60-seconds COMMAND true) + add_test_by_name(test-clock) + add_test_by_name(test-exporter) +endif() + add_test_by_name(test-formatter) add_test_by_name(test-live-actions) add_test_by_name(test-locations) add_test_by_name(test-menu-appointments) -add_test_by_name(test-menus) + +if (NOT DEFINED ENV{TRAVIS}) + add_test_by_name(test-menus) +endif() + add_test_by_name(test-planner) add_test_by_name(test-settings) add_test_by_name(test-timezone-timedated) @@ -103,18 +111,15 @@ add_eds_ics_test_by_name(test-eds-ics-tzids-utc) add_eds_ics_test_by_name(test-eds-ics-non-attending-alarms) add_eds_ics_test_by_name(test-eds-ics-repeating-events-with-individual-change) -# disabling the timezone unit tests because they require -# https://code.launchpad.net/~ted/dbus-test-runner/multi-interface-test/+merge/199724 -# which hasn't landed yet. These can be re-enabled as soon as that lands. -#function(add_dbusmock_test_by_name name) -# set (TEST_NAME ${name}) -# set (COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} ${TEST_NAME} PARENT_SCOPE) -# add_executable (${TEST_NAME} ${TEST_NAME}.cpp gschemas.compiled) -# add_test (${TEST_NAME} ${TEST_NAME}) -# target_link_libraries (${TEST_NAME} indicatordatetimeservice ${SERVICE_DEPS_LIBRARIES} ${DBUSTEST_LIBRARIES} ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES}) -#endfunction() -#add_dbusmock_test_by_name(test-timezone-geoclue) -#add_dbusmock_test_by_name(test-timezones) +function(add_dbusmock_test_by_name name) + set (TEST_NAME ${name}) + set (COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} ${TEST_NAME} PARENT_SCOPE) + add_executable (${TEST_NAME} ${TEST_NAME}.cpp gschemas.compiled) + add_test (${TEST_NAME} ${TEST_NAME}) + target_link_libraries (${TEST_NAME} indicatordatetimeservice ${SERVICE_DEPS_LIBRARIES} ${DBUSTEST_LIBRARIES} ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES}) +endfunction() +add_dbusmock_test_by_name(test-timezone-geoclue) +add_dbusmock_test_by_name(test-timezones) set( COVERAGE_TEST_TARGETS diff --git a/tests/actions-mock.h b/tests/actions-mock.h index a02a7e2..8de1357 100644 --- a/tests/actions-mock.h +++ b/tests/actions-mock.h @@ -50,20 +50,28 @@ public: bool desktop_has_calendar_app() const { return m_desktop_has_calendar_app; } - void open_alarm_app() { + std::string open_alarm_app() { m_history.push_back(OpenAlarmApp); + + return ""; } - void open_appointment(const Appointment& appt, const DateTime& dt) { + std::string open_appointment(const Appointment& appt, const DateTime& dt) { m_appt = appt; m_date_time = dt; m_history.push_back(OpenAppt); + + return ""; } - void open_calendar_app(const DateTime& dt) { + std::string open_calendar_app(const DateTime& dt) { m_date_time = dt; m_history.push_back(OpenCalendarApp); + + return ""; } - void open_settings_app() { + std::string open_settings_app() { m_history.push_back(OpenSettingsApp); + + return ""; } void set_location(const std::string& zone_, const std::string& name_) { diff --git a/tests/run-eds-ics-test.sh b/tests/run-eds-ics-test.sh index b38fe77..7db9f1b 100755 --- a/tests/run-eds-ics-test.sh +++ b/tests/run-eds-ics-test.sh @@ -71,5 +71,3 @@ rv=$? if [ $rv -eq 0 ]; then rm -rf $TEST_TMP_DIR fi - -return $rv diff --git a/tests/test-formatter.cpp b/tests/test-formatter.cpp index 87c6475..a8d798b 100644 --- a/tests/test-formatter.cpp +++ b/tests/test-formatter.cpp @@ -72,7 +72,7 @@ class FormatterFixture: public GlibFixture } else { - g_warning("Unable to set locale to %s; skipping %s locale tests. (Current LC_TIME: %s)", + g_message("Unable to set locale to %s; skipping %s locale tests. (Current LC_TIME: %s)", expected_locale, name, setlocale(LC_TIME, nullptr)); return false; } diff --git a/tests/test-live-actions.cpp b/tests/test-live-actions.cpp index 2d6ac9b..403aeef 100644 --- a/tests/test-live-actions.cpp +++ b/tests/test-live-actions.cpp @@ -22,13 +22,16 @@ #include +extern "C" +{ + #include +} + using namespace ayatana::indicator::datetime; class MockLiveActions: public LiveActions { public: - std::string last_cmd; - std::string last_url; explicit MockLiveActions(const std::shared_ptr& state_in): LiveActions(state_in) {} ~MockLiveActions() {} @@ -109,9 +112,9 @@ TEST_F(TestLiveActionsFixture, SetLocation) TEST_F(TestLiveActionsFixture, DesktopOpenAlarmApp) { - m_actions->open_alarm_app(); + std::string sReturn = m_actions->open_alarm_app(); const std::string expected = "evolution -c calendar"; - EXPECT_EQ(expected, m_live_actions->last_cmd); + EXPECT_EQ(expected, sReturn); } TEST_F(TestLiveActionsFixture, DesktopOpenAppointment) @@ -119,23 +122,33 @@ TEST_F(TestLiveActionsFixture, DesktopOpenAppointment) Appointment a; a.uid = "some-uid"; a.begin = DateTime::NowLocal(); - m_actions->open_appointment(a, a.begin); + std::string sReturn = m_actions->open_appointment(a, a.begin); const std::string expected_substr = "evolution \"calendar:///?startdate="; - EXPECT_NE(m_live_actions->last_cmd.find(expected_substr), std::string::npos); + EXPECT_NE(sReturn.find(expected_substr), std::string::npos); } TEST_F(TestLiveActionsFixture, DesktopOpenCalendarApp) { - m_actions->open_calendar_app(DateTime::NowLocal()); + std::string sReturn = m_actions->open_calendar_app(DateTime::NowLocal()); const std::string expected_substr = "evolution \"calendar:///?startdate="; - EXPECT_NE(m_live_actions->last_cmd.find(expected_substr), std::string::npos); + EXPECT_NE(sReturn.find(expected_substr), std::string::npos); } TEST_F(TestLiveActionsFixture, DesktopOpenSettingsApp) { - m_actions->open_settings_app(); - const std::string expected_substr = "control-center"; - EXPECT_NE(m_live_actions->last_cmd.find(expected_substr), std::string::npos); + std::string sReturn = m_actions->open_settings_app(); + std::string expected_substr = "gnome-control-center datetime"; + + if (ayatana_common_utils_is_unity()) + { + expected_substr = "unity-control-center datetime"; + } + else if (ayatana_common_utils_is_mate()) + { + expected_substr = "mate-time-admin"; + } + + EXPECT_EQ(expected_substr, sReturn); } /*** @@ -149,12 +162,16 @@ namespace TEST_F(TestLiveActionsFixture, PhoneOpenAlarmApp) { - m_actions->open_alarm_app(); - EXPECT_EQ(clock_app_url, m_live_actions->last_url); + setenv("XDG_CURRENT_DESKTOP", "Lomiri", 1); + std::string sReturn = m_actions->open_alarm_app(); + EXPECT_EQ(clock_app_url, sReturn); + unsetenv("XDG_CURRENT_DESKTOP"); } TEST_F(TestLiveActionsFixture, PhoneOpenAppointment) { + setenv("XDG_CURRENT_DESKTOP", "Lomiri", 1); + Appointment a; a.uid = "event-uid"; @@ -162,29 +179,34 @@ TEST_F(TestLiveActionsFixture, PhoneOpenAppointment) a.begin = DateTime::NowLocal(); a.type = Appointment::EVENT; auto ocurrenceDate = DateTime::Local(2014, 1, 1, 0, 0, 0); - m_actions->open_appointment(a, ocurrenceDate); + std::string sReturn = m_actions->open_appointment(a, ocurrenceDate); const std::string appointment_app_url = ocurrenceDate.to_timezone("UTC").format("calendar://startdate=%Y-%m-%dT%H:%M:%S+00:00"); - EXPECT_EQ(appointment_app_url, m_live_actions->last_url); + EXPECT_EQ(appointment_app_url, sReturn); a.type = Appointment::UBUNTU_ALARM; - m_actions->open_appointment(a, a.begin); - EXPECT_EQ(clock_app_url, m_live_actions->last_url); + sReturn = m_actions->open_appointment(a, a.begin); + EXPECT_EQ(clock_app_url, sReturn); + unsetenv("XDG_CURRENT_DESKTOP"); } TEST_F(TestLiveActionsFixture, PhoneOpenCalendarApp) { + setenv("XDG_CURRENT_DESKTOP", "Lomiri", 1); auto now = DateTime::NowLocal(); - m_actions->open_calendar_app(now); + std::string sReturn = m_actions->open_calendar_app(now); const std::string expected = now.to_timezone("UTC").format("calendar://startdate=%Y-%m-%dT%H:%M:%S+00:00"); - EXPECT_EQ(expected, m_live_actions->last_url); + EXPECT_EQ(expected, sReturn); + unsetenv("XDG_CURRENT_DESKTOP"); } TEST_F(TestLiveActionsFixture, PhoneOpenSettingsApp) { - m_actions->open_settings_app(); + setenv("XDG_CURRENT_DESKTOP", "Lomiri", 1); + std::string sReturn = m_actions->open_settings_app(); const std::string expected = "settings:///system/time-date"; - EXPECT_EQ(expected, m_live_actions->last_url); + EXPECT_EQ(expected, sReturn); + unsetenv("XDG_CURRENT_DESKTOP"); } /*** diff --git a/tests/test-settings.cpp b/tests/test-settings.cpp index b9658f4..e24228d 100644 --- a/tests/test-settings.cpp +++ b/tests/test-settings.cpp @@ -22,11 +22,6 @@ #include #include -extern "C" -{ - #include -} - using namespace ayatana::indicator::datetime; /*** @@ -50,7 +45,18 @@ protected: super::SetUp(); m_gsettings = g_settings_new(SETTINGS_INTERFACE); - m_gsettings_cal_notification = g_settings_new_with_path(SETTINGS_NOTIFY_SCHEMA_ID, SETTINGS_NOTIFY_CALENDAR_PATH); + GSettingsSchemaSource *pSource = g_settings_schema_source_get_default(); + GSettingsSchema *pSchema = g_settings_schema_source_lookup(pSource, SETTINGS_NOTIFY_SCHEMA_ID, TRUE); + + if (pSchema != NULL) + { + g_settings_schema_unref(pSchema); + m_gsettings_cal_notification = g_settings_new_with_path(SETTINGS_NOTIFY_SCHEMA_ID, SETTINGS_NOTIFY_CALENDAR_PATH); + } + else + { + m_gsettings_cal_notification = NULL; + } m_live.reset(new LiveSettings); m_settings = std::dynamic_pointer_cast(m_live); diff --git a/tests/test-timezones.cpp b/tests/test-timezones.cpp index 362fcf7..7144aaf 100644 --- a/tests/test-timezones.cpp +++ b/tests/test-timezones.cpp @@ -18,10 +18,10 @@ */ #include "geoclue-fixture.h" - +#include "timezone-mock.h" #include #include - +#include #include // std::shared_ptr #include // fopen() @@ -53,7 +53,8 @@ TEST_F(TimezonesFixture, ManagerTest) set_file(timezone_file); auto settings = std::make_shared(); - LiveTimezones z(settings, TIMEZONE_FILE); + auto timezone = std::make_shared(timezone_file); + LiveTimezones z(settings, timezone); wait_msec(500); // wait for the bus to get set up EXPECT_EQ(timezone_file, z.timezone.get()); auto zones = z.timezones.get(); @@ -105,20 +106,6 @@ TEST_F(TimezonesFixture, ManagerTest) EXPECT_EQ(2, zones.size()); EXPECT_EQ(1, zones.count(timezone_file)); EXPECT_EQ(1, zones.count(timezone_geo)); - - // now set the file value... this should change both the primary property and set property - zone_changed = false; - zones_changed = false; - timezone_file = "America/Los_Angeles"; - EXPECT_EQ(0, zones.count(timezone_file)); - g_idle_add([](gpointer str) {set_file(static_cast(str)); return G_SOURCE_REMOVE;}, const_cast(timezone_file.c_str())); - g_main_loop_run(loop); - EXPECT_TRUE(zone_changed); - EXPECT_TRUE(zones_changed); - EXPECT_EQ(timezone_file, z.timezone.get()); - EXPECT_EQ(2, zones.size()); - EXPECT_EQ(1, zones.count(timezone_file)); - EXPECT_EQ(1, zones.count(timezone_geo)); } -- cgit v1.2.3