diff options
Diffstat (limited to 'tests/backend-dbus')
-rw-r--r-- | tests/backend-dbus/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tests/backend-dbus/gtest-mock-dbus-fixture.h | 1 | ||||
-rw-r--r-- | tests/backend-dbus/mock-login1-manager.cc | 51 | ||||
-rw-r--r-- | tests/backend-dbus/mock-login1-manager.h | 4 | ||||
-rw-r--r-- | tests/backend-dbus/mock-login1-seat.cc | 52 | ||||
-rw-r--r-- | tests/backend-dbus/mock-login1-seat.h | 16 | ||||
-rw-r--r-- | tests/backend-dbus/test-users.cc | 54 |
7 files changed, 141 insertions, 39 deletions
diff --git a/tests/backend-dbus/CMakeLists.txt b/tests/backend-dbus/CMakeLists.txt index ed9c93a..e28d8e6 100644 --- a/tests/backend-dbus/CMakeLists.txt +++ b/tests/backend-dbus/CMakeLists.txt @@ -5,7 +5,7 @@ add_library (gtest STATIC set_target_properties (gtest PROPERTIES INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIR}) -SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") +SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -g ${CC_WARNING_ARGS}") # build desktopmock add_library (desktopmock STATIC diff --git a/tests/backend-dbus/gtest-mock-dbus-fixture.h b/tests/backend-dbus/gtest-mock-dbus-fixture.h index 1b1b895..bab82bf 100644 --- a/tests/backend-dbus/gtest-mock-dbus-fixture.h +++ b/tests/backend-dbus/gtest-mock-dbus-fixture.h @@ -65,6 +65,7 @@ class GTestMockDBusFixture: public GTestDBusFixture dm_seat->set_guest_allowed (false); login1_manager = new MockLogin1Manager (loop, conn); login1_seat = new MockLogin1Seat (loop, conn, true); + g_setenv ("XDG_SEAT", login1_seat->seat_id(), TRUE); login1_manager->add_seat (login1_seat); accounts = build_accounts_mock (); MockUser * user = accounts->find_by_username ("msmith"); diff --git a/tests/backend-dbus/mock-login1-manager.cc b/tests/backend-dbus/mock-login1-manager.cc index 2d341df..0c1acc9 100644 --- a/tests/backend-dbus/mock-login1-manager.cc +++ b/tests/backend-dbus/mock-login1-manager.cc @@ -147,10 +147,50 @@ MockLogin1Manager :: add_seat (MockLogin1Seat * seat) } /*** +**** +***/ + +GVariant * +MockLogin1Manager :: list_sessions () const +{ + GVariantBuilder b; + + g_variant_builder_init (&b, G_VARIANT_TYPE("a(susso)")); + + for (auto seat : my_seats) + { + GVariant * seat_sessions = seat->list_sessions (); + + GVariantIter iter; + g_variant_iter_init (&iter, seat_sessions); + GVariant * child; + while ((child = g_variant_iter_next_value (&iter))) + { + g_variant_builder_add_value (&b, child); + g_variant_unref (child); + } + } + + GVariant * v = g_variant_builder_end (&b); + g_message ("%s %s returning %s", G_STRLOC, G_STRFUNC, g_variant_print (v, true)); + return v; +} + +/*** **** Skeleton Handlers ***/ gboolean +MockLogin1Manager :: handle_list_sessions (Login1Manager * m, + GDBusMethodInvocation * inv, + gpointer gself) +{ + GVariant * sessions = static_cast<MockLogin1Manager*>(gself)->list_sessions(); + login1_manager_complete_list_sessions (m, inv, sessions); + return true; +} + +gboolean MockLogin1Manager :: handle_can_suspend (Login1Manager * m, GDBusMethodInvocation * inv, gpointer gself) @@ -173,7 +213,7 @@ MockLogin1Manager :: handle_can_hibernate (Login1Manager * m, gboolean MockLogin1Manager :: handle_reboot (Login1Manager * m, GDBusMethodInvocation * inv, - gboolean interactive, + gboolean interactive G_GNUC_UNUSED, gpointer gself) { static_cast<MockLogin1Manager*>(gself)->my_last_action = "reboot"; @@ -184,7 +224,7 @@ MockLogin1Manager :: handle_reboot (Login1Manager * m, gboolean MockLogin1Manager :: handle_power_off (Login1Manager * m, GDBusMethodInvocation * inv, - gboolean interactive, + gboolean interactive G_GNUC_UNUSED, gpointer gself) { static_cast<MockLogin1Manager*>(gself)->my_last_action = "power-off"; @@ -195,7 +235,7 @@ MockLogin1Manager :: handle_power_off (Login1Manager * m, gboolean MockLogin1Manager :: handle_suspend (Login1Manager * m, GDBusMethodInvocation * inv, - gboolean interactive, + gboolean interactive G_GNUC_UNUSED, gpointer gself) { static_cast<MockLogin1Manager*>(gself)->my_last_action = "suspend"; @@ -206,7 +246,7 @@ MockLogin1Manager :: handle_suspend (Login1Manager * m, gboolean MockLogin1Manager :: handle_hibernate (Login1Manager * m, GDBusMethodInvocation * inv, - gboolean interactive, + gboolean interactive G_GNUC_UNUSED, gpointer gself) { static_cast<MockLogin1Manager*>(gself)->my_last_action = "hibernate"; @@ -253,6 +293,9 @@ MockLogin1Manager :: MockLogin1Manager (GMainLoop * loop, G_CALLBACK(handle_suspend), this); g_signal_connect (my_skeleton, "handle-hibernate", G_CALLBACK(handle_hibernate), this); + g_signal_connect (my_skeleton, "handle-list-sessions", + G_CALLBACK(handle_list_sessions), this); + #if 0 g_signal_connect (my_skeleton, "handle-get-seats", G_CALLBACK(on_get_seats), this); diff --git a/tests/backend-dbus/mock-login1-manager.h b/tests/backend-dbus/mock-login1-manager.h index da05660..a093f7f 100644 --- a/tests/backend-dbus/mock-login1-manager.h +++ b/tests/backend-dbus/mock-login1-manager.h @@ -47,8 +47,12 @@ class MockLogin1Manager: public MockObject void clear_last_action () { my_last_action.clear(); } private: + void emit_session_new (MockLogin1Seat * seat, int tag) const; + GVariant * list_sessions () const; + + static gboolean handle_list_sessions (Login1Manager *, GDBusMethodInvocation *, gpointer); static gboolean handle_can_suspend (Login1Manager *, GDBusMethodInvocation *, gpointer); static gboolean handle_can_hibernate (Login1Manager *, GDBusMethodInvocation *, gpointer); static gboolean handle_reboot (Login1Manager *, GDBusMethodInvocation *, gboolean, gpointer); diff --git a/tests/backend-dbus/mock-login1-seat.cc b/tests/backend-dbus/mock-login1-seat.cc index a95b9e1..08a18dc 100644 --- a/tests/backend-dbus/mock-login1-seat.cc +++ b/tests/backend-dbus/mock-login1-seat.cc @@ -49,10 +49,10 @@ MockLogin1Seat :: get_session_id_and_path_for_tag (int tag, std::string& id, std { char tmp[80]; - g_snprintf (tmp, sizeof(tmp), "%d", tag); + g_snprintf (tmp, sizeof(tmp), "c%d", tag); id = tmp; - g_snprintf (tmp, sizeof(tmp), "/org/freedesktop/login1/session/%d", tag); + g_snprintf (tmp, sizeof(tmp), "/org/freedesktop/login1/session/%s", id.c_str()); path = tmp; } else @@ -143,10 +143,10 @@ MockLogin1Seat :: sessions () const return ret; } -MockLogin1Seat :: session_tag_t +int MockLogin1Seat :: add_session (MockUser * user) { - const session_tag_t tag = next_session_tag++; + const int tag = next_session_tag++; my_sessions[tag] = user; update_sessions_property (); @@ -155,9 +155,9 @@ MockLogin1Seat :: add_session (MockUser * user) } void -MockLogin1Seat :: remove_session (session_tag_t tag) +MockLogin1Seat :: remove_session (int session_tag) { - my_sessions.erase (tag); + my_sessions.erase (session_tag); update_sessions_property (); } @@ -165,15 +165,43 @@ MockLogin1Seat :: remove_session (session_tag_t tag) **** ***/ +MockUser * +MockLogin1Seat :: active_user () +{ + auto it = my_sessions.find (active_session()); + return it == my_sessions.end() ? NULL : it->second; +} + +const MockUser * +MockLogin1Seat :: active_user () const +{ + auto it = my_sessions.find (active_session()); + return it == my_sessions.end() ? NULL : it->second; +} + +int +MockLogin1Seat :: find_session_for_user (guint uid) const +{ + for (auto it : my_sessions) + if (it.second->uid() == uid) + return it.first; + + return 0; +} + void -MockLogin1Seat :: activate_session (session_tag_t tag) +MockLogin1Seat :: activate_session (int session_tag) { - g_assert (my_sessions.count(tag) == 1); + g_assert (my_sessions.count(session_tag) == 1); - if (my_active_session != tag) + if (my_active_session != session_tag) { - my_active_session = tag; + std::string id, path; + my_active_session = session_tag; + get_session_id_and_path_for_tag (session_tag, id, path); + g_setenv ("XDG_SESSION_ID", id.c_str(), true); update_active_session_property (); + } } @@ -216,8 +244,8 @@ MockLogin1Seat :: MockLogin1Seat (GMainLoop * loop, bool can_activate_sessions): MockObject (loop, bus_connection, BUS_NAME, next_unique_sid()), my_skeleton (login1_seat_skeleton_new ()), - my_can_multi_session (can_activate_sessions), - my_active_session (0) + my_active_session (0), + my_can_multi_session (can_activate_sessions) { set_skeleton (G_DBUS_INTERFACE_SKELETON(my_skeleton)); diff --git a/tests/backend-dbus/mock-login1-seat.h b/tests/backend-dbus/mock-login1-seat.h index 96ff19c..473d21a 100644 --- a/tests/backend-dbus/mock-login1-seat.h +++ b/tests/backend-dbus/mock-login1-seat.h @@ -34,8 +34,6 @@ class MockLogin1Seat: public MockObject { public: - typedef int session_tag_t; - MockLogin1Seat (GMainLoop * loop, GDBusConnection * bus_connection, bool can_activate_sessions); @@ -44,13 +42,16 @@ class MockLogin1Seat: public MockObject const char * seat_id() const { return strrchr(path(),'/')+1; } - session_tag_t add_session (MockUser * user); - void remove_session (session_tag_t session); + int add_session (MockUser * user); + void remove_session (int session_tag); std::set<int> sessions () const; int active_session () const { return my_active_session; } + MockUser * active_user (); + const MockUser * active_user () const; + int find_session_for_user (guint uid) const; bool can_activate_sessions () const { return my_can_multi_session; } - void activate_session (session_tag_t session); + void activate_session (int session_tag); void switch_to_guest (); void switch_to_user (const char * username); @@ -66,11 +67,10 @@ class MockLogin1Seat: public MockObject void update_active_session_property (); void update_can_multi_session_property (); - private: Login1Seat * my_skeleton; - std::map<session_tag_t,MockUser*> my_sessions; - session_tag_t my_active_session; + std::map<int,MockUser*> my_sessions; + int my_active_session; bool my_can_multi_session; }; diff --git a/tests/backend-dbus/test-users.cc b/tests/backend-dbus/test-users.cc index bd0547d..fa52df3 100644 --- a/tests/backend-dbus/test-users.cc +++ b/tests/backend-dbus/test-users.cc @@ -153,23 +153,25 @@ TEST_F (Users, HelloWorld) ASSERT_TRUE (true); } - /** * Confirm that 'users' can get the cached users from our Mock Accounts */ TEST_F (Users, InitialUsers) { - const guint logged_in_uid = ck_session->user()->uid(); GStrv keys = indicator_session_users_get_keys (users); + const MockUser * active_user = login1_seat->active_user (); ASSERT_EQ (12, g_strv_length (keys)); for (int i=0; keys && keys[i]; ++i) { - MockUser * mu = accounts->find_by_path (keys[i]); - const bool is_logged_in = mu->uid() == logged_in_uid; - const bool is_current_user = mu->uid() == logged_in_uid; - compare_user (keys[i], mu, is_logged_in, is_current_user); + IndicatorSessionUser * isu = indicator_session_users_get_user (users, keys[i]); + MockUser * mu = accounts->find_by_uid (isu->uid); + const bool is_logged_in = login1_seat->find_session_for_user (isu->uid) != 0; + const bool is_active = active_user && (active_user->uid() == isu->uid); + compare_user (isu, mu, is_logged_in, is_active); + + indicator_session_user_free (isu); } g_strfreev (keys); @@ -187,7 +189,9 @@ TEST_F (Users, UserAdded) ASSERT_EQ (0, event_keys.size()); wait_for_signals (users, INDICATOR_SESSION_USERS_SIGNAL_USER_ADDED, 1); ASSERT_EQ (1, event_keys.size()); - ASSERT_STREQ (mu->path(), event_keys[0].c_str()); + IndicatorSessionUser * isu = indicator_session_users_get_user (users, event_keys[0].c_str()); + ASSERT_EQ (mu->uid(), isu->uid); + indicator_session_user_free (isu); compare_user (event_keys[0], mu, false, false); } @@ -197,24 +201,45 @@ TEST_F (Users, UserAdded) */ TEST_F (Users, UserRemoved) { - MockUser * mu; + MockUser * mu = accounts->find_by_username ("pdavison"); - mu = accounts->find_by_username ("pdavison"); + /* confirm that users knows about pdavison */ + bool found = false; + GStrv keys = indicator_session_users_get_keys (users); + ASSERT_EQ (12, g_strv_length (keys)); + for (int i=0; !found && keys && keys[i]; i++) + { + IndicatorSessionUser * isu = indicator_session_users_get_user (users, keys[i]); + found = isu->uid == mu->uid(); + indicator_session_user_free (isu); + } + g_strfreev (keys); + ASSERT_TRUE (found); + + /* on the bus, remove pdavison. */ accounts->remove_user (mu); + + /* now, users should emit a 'user removed' signal... */ ASSERT_EQ (0, event_keys.size()); wait_for_signals (users, INDICATOR_SESSION_USERS_SIGNAL_USER_REMOVED, 1); ASSERT_EQ (1, event_keys.size()); - ASSERT_STREQ (mu->path(), event_keys[0].c_str()); - GStrv keys = indicator_session_users_get_keys (users); + /* confirm that users doesn't know about pdavison */ + keys = indicator_session_users_get_keys (users); ASSERT_EQ (11, g_strv_length (keys)); + for (int i=0; keys && keys[i]; i++) + { + IndicatorSessionUser * isu = indicator_session_users_get_user (users, keys[i]); + ASSERT_NE (event_keys[0], keys[i]); + ASSERT_NE (mu->uid(), isu->uid); + indicator_session_user_free (isu); + } g_strfreev (keys); - ASSERT_TRUE (indicator_session_users_get_user (users, mu->path()) == NULL); - delete mu; } +#if 0 /** * Confirm that 'users' notices when a user's real name changes */ @@ -368,10 +393,11 @@ TEST_F (Users, LiveSession) MockConsoleKitSession * session = ck_seat->add_session_by_user (live_user); wait_msec (100); ck_seat->activate_session (session); - wait_for_signal (users, "notify::"INDICATOR_SESSION_USERS_PROP_IS_LIVE_SESSION); + wait_for_signal (users, "notify::" INDICATOR_SESSION_USERS_PROP_IS_LIVE_SESSION); // confirm the backend thinks it's a live session ASSERT_TRUE (indicator_session_users_is_live_session (users)); g_object_get (users, INDICATOR_SESSION_USERS_PROP_IS_LIVE_SESSION, &b, NULL); ASSERT_TRUE (b); } +#endif |