]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-session.c
Refactor tests
[sojka/lightdm.git] / tests / src / test-session.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <signal.h>
5 #include <sys/types.h>
6 #include <unistd.h>
7 #include <fcntl.h>
8 #include <grp.h>
9 #include <glib.h>
10 #include <glib-object.h>
11 #include <gio/gio.h>
12
13 #include "status.h"
14
15 static gchar *session_id;
16
17 static GMainLoop *loop;
18
19 static GString *open_fds;
20
21 static GKeyFile *config;
22
23 static void
24 quit_cb (int signum)
25 {
26     status_notify ("%s TERMINATE SIGNAL=%d", session_id, signum);
27     exit (EXIT_SUCCESS);
28 }
29
30 static void
31 request_cb (const gchar *request)
32 {
33     gchar *r;
34
35     if (!request)
36     {
37         g_main_loop_quit (loop);
38         return;
39     }
40   
41     r = g_strdup_printf ("%s LOGOUT", session_id);
42     if (strcmp (request, r) == 0)
43         exit (EXIT_SUCCESS);
44     g_free (r);
45   
46     r = g_strdup_printf ("%s CRASH", session_id);
47     if (strcmp (request, r) == 0)
48         kill (getpid (), SIGSEGV);
49     g_free (r);
50
51     r = g_strdup_printf ("%s LOCK-SEAT", session_id);
52     if (strcmp (request, r) == 0)
53     {
54         status_notify ("%s LOCK-SEAT", session_id);
55         g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
56                                      "org.freedesktop.DisplayManager",
57                                      getenv ("XDG_SEAT_PATH"),
58                                      "org.freedesktop.DisplayManager.Seat",
59                                      "Lock",
60                                      g_variant_new ("()"),
61                                      G_VARIANT_TYPE ("()"),
62                                      G_DBUS_CALL_FLAGS_NONE,
63                                      1000,
64                                      NULL,
65                                      NULL);
66     }
67     g_free (r);
68
69     r = g_strdup_printf ("%s LOCK-SESSION", session_id);
70     if (strcmp (request, r) == 0)
71     {
72         status_notify ("%s LOCK-SESSION", session_id);
73         g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
74                                      "org.freedesktop.DisplayManager",
75                                      getenv ("XDG_SESSION_PATH"),
76                                      "org.freedesktop.DisplayManager.Session",
77                                      "Lock",
78                                      g_variant_new ("()"),
79                                      G_VARIANT_TYPE ("()"),
80                                      G_DBUS_CALL_FLAGS_NONE,
81                                      1000,
82                                      NULL,
83                                      NULL);
84     }
85     g_free (r);
86
87     r = g_strdup_printf ("%s LIST-GROUPS", session_id);
88     if (strcmp (request, r) == 0)
89     {
90         int n_groups, i;
91         gid_t *groups;
92         GString *group_list;
93
94         n_groups = getgroups (0, NULL);
95         groups = malloc (sizeof (gid_t) * n_groups);
96         n_groups = getgroups (n_groups, groups);
97         group_list = g_string_new ("");
98         for (i = 0; i < n_groups; i++)
99         {
100             struct group *group;
101
102             if (i != 0)
103                 g_string_append (group_list, ",");
104             group = getgrgid (groups[i]);
105             if (group)
106                 g_string_append (group_list, group->gr_name);
107             else
108                 g_string_append_printf (group_list, "%d", groups[i]);
109         }
110         status_notify ("%s LIST-GROUPS GROUPS=%s", session_id, group_list->str);
111         g_string_free (group_list, TRUE);
112         free (groups);
113     }
114
115     r = g_strdup_printf ("%s READ-ENV NAME=", session_id);
116     if (g_str_has_prefix (request, r))
117     {
118         const gchar *name = request + strlen (r);
119         const gchar *value = g_getenv (name);
120         status_notify ("%s READ-ENV NAME=%s VALUE=%s", session_id, name, value ? value : "");
121     }
122     g_free (r);
123
124     r = g_strdup_printf ("%s WRITE-STDOUT TEXT=", session_id);
125     if (g_str_has_prefix (request, r))
126         g_print ("%s", request + strlen (r));
127     g_free (r);
128
129     r = g_strdup_printf ("%s WRITE-STDERR TEXT=", session_id);
130     if (g_str_has_prefix (request, r))
131         g_printerr ("%s", request + strlen (r));
132     g_free (r);
133
134     r = g_strdup_printf ("%s READ FILE=", session_id);
135     if (g_str_has_prefix (request, r))
136     {
137         const gchar *name = request + strlen (r);
138         gchar *contents;
139         GError *error = NULL;
140
141         if (g_file_get_contents (name, &contents, NULL, &error))
142             status_notify ("%s READ FILE=%s TEXT=%s", session_id, name, contents);
143         else
144             status_notify ("%s READ FILE=%s ERROR=%s", session_id, name, error->message);
145         g_clear_error (&error);
146     }
147     g_free (r);
148
149     r = g_strdup_printf ("%s LIST-UNKNOWN-FILE-DESCRIPTORS", session_id);
150     if (strcmp (request, r) == 0)
151         status_notify ("%s LIST-UNKNOWN-FILE-DESCRIPTORS FDS=%s", session_id, open_fds->str);
152     g_free (r);
153 }
154
155 int
156 main (int argc, char **argv)
157 {
158     gchar *display;
159     int fd, open_max;
160
161     display = getenv ("DISPLAY");
162     if (display == NULL)
163         session_id = g_strdup ("SESSION-?");
164     else if (display[0] == ':')
165         session_id = g_strdup_printf ("SESSION-X-%s", display + 1);
166     else
167         session_id = g_strdup_printf ("SESSION-X-%s", display);
168
169     open_fds = g_string_new ("");
170     open_max = sysconf (_SC_OPEN_MAX);
171     for (fd = STDERR_FILENO + 1; fd < open_max; fd++)
172     {
173         if (fcntl (fd, F_GETFD) >= 0)
174             g_string_append_printf (open_fds, "%d,", fd);
175     }
176     if (g_str_has_suffix (open_fds->str, ","))
177         open_fds->str[strlen (open_fds->str) - 1] = '\0';
178
179     signal (SIGINT, quit_cb);
180     signal (SIGTERM, quit_cb);
181
182 #if !defined(GLIB_VERSION_2_36)
183     g_type_init ();
184 #endif
185
186     loop = g_main_loop_new (NULL, FALSE);
187
188     status_connect (request_cb);
189
190     if (argc > 1)
191         status_notify ("%s START NAME=%s USER=%s", session_id, argv[1], getenv ("USER"));
192     else
193         status_notify ("%s START USER=%s", session_id, getenv ("USER"));
194
195     config = g_key_file_new ();
196     g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
197
198     connection = xcb_connect (NULL, NULL);
199
200     if (xcb_connection_has_error (connection))
201     {
202         status_notify ("%s CONNECT-XSERVER-ERROR", session_id);
203         return EXIT_FAILURE;
204     }
205
206     status_notify ("%s CONNECT-XSERVER", session_id);
207
208     g_main_loop_run (loop);
209
210     return EXIT_SUCCESS;
211 }