LCOV - code coverage report
Current view: top level - libsystemd/sd-bus - test-bus-error.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 133 133 100.0 %
Date: 2019-08-23 13:36:53 Functions: 5 5 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 104 204 51.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include "sd-bus.h"
       4                 :            : 
       5                 :            : #include "bus-common-errors.h"
       6                 :            : #include "bus-error.h"
       7                 :            : #include "bus-util.h"
       8                 :            : #include "errno-list.h"
       9                 :            : #include "errno-util.h"
      10                 :            : 
      11                 :          4 : static void test_error(void) {
      12                 :          4 :         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL, second = SD_BUS_ERROR_NULL;
      13                 :          4 :         const sd_bus_error const_error = SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FILE_EXISTS, "const error");
      14                 :          4 :         const sd_bus_error temporarily_const_error = {
      15                 :            :                 .name = SD_BUS_ERROR_ACCESS_DENIED,
      16                 :            :                 .message = "oh! no",
      17                 :            :                 ._need_free = -1
      18                 :            :         };
      19                 :            : 
      20         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&error));
      21         [ -  + ]:          4 :         assert_se(sd_bus_error_set(&error, SD_BUS_ERROR_NOT_SUPPORTED, "xxx") == -EOPNOTSUPP);
      22         [ -  + ]:          4 :         assert_se(streq(error.name, SD_BUS_ERROR_NOT_SUPPORTED));
      23         [ -  + ]:          4 :         assert_se(streq(error.message, "xxx"));
      24         [ -  + ]:          4 :         assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_NOT_SUPPORTED));
      25         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&error) == EOPNOTSUPP);
      26         [ -  + ]:          4 :         assert_se(sd_bus_error_is_set(&error));
      27                 :          4 :         sd_bus_error_free(&error);
      28                 :            : 
      29                 :            :         /* Check with no error */
      30         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&error));
      31         [ -  + ]:          4 :         assert_se(sd_bus_error_setf(&error, NULL, "yyy %i", -1) == 0);
      32         [ -  + ]:          4 :         assert_se(error.name == NULL);
      33         [ -  + ]:          4 :         assert_se(error.message == NULL);
      34         [ -  + ]:          4 :         assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
      35         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&error) == 0);
      36         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&error));
      37                 :            : 
      38         [ -  + ]:          4 :         assert_se(sd_bus_error_setf(&error, SD_BUS_ERROR_FILE_NOT_FOUND, "yyy %i", -1) == -ENOENT);
      39         [ -  + ]:          4 :         assert_se(streq(error.name, SD_BUS_ERROR_FILE_NOT_FOUND));
      40         [ -  + ]:          4 :         assert_se(streq(error.message, "yyy -1"));
      41         [ -  + ]:          4 :         assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
      42         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&error) == ENOENT);
      43         [ -  + ]:          4 :         assert_se(sd_bus_error_is_set(&error));
      44                 :            : 
      45         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&second));
      46         [ -  + ]:          4 :         assert_se(second._need_free == 0);
      47         [ -  + ]:          4 :         assert_se(error._need_free > 0);
      48         [ -  + ]:          4 :         assert_se(sd_bus_error_copy(&second, &error) == -ENOENT);
      49         [ -  + ]:          4 :         assert_se(second._need_free > 0);
      50         [ -  + ]:          4 :         assert_se(streq(error.name, second.name));
      51         [ -  + ]:          4 :         assert_se(streq(error.message, second.message));
      52         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&second) == ENOENT);
      53         [ -  + ]:          4 :         assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_NOT_FOUND));
      54         [ -  + ]:          4 :         assert_se(sd_bus_error_is_set(&second));
      55                 :            : 
      56                 :          4 :         sd_bus_error_free(&error);
      57                 :          4 :         sd_bus_error_free(&second);
      58                 :            : 
      59         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&second));
      60         [ -  + ]:          4 :         assert_se(const_error._need_free == 0);
      61         [ -  + ]:          4 :         assert_se(sd_bus_error_copy(&second, &const_error) == -EEXIST);
      62         [ -  + ]:          4 :         assert_se(second._need_free == 0);
      63         [ -  + ]:          4 :         assert_se(streq(const_error.name, second.name));
      64         [ -  + ]:          4 :         assert_se(streq(const_error.message, second.message));
      65         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&second) == EEXIST);
      66         [ -  + ]:          4 :         assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_EXISTS));
      67         [ -  + ]:          4 :         assert_se(sd_bus_error_is_set(&second));
      68                 :          4 :         sd_bus_error_free(&second);
      69                 :            : 
      70         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&second));
      71         [ -  + ]:          4 :         assert_se(temporarily_const_error._need_free < 0);
      72         [ -  + ]:          4 :         assert_se(sd_bus_error_copy(&second, &temporarily_const_error) == -EACCES);
      73         [ -  + ]:          4 :         assert_se(second._need_free > 0);
      74         [ -  + ]:          4 :         assert_se(streq(temporarily_const_error.name, second.name));
      75         [ -  + ]:          4 :         assert_se(streq(temporarily_const_error.message, second.message));
      76         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&second) == EACCES);
      77         [ -  + ]:          4 :         assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_ACCESS_DENIED));
      78         [ -  + ]:          4 :         assert_se(sd_bus_error_is_set(&second));
      79                 :            : 
      80         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&error));
      81         [ -  + ]:          4 :         assert_se(sd_bus_error_set_const(&error, "System.Error.EUCLEAN", "Hallo") == -EUCLEAN);
      82         [ -  + ]:          4 :         assert_se(streq(error.name, "System.Error.EUCLEAN"));
      83         [ -  + ]:          4 :         assert_se(streq(error.message, "Hallo"));
      84         [ -  + ]:          4 :         assert_se(sd_bus_error_has_name(&error, "System.Error.EUCLEAN"));
      85         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&error) == EUCLEAN);
      86         [ -  + ]:          4 :         assert_se(sd_bus_error_is_set(&error));
      87                 :          4 :         sd_bus_error_free(&error);
      88                 :            : 
      89         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&error));
      90         [ -  + ]:          4 :         assert_se(sd_bus_error_set_errno(&error, EBUSY) == -EBUSY);
      91         [ -  + ]:          4 :         assert_se(streq(error.name, "System.Error.EBUSY"));
      92         [ -  + ]:          4 :         assert_se(streq(error.message, strerror_safe(EBUSY)));
      93         [ -  + ]:          4 :         assert_se(sd_bus_error_has_name(&error, "System.Error.EBUSY"));
      94         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&error) == EBUSY);
      95         [ -  + ]:          4 :         assert_se(sd_bus_error_is_set(&error));
      96                 :          4 :         sd_bus_error_free(&error);
      97                 :            : 
      98         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&error));
      99         [ -  + ]:          4 :         assert_se(sd_bus_error_set_errnof(&error, EIO, "Waldi %c", 'X') == -EIO);
     100         [ -  + ]:          4 :         assert_se(streq(error.name, SD_BUS_ERROR_IO_ERROR));
     101         [ -  + ]:          4 :         assert_se(streq(error.message, "Waldi X"));
     102         [ -  + ]:          4 :         assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
     103         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&error) == EIO);
     104         [ -  + ]:          4 :         assert_se(sd_bus_error_is_set(&error));
     105                 :          4 :         sd_bus_error_free(&error);
     106                 :            : 
     107                 :            :         /* Check with no error */
     108         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&error));
     109         [ -  + ]:          4 :         assert_se(sd_bus_error_set_errnof(&error, 0, "Waldi %c", 'X') == 0);
     110         [ -  + ]:          4 :         assert_se(error.name == NULL);
     111         [ -  + ]:          4 :         assert_se(error.message == NULL);
     112         [ -  + ]:          4 :         assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
     113         [ -  + ]:          4 :         assert_se(sd_bus_error_get_errno(&error) == 0);
     114         [ -  + ]:          4 :         assert_se(!sd_bus_error_is_set(&error));
     115                 :          4 : }
     116                 :            : 
     117                 :            : extern const sd_bus_error_map __start_SYSTEMD_BUS_ERROR_MAP[];
     118                 :            : extern const sd_bus_error_map __stop_SYSTEMD_BUS_ERROR_MAP[];
     119                 :            : 
     120                 :          4 : static void dump_mapping_table(void) {
     121                 :            :         const sd_bus_error_map *m;
     122                 :            : 
     123                 :          4 :         printf("----- errno mappings ------\n");
     124                 :          4 :         m = ALIGN_TO_PTR(__start_SYSTEMD_BUS_ERROR_MAP, sizeof(void*));
     125         [ +  + ]:        516 :         while (m < __stop_SYSTEMD_BUS_ERROR_MAP) {
     126                 :            : 
     127         [ +  + ]:        512 :                 if (m->code == BUS_ERROR_MAP_END_MARKER) {
     128                 :         16 :                         m = ALIGN_TO_PTR(m + 1, sizeof(void*));
     129                 :         16 :                         continue;
     130                 :            :                 }
     131                 :            : 
     132                 :        496 :                 printf("%s -> %i/%s\n", strna(m->name), m->code, strna(errno_to_name(m->code)));
     133                 :        496 :                 m++;
     134                 :            :         }
     135                 :          4 :         printf("---------------------------\n");
     136                 :          4 : }
     137                 :            : 
     138                 :          4 : static void test_errno_mapping_standard(void) {
     139         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "System.Error.EUCLEAN", NULL) == -EUCLEAN);
     140         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "System.Error.EBUSY", NULL) == -EBUSY);
     141         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "System.Error.EINVAL", NULL) == -EINVAL);
     142         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "System.Error.WHATSIT", NULL) == -EIO);
     143                 :          4 : }
     144                 :            : 
     145                 :            : BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors[] = {
     146                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error", 5),
     147                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-2", 52),
     148                 :            :         SD_BUS_ERROR_MAP_END
     149                 :            : };
     150                 :            : 
     151                 :            : BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors2[] = {
     152                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-3", 33),
     153                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-4", 44),
     154                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-33", 333),
     155                 :            :         SD_BUS_ERROR_MAP_END
     156                 :            : };
     157                 :            : 
     158                 :            : static const sd_bus_error_map test_errors3[] = {
     159                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-88", 888),
     160                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-99", 999),
     161                 :            :         SD_BUS_ERROR_MAP_END
     162                 :            : };
     163                 :            : 
     164                 :            : static const sd_bus_error_map test_errors4[] = {
     165                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-77", 777),
     166                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-78", 778),
     167                 :            :         SD_BUS_ERROR_MAP_END
     168                 :            : };
     169                 :            : 
     170                 :            : static const sd_bus_error_map test_errors_bad1[] = {
     171                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", 0),
     172                 :            :         SD_BUS_ERROR_MAP_END
     173                 :            : };
     174                 :            : 
     175                 :            : static const sd_bus_error_map test_errors_bad2[] = {
     176                 :            :         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", -1),
     177                 :            :         SD_BUS_ERROR_MAP_END
     178                 :            : };
     179                 :            : 
     180                 :          4 : static void test_errno_mapping_custom(void) {
     181         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error", NULL) == -5);
     182         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
     183         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-x", NULL) == -EIO);
     184         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-33", NULL) == -333);
     185                 :            : 
     186         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -EIO);
     187         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -EIO);
     188         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -EIO);
     189                 :            : 
     190         [ -  + ]:          4 :         assert_se(sd_bus_error_add_map(test_errors3) > 0);
     191         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -888);
     192         [ -  + ]:          4 :         assert_se(sd_bus_error_add_map(test_errors4) > 0);
     193         [ -  + ]:          4 :         assert_se(sd_bus_error_add_map(test_errors4) == 0);
     194         [ -  + ]:          4 :         assert_se(sd_bus_error_add_map(test_errors3) == 0);
     195                 :            : 
     196         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -999);
     197         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -777);
     198         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-78", NULL) == -778);
     199         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
     200         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-y", NULL) == -EIO);
     201                 :            : 
     202         [ -  + ]:          4 :         assert_se(sd_bus_error_set(NULL, BUS_ERROR_NO_SUCH_UNIT, NULL) == -ENOENT);
     203                 :            : 
     204         [ -  + ]:          4 :         assert_se(sd_bus_error_add_map(test_errors_bad1) == -EINVAL);
     205         [ -  + ]:          4 :         assert_se(sd_bus_error_add_map(test_errors_bad2) == -EINVAL);
     206                 :          4 : }
     207                 :            : 
     208                 :          4 : int main(int argc, char *argv[]) {
     209                 :          4 :         dump_mapping_table();
     210                 :            : 
     211                 :          4 :         test_error();
     212                 :          4 :         test_errno_mapping_standard();
     213                 :          4 :         test_errno_mapping_custom();
     214                 :            : 
     215                 :          4 :         return 0;
     216                 :            : }

Generated by: LCOV version 1.14