aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/backend-dbus/CMakeLists.txt2
-rw-r--r--tests/backend-dbus/gtest-mock-dbus-fixture.h1
-rw-r--r--tests/backend-dbus/mock-login1-manager.cc51
-rw-r--r--tests/backend-dbus/mock-login1-manager.h4
-rw-r--r--tests/backend-dbus/mock-login1-seat.cc52
-rw-r--r--tests/backend-dbus/mock-login1-seat.h16
-rw-r--r--tests/backend-dbus/test-users.cc54
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