chiark / gitweb /
logind: expose linger state on User object
[elogind.git] / src / login / test-login.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2011 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <sys/poll.h>
23 #include <string.h>
24
25 #include <systemd/sd-login.h>
26
27 #include "util.h"
28 #include "strv.h"
29
30 static void test_login(void) {
31         int r, k;
32         uid_t u, u2;
33         char *seat, *type, *class, *display;
34         char *session;
35         char *state;
36         char *session2;
37         char *t;
38         char **seats, **sessions, **machines;
39         uid_t *uids;
40         unsigned n;
41         struct pollfd pollfd;
42         sd_login_monitor *m;
43
44         assert_se(sd_pid_get_session(0, &session) == 0);
45         printf("session = %s\n", session);
46
47         assert_se(sd_pid_get_owner_uid(0, &u2) == 0);
48         printf("user = %lu\n", (unsigned long) u2);
49
50         r = sd_uid_get_sessions(u2, false, &sessions);
51         assert_se(r >= 0);
52         assert_se(r == (int) strv_length(sessions));
53         assert_se(t = strv_join(sessions, ", "));
54         strv_free(sessions);
55         printf("sessions = %s\n", t);
56         free(t);
57
58         assert_se(r == sd_uid_get_sessions(u2, false, NULL));
59
60         r = sd_uid_get_seats(u2, false, &seats);
61         assert_se(r >= 0);
62         assert_se(r == (int) strv_length(seats));
63         assert_se(t = strv_join(seats, ", "));
64         strv_free(seats);
65         printf("seats = %s\n", t);
66         free(t);
67
68         assert_se(r == sd_uid_get_seats(u2, false, NULL));
69
70         r = sd_session_is_active(session);
71         assert_se(r >= 0);
72         printf("active = %s\n", yes_no(r));
73
74         r = sd_session_get_state(session, &state);
75         assert_se(r >= 0);
76         printf("state = %s\n", state);
77         free(state);
78
79         assert_se(sd_session_get_uid(session, &u) >= 0);
80         printf("uid = %lu\n", (unsigned long) u);
81         assert_se(u == u2);
82
83         assert_se(sd_session_get_type(session, &type) >= 0);
84         printf("type = %s\n", type);
85         free(type);
86
87         assert_se(sd_session_get_class(session, &class) >= 0);
88         printf("class = %s\n", class);
89         free(class);
90
91         assert_se(sd_session_get_display(session, &display) >= 0);
92         printf("display = %s\n", display);
93         free(display);
94
95         assert_se(sd_session_get_seat(session, &seat) >= 0);
96         printf("seat = %s\n", seat);
97
98         r = sd_seat_can_multi_session(seat);
99         assert_se(r >= 0);
100         printf("can do multi session = %s\n", yes_no(r));
101
102         r = sd_seat_can_tty(seat);
103         assert_se(r >= 0);
104         printf("can do tty = %s\n", yes_no(r));
105
106         r = sd_seat_can_graphical(seat);
107         assert_se(r >= 0);
108         printf("can do graphical = %s\n", yes_no(r));
109
110         assert_se(sd_uid_get_state(u, &state) >= 0);
111         printf("state = %s\n", state);
112
113         assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
114
115         k = sd_uid_is_on_seat(u, 1, seat);
116         assert_se(k >= 0);
117         assert_se(!!r == !!r);
118
119         assert_se(sd_seat_get_active(seat, &session2, &u2) >= 0);
120         printf("session2 = %s\n", session2);
121         printf("uid2 = %lu\n", (unsigned long) u2);
122
123         r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
124         assert_se(r >= 0);
125         printf("n_sessions = %i\n", r);
126         assert_se(r == (int) strv_length(sessions));
127         assert_se(t = strv_join(sessions, ", "));
128         strv_free(sessions);
129         printf("sessions = %s\n", t);
130         free(t);
131         printf("uids =");
132         for (k = 0; k < (int) n; k++)
133                 printf(" %lu", (unsigned long) uids[k]);
134         printf("\n");
135         free(uids);
136
137         assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
138
139         free(session);
140         free(state);
141         free(session2);
142         free(seat);
143
144         r = sd_get_seats(&seats);
145         assert_se(r >= 0);
146         assert_se(r == (int) strv_length(seats));
147         assert_se(t = strv_join(seats, ", "));
148         strv_free(seats);
149         printf("n_seats = %i\n", r);
150         printf("seats = %s\n", t);
151         free(t);
152
153         assert_se(sd_get_seats(NULL) == r);
154
155         r = sd_seat_get_active(NULL, &t, NULL);
156         assert_se(r >= 0);
157         printf("active session on current seat = %s\n", t);
158         free(t);
159
160         r = sd_get_sessions(&sessions);
161         assert_se(r >= 0);
162         assert_se(r == (int) strv_length(sessions));
163         assert_se(t = strv_join(sessions, ", "));
164         strv_free(sessions);
165         printf("n_sessions = %i\n", r);
166         printf("sessions = %s\n", t);
167         free(t);
168
169         assert_se(sd_get_sessions(NULL) == r);
170
171         r = sd_get_uids(&uids);
172         assert_se(r >= 0);
173
174         printf("uids =");
175         for (k = 0; k < r; k++)
176                 printf(" %lu", (unsigned long) uids[k]);
177         printf("\n");
178         free(uids);
179
180         printf("n_uids = %i\n", r);
181         assert_se(sd_get_uids(NULL) == r);
182
183         r = sd_get_machine_names(&machines);
184         assert_se(r >= 0);
185         assert_se(r == (int) strv_length(machines));
186         assert_se(t = strv_join(machines, ", "));
187         strv_free(machines);
188         printf("n_machines = %i\n", r);
189         printf("machines = %s\n", t);
190         free(t);
191
192         r = sd_login_monitor_new("session", &m);
193         assert_se(r >= 0);
194
195         for (n = 0; n < 5; n++) {
196                 usec_t timeout, nw;
197
198                 zero(pollfd);
199                 assert_se((pollfd.fd = sd_login_monitor_get_fd(m)) >= 0);
200                 assert_se((pollfd.events = sd_login_monitor_get_events(m)) >= 0);
201
202                 assert_se(sd_login_monitor_get_timeout(m, &timeout) >= 0);
203
204                 nw = now(CLOCK_MONOTONIC);
205
206                 r = poll(&pollfd, 1,
207                          timeout == (uint64_t) -1 ? -1 :
208                          timeout > nw ? (int) ((timeout - nw) / 1000) :
209                          0);
210
211                 assert_se(r >= 0);
212
213                 sd_login_monitor_flush(m);
214                 printf("Wake!\n");
215         }
216
217         sd_login_monitor_unref(m);
218 }
219
220 int main(int argc, char* argv[]) {
221         log_parse_environment();
222         log_open();
223
224         test_login();
225
226         return 0;
227 }