LCOV - code coverage report
Current view: top level - libsystemd/sd-login - test-login.c (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 158 182 86.8 %
Date: 2019-08-22 15:41:25 Functions: 3 4 75.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: LGPL-2.1+ */
       2             : 
       3             : #include <poll.h>
       4             : #include <string.h>
       5             : 
       6             : #include "sd-login.h"
       7             : 
       8             : #include "alloc-util.h"
       9             : #include "fd-util.h"
      10             : #include "format-util.h"
      11             : #include "log.h"
      12             : #include "string-util.h"
      13             : #include "strv.h"
      14             : #include "time-util.h"
      15             : #include "util.h"
      16             : 
      17           2 : static char* format_uids(char **buf, uid_t* uids, int count) {
      18           2 :         int pos = 0, k, inc;
      19           2 :         size_t size = (DECIMAL_STR_MAX(uid_t) + 1) * count + 1;
      20             : 
      21           2 :         assert_se(*buf = malloc(size));
      22             : 
      23           4 :         for (k = 0; k < count; k++) {
      24           2 :                 sprintf(*buf + pos, "%s"UID_FMT"%n", k > 0 ? " " : "", uids[k], &inc);
      25           2 :                 pos += inc;
      26             :         }
      27             : 
      28           2 :         assert_se(pos < (ssize_t)size);
      29           2 :         (*buf)[pos] = '\0';
      30             : 
      31           2 :         return *buf;
      32             : }
      33             : 
      34           1 : static void test_login(void) {
      35           1 :         _cleanup_close_pair_ int pair[2] = { -1, -1 };
      36           1 :         _cleanup_free_ char *pp = NULL, *qq = NULL,
      37           1 :                 *display_session = NULL, *cgroup = NULL,
      38           1 :                 *display = NULL, *remote_user = NULL, *remote_host = NULL,
      39           1 :                 *type = NULL, *class = NULL, *state = NULL, *state2 = NULL,
      40           1 :                 *seat = NULL, *session = NULL,
      41           1 :                 *unit = NULL, *user_unit = NULL, *slice = NULL;
      42             :         int r;
      43             :         uid_t u, u2;
      44             :         char *t, **seats, **sessions;
      45             : 
      46           1 :         r = sd_pid_get_unit(0, &unit);
      47           1 :         assert_se(r >= 0 || r == -ENODATA);
      48           1 :         log_info("sd_pid_get_unit(0, …) → \"%s\"", strna(unit));
      49             : 
      50           1 :         r = sd_pid_get_user_unit(0, &user_unit);
      51           1 :         assert_se(r >= 0 || r == -ENODATA);
      52           1 :         log_info("sd_pid_get_user_unit(0, …) → \"%s\"", strna(user_unit));
      53             : 
      54           1 :         r = sd_pid_get_slice(0, &slice);
      55           1 :         assert_se(r >= 0 || r == -ENODATA);
      56           1 :         log_info("sd_pid_get_slice(0, …) → \"%s\"", strna(slice));
      57             : 
      58           1 :         r = sd_pid_get_session(0, &session);
      59           1 :         if (r < 0) {
      60           0 :                 log_warning_errno(r, "sd_pid_get_session(0, …): %m");
      61           0 :                 if (r == -ENODATA)
      62           0 :                         log_info("Seems we are not running in a session, skipping some tests.");
      63             :         } else {
      64           1 :                 log_info("sd_pid_get_session(0, …) → \"%s\"", session);
      65             : 
      66           1 :                 assert_se(sd_pid_get_owner_uid(0, &u2) == 0);
      67           1 :                 log_info("sd_pid_get_owner_uid(0, …) → "UID_FMT, u2);
      68             : 
      69           1 :                 assert_se(sd_pid_get_cgroup(0, &cgroup) == 0);
      70           1 :                 log_info("sd_pid_get_cgroup(0, …) → \"%s\"", cgroup);
      71             : 
      72           1 :                 r = sd_uid_get_display(u2, &display_session);
      73           1 :                 assert_se(r >= 0 || r == -ENODATA);
      74           1 :                 log_info("sd_uid_get_display("UID_FMT", …) → \"%s\"",
      75             :                          u2, strnull(display_session));
      76             : 
      77           1 :                 assert_se(socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == 0);
      78           1 :                 sd_peer_get_session(pair[0], &pp);
      79           1 :                 sd_peer_get_session(pair[1], &qq);
      80           1 :                 assert_se(streq_ptr(pp, qq));
      81             : 
      82           1 :                 r = sd_uid_get_sessions(u2, false, &sessions);
      83           1 :                 assert_se(r >= 0);
      84           1 :                 assert_se(r == (int) strv_length(sessions));
      85           1 :                 assert_se(t = strv_join(sessions, " "));
      86           1 :                 strv_free(sessions);
      87           1 :                 log_info("sd_uid_get_sessions("UID_FMT", …) → [%i] \"%s\"", u2, r, t);
      88           1 :                 free(t);
      89             : 
      90           1 :                 assert_se(r == sd_uid_get_sessions(u2, false, NULL));
      91             : 
      92           1 :                 r = sd_uid_get_seats(u2, false, &seats);
      93           1 :                 assert_se(r >= 0);
      94           1 :                 assert_se(r == (int) strv_length(seats));
      95           1 :                 assert_se(t = strv_join(seats, " "));
      96           1 :                 strv_free(seats);
      97           1 :                 log_info("sd_uid_get_seats("UID_FMT", …) → [%i] \"%s\"", u2, r, t);
      98           1 :                 free(t);
      99             : 
     100           1 :                 assert_se(r == sd_uid_get_seats(u2, false, NULL));
     101             :         }
     102             : 
     103           1 :         if (session) {
     104           1 :                 r = sd_session_is_active(session);
     105           1 :                 assert_se(r >= 0);
     106           1 :                 log_info("sd_session_is_active(\"%s\") → %s", session, yes_no(r));
     107             : 
     108           1 :                 r = sd_session_is_remote(session);
     109           1 :                 assert_se(r >= 0);
     110           1 :                 log_info("sd_session_is_remote(\"%s\") → %s", session, yes_no(r));
     111             : 
     112           1 :                 r = sd_session_get_state(session, &state);
     113           1 :                 assert_se(r >= 0);
     114           1 :                 log_info("sd_session_get_state(\"%s\") → \"%s\"", session, state);
     115             : 
     116           1 :                 assert_se(sd_session_get_uid(session, &u) >= 0);
     117           1 :                 log_info("sd_session_get_uid(\"%s\") → "UID_FMT, session, u);
     118           1 :                 assert_se(u == u2);
     119             : 
     120           1 :                 assert_se(sd_session_get_type(session, &type) >= 0);
     121           1 :                 log_info("sd_session_get_type(\"%s\") → \"%s\"", session, type);
     122             : 
     123           1 :                 assert_se(sd_session_get_class(session, &class) >= 0);
     124           1 :                 log_info("sd_session_get_class(\"%s\") → \"%s\"", session, class);
     125             : 
     126           1 :                 r = sd_session_get_display(session, &display);
     127           1 :                 assert_se(r >= 0 || r == -ENODATA);
     128           1 :                 log_info("sd_session_get_display(\"%s\") → \"%s\"", session, strna(display));
     129             : 
     130           1 :                 r = sd_session_get_remote_user(session, &remote_user);
     131           1 :                 assert_se(r >= 0 || r == -ENODATA);
     132           1 :                 log_info("sd_session_get_remote_user(\"%s\") → \"%s\"",
     133             :                          session, strna(remote_user));
     134             : 
     135           1 :                 r = sd_session_get_remote_host(session, &remote_host);
     136           1 :                 assert_se(r >= 0 || r == -ENODATA);
     137           1 :                 log_info("sd_session_get_remote_host(\"%s\") → \"%s\"",
     138             :                          session, strna(remote_host));
     139             : 
     140           1 :                 r = sd_session_get_seat(session, &seat);
     141           1 :                 if (r >= 0) {
     142           1 :                         assert_se(seat);
     143             : 
     144           1 :                         log_info("sd_session_get_seat(\"%s\") → \"%s\"", session, seat);
     145             : 
     146           1 :                         r = sd_seat_can_multi_session(seat);
     147           1 :                         assert_se(r >= 0);
     148           1 :                         log_info("sd_session_can_multi_seat(\"%s\") → %s", seat, yes_no(r));
     149             : 
     150           1 :                         r = sd_seat_can_tty(seat);
     151           1 :                         assert_se(r >= 0);
     152           1 :                         log_info("sd_session_can_tty(\"%s\") → %s", seat, yes_no(r));
     153             : 
     154           1 :                         r = sd_seat_can_graphical(seat);
     155           1 :                         assert_se(r >= 0);
     156           1 :                         log_info("sd_session_can_graphical(\"%s\") → %s", seat, yes_no(r));
     157             :                 } else {
     158           0 :                         log_info_errno(r, "sd_session_get_seat(\"%s\"): %m", session);
     159           0 :                         assert_se(r == -ENODATA);
     160             :                 }
     161             : 
     162           1 :                 assert_se(sd_uid_get_state(u, &state2) >= 0);
     163           1 :                 log_info("sd_uid_get_state("UID_FMT", …) → %s", u, state2);
     164             :         }
     165             : 
     166           1 :         if (seat) {
     167           1 :                 _cleanup_free_ char *session2 = NULL, *buf = NULL;
     168           1 :                 _cleanup_free_ uid_t *uids = NULL;
     169             :                 unsigned n;
     170             : 
     171           1 :                 assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
     172             : 
     173           1 :                 r = sd_seat_get_active(seat, &session2, &u2);
     174           1 :                 assert_se(r >= 0);
     175           1 :                 log_info("sd_seat_get_active(\"%s\", …) → \"%s\", "UID_FMT, seat, session2, u2);
     176             : 
     177           1 :                 r = sd_uid_is_on_seat(u, 1, seat);
     178           1 :                 assert_se(r >= 0);
     179           1 :                 assert_se(!!r == streq(session, session2));
     180             : 
     181           1 :                 r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
     182           1 :                 assert_se(r >= 0);
     183           1 :                 assert_se(r == (int) strv_length(sessions));
     184           1 :                 assert_se(t = strv_join(sessions, " "));
     185           1 :                 strv_free(sessions);
     186           1 :                 log_info("sd_seat_get_sessions(\"%s\", …) → %i, \"%s\", [%i] {%s}",
     187             :                          seat, r, t, n, format_uids(&buf, uids, n));
     188           1 :                 free(t);
     189             : 
     190           1 :                 assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
     191             :         }
     192             : 
     193           1 :         r = sd_get_seats(&seats);
     194           1 :         assert_se(r >= 0);
     195           1 :         assert_se(r == (int) strv_length(seats));
     196           1 :         assert_se(t = strv_join(seats, ", "));
     197           1 :         strv_free(seats);
     198           1 :         log_info("sd_get_seats(…) → [%i] \"%s\"", r, t);
     199           1 :         t = mfree(t);
     200             : 
     201           1 :         assert_se(sd_get_seats(NULL) == r);
     202             : 
     203           1 :         r = sd_seat_get_active(NULL, &t, NULL);
     204           1 :         assert_se(IN_SET(r, 0, -ENODATA));
     205           1 :         log_info("sd_seat_get_active(NULL, …) (active session on current seat) → %s", strnull(t));
     206           1 :         free(t);
     207             : 
     208           1 :         r = sd_get_sessions(&sessions);
     209           1 :         assert_se(r >= 0);
     210           1 :         assert_se(r == (int) strv_length(sessions));
     211           1 :         assert_se(t = strv_join(sessions, ", "));
     212           1 :         strv_free(sessions);
     213           1 :         log_info("sd_get_sessions(…) → [%i] \"%s\"", r, t);
     214           1 :         free(t);
     215             : 
     216           1 :         assert_se(sd_get_sessions(NULL) == r);
     217             : 
     218             :         {
     219           1 :                 _cleanup_free_ uid_t *uids = NULL;
     220           1 :                 _cleanup_free_ char *buf = NULL;
     221             : 
     222           1 :                 r = sd_get_uids(&uids);
     223           1 :                 assert_se(r >= 0);
     224           1 :                 log_info("sd_get_uids(…) → [%i] {%s}", r, format_uids(&buf, uids, r));
     225             : 
     226           1 :                 assert_se(sd_get_uids(NULL) == r);
     227             :         }
     228             : 
     229             :         {
     230           1 :                 _cleanup_strv_free_ char **machines = NULL;
     231           1 :                 _cleanup_free_ char *buf = NULL;
     232             : 
     233           1 :                 r = sd_get_machine_names(&machines);
     234           1 :                 assert_se(r >= 0);
     235           1 :                 assert_se(r == (int) strv_length(machines));
     236           1 :                 assert_se(buf = strv_join(machines, " "));
     237           1 :                 log_info("sd_get_machines(…) → [%i] \"%s\"", r, buf);
     238             : 
     239           1 :                 assert_se(sd_get_machine_names(NULL) == r);
     240             :         }
     241           1 : }
     242             : 
     243           0 : static void test_monitor(void) {
     244           0 :         sd_login_monitor *m = NULL;
     245             :         unsigned n;
     246             :         int r;
     247             : 
     248           0 :         r = sd_login_monitor_new("session", &m);
     249           0 :         assert_se(r >= 0);
     250             : 
     251           0 :         for (n = 0; n < 5; n++) {
     252           0 :                 struct pollfd pollfd = {};
     253             :                 usec_t timeout, nw;
     254             : 
     255           0 :                 assert_se((pollfd.fd = sd_login_monitor_get_fd(m)) >= 0);
     256           0 :                 assert_se((pollfd.events = sd_login_monitor_get_events(m)) >= 0);
     257             : 
     258           0 :                 assert_se(sd_login_monitor_get_timeout(m, &timeout) >= 0);
     259             : 
     260           0 :                 nw = now(CLOCK_MONOTONIC);
     261             : 
     262           0 :                 r = poll(&pollfd, 1,
     263           0 :                          timeout == (uint64_t) -1 ? -1 :
     264           0 :                          timeout > nw ? (int) ((timeout - nw) / 1000) :
     265             :                          0);
     266             : 
     267           0 :                 assert_se(r >= 0);
     268             : 
     269           0 :                 sd_login_monitor_flush(m);
     270           0 :                 printf("Wake!\n");
     271             :         }
     272             : 
     273           0 :         sd_login_monitor_unref(m);
     274           0 : }
     275             : 
     276           1 : int main(int argc, char* argv[]) {
     277           1 :         log_parse_environment();
     278           1 :         log_open();
     279             : 
     280           1 :         log_info("/* Information printed is from the live system */");
     281             : 
     282           1 :         test_login();
     283             : 
     284           1 :         if (streq_ptr(argv[1], "-m"))
     285           0 :                 test_monitor();
     286             : 
     287           1 :         return 0;
     288             : }

Generated by: LCOV version 1.14