LCOV - code coverage report
Current view: top level - libsystemd/sd-bus - test-bus-track.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 49 54 90.7 %
Date: 2019-08-23 13:36:53 Functions: 3 3 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 23 50 46.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include <errno.h>
       4                 :            : #include <sys/socket.h>
       5                 :            : 
       6                 :            : #include "sd-bus.h"
       7                 :            : 
       8                 :            : #include "macro.h"
       9                 :            : #include "tests.h"
      10                 :            : 
      11                 :            : static bool track_cb_called_x = false;
      12                 :            : static bool track_cb_called_y = false;
      13                 :            : 
      14                 :          4 : static int track_cb_x(sd_bus_track *t, void *userdata) {
      15                 :            : 
      16         [ +  - ]:          4 :         log_error("TRACK CB X");
      17                 :            : 
      18         [ -  + ]:          4 :         assert_se(!track_cb_called_x);
      19                 :          4 :         track_cb_called_x = true;
      20                 :            : 
      21                 :            :         /* This means b's name disappeared. Let's now disconnect, to make sure the track handling on disconnect works
      22                 :            :          * as it should. */
      23                 :            : 
      24         [ -  + ]:          4 :         assert_se(shutdown(sd_bus_get_fd(sd_bus_track_get_bus(t)), SHUT_RDWR) >= 0);
      25                 :          4 :         return 1;
      26                 :            : }
      27                 :            : 
      28                 :          4 : static int track_cb_y(sd_bus_track *t, void *userdata) {
      29                 :            :         int r;
      30                 :            : 
      31         [ +  - ]:          4 :         log_error("TRACK CB Y");
      32                 :            : 
      33         [ -  + ]:          4 :         assert_se(!track_cb_called_y);
      34                 :          4 :         track_cb_called_y = true;
      35                 :            : 
      36                 :            :         /* We got disconnected, let's close everything */
      37                 :            : 
      38                 :          4 :         r = sd_event_exit(sd_bus_get_event(sd_bus_track_get_bus(t)), EXIT_SUCCESS);
      39         [ -  + ]:          4 :         assert_se(r >= 0);
      40                 :            : 
      41                 :          4 :         return 0;
      42                 :            : }
      43                 :            : 
      44                 :          4 : int main(int argc, char *argv[]) {
      45                 :          4 :         _cleanup_(sd_event_unrefp) sd_event *event = NULL;
      46                 :          4 :         _cleanup_(sd_bus_track_unrefp) sd_bus_track *x = NULL, *y = NULL;
      47                 :          4 :         _cleanup_(sd_bus_unrefp) sd_bus *a = NULL, *b = NULL;
      48                 :          4 :         bool use_system_bus = false;
      49                 :            :         const char *unique;
      50                 :            :         int r;
      51                 :            : 
      52                 :          4 :         test_setup_logging(LOG_INFO);
      53                 :            : 
      54                 :          4 :         r = sd_event_default(&event);
      55         [ -  + ]:          4 :         assert_se(r >= 0);
      56                 :            : 
      57                 :          4 :         r = sd_bus_open_user(&a);
      58   [ -  +  -  + ]:          4 :         if (IN_SET(r, -ECONNREFUSED, -ENOENT)) {
      59                 :          0 :                 r = sd_bus_open_system(&a);
      60   [ #  #  #  # ]:          0 :                 if (IN_SET(r, -ECONNREFUSED, -ENOENT))
      61                 :          0 :                         return log_tests_skipped("Failed to connect to bus");
      62                 :          0 :                 use_system_bus = true;
      63                 :            :         }
      64         [ -  + ]:          4 :         assert_se(r >= 0);
      65                 :            : 
      66                 :          4 :         r = sd_bus_attach_event(a, event, SD_EVENT_PRIORITY_NORMAL);
      67         [ -  + ]:          4 :         assert_se(r >= 0);
      68                 :            : 
      69         [ -  + ]:          4 :         if (use_system_bus)
      70                 :          0 :                 r = sd_bus_open_system(&b);
      71                 :            :         else
      72                 :          4 :                 r = sd_bus_open_user(&b);
      73         [ -  + ]:          4 :         assert_se(r >= 0);
      74                 :            : 
      75                 :          4 :         r = sd_bus_attach_event(b, event, SD_EVENT_PRIORITY_NORMAL);
      76         [ -  + ]:          4 :         assert_se(r >= 0);
      77                 :            : 
      78                 :            :         /* Watch b's name from a */
      79                 :          4 :         r = sd_bus_track_new(a, &x, track_cb_x, NULL);
      80         [ -  + ]:          4 :         assert_se(r >= 0);
      81                 :            : 
      82                 :          4 :         r = sd_bus_get_unique_name(b, &unique);
      83         [ -  + ]:          4 :         assert_se(r >= 0);
      84                 :            : 
      85                 :          4 :         r = sd_bus_track_add_name(x, unique);
      86         [ -  + ]:          4 :         assert_se(r >= 0);
      87                 :            : 
      88                 :            :         /* Watch's a's own name from a */
      89                 :          4 :         r = sd_bus_track_new(a, &y, track_cb_y, NULL);
      90         [ -  + ]:          4 :         assert_se(r >= 0);
      91                 :            : 
      92                 :          4 :         r = sd_bus_get_unique_name(a, &unique);
      93         [ -  + ]:          4 :         assert_se(r >= 0);
      94                 :            : 
      95                 :          4 :         r = sd_bus_track_add_name(y, unique);
      96         [ -  + ]:          4 :         assert_se(r >= 0);
      97                 :            : 
      98                 :            :         /* Now make b's name disappear */
      99                 :          4 :         sd_bus_close(b);
     100                 :            : 
     101                 :          4 :         r = sd_event_loop(event);
     102         [ -  + ]:          4 :         assert_se(r >= 0);
     103                 :            : 
     104         [ -  + ]:          4 :         assert_se(track_cb_called_x);
     105         [ -  + ]:          4 :         assert_se(track_cb_called_y);
     106                 :            : 
     107                 :          4 :         return 0;
     108                 :            : }

Generated by: LCOV version 1.14