LCOV - code coverage report
Current view: top level - libsystemd/sd-bus - test-bus-error.c (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 133 133 100.0 %
Date: 2019-08-22 15:41:25 Functions: 5 5 100.0 %

          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           1 : static void test_error(void) {
      12           1 :         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL, second = SD_BUS_ERROR_NULL;
      13           1 :         const sd_bus_error const_error = SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FILE_EXISTS, "const error");
      14           1 :         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           1 :         assert_se(!sd_bus_error_is_set(&error));
      21           1 :         assert_se(sd_bus_error_set(&error, SD_BUS_ERROR_NOT_SUPPORTED, "xxx") == -EOPNOTSUPP);
      22           1 :         assert_se(streq(error.name, SD_BUS_ERROR_NOT_SUPPORTED));
      23           1 :         assert_se(streq(error.message, "xxx"));
      24           1 :         assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_NOT_SUPPORTED));
      25           1 :         assert_se(sd_bus_error_get_errno(&error) == EOPNOTSUPP);
      26           1 :         assert_se(sd_bus_error_is_set(&error));
      27           1 :         sd_bus_error_free(&error);
      28             : 
      29             :         /* Check with no error */
      30           1 :         assert_se(!sd_bus_error_is_set(&error));
      31           1 :         assert_se(sd_bus_error_setf(&error, NULL, "yyy %i", -1) == 0);
      32           1 :         assert_se(error.name == NULL);
      33           1 :         assert_se(error.message == NULL);
      34           1 :         assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
      35           1 :         assert_se(sd_bus_error_get_errno(&error) == 0);
      36           1 :         assert_se(!sd_bus_error_is_set(&error));
      37             : 
      38           1 :         assert_se(sd_bus_error_setf(&error, SD_BUS_ERROR_FILE_NOT_FOUND, "yyy %i", -1) == -ENOENT);
      39           1 :         assert_se(streq(error.name, SD_BUS_ERROR_FILE_NOT_FOUND));
      40           1 :         assert_se(streq(error.message, "yyy -1"));
      41           1 :         assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
      42           1 :         assert_se(sd_bus_error_get_errno(&error) == ENOENT);
      43           1 :         assert_se(sd_bus_error_is_set(&error));
      44             : 
      45           1 :         assert_se(!sd_bus_error_is_set(&second));
      46           1 :         assert_se(second._need_free == 0);
      47           1 :         assert_se(error._need_free > 0);
      48           1 :         assert_se(sd_bus_error_copy(&second, &error) == -ENOENT);
      49           1 :         assert_se(second._need_free > 0);
      50           1 :         assert_se(streq(error.name, second.name));
      51           1 :         assert_se(streq(error.message, second.message));
      52           1 :         assert_se(sd_bus_error_get_errno(&second) == ENOENT);
      53           1 :         assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_NOT_FOUND));
      54           1 :         assert_se(sd_bus_error_is_set(&second));
      55             : 
      56           1 :         sd_bus_error_free(&error);
      57           1 :         sd_bus_error_free(&second);
      58             : 
      59           1 :         assert_se(!sd_bus_error_is_set(&second));
      60           1 :         assert_se(const_error._need_free == 0);
      61           1 :         assert_se(sd_bus_error_copy(&second, &const_error) == -EEXIST);
      62           1 :         assert_se(second._need_free == 0);
      63           1 :         assert_se(streq(const_error.name, second.name));
      64           1 :         assert_se(streq(const_error.message, second.message));
      65           1 :         assert_se(sd_bus_error_get_errno(&second) == EEXIST);
      66           1 :         assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_EXISTS));
      67           1 :         assert_se(sd_bus_error_is_set(&second));
      68           1 :         sd_bus_error_free(&second);
      69             : 
      70           1 :         assert_se(!sd_bus_error_is_set(&second));
      71           1 :         assert_se(temporarily_const_error._need_free < 0);
      72           1 :         assert_se(sd_bus_error_copy(&second, &temporarily_const_error) == -EACCES);
      73           1 :         assert_se(second._need_free > 0);
      74           1 :         assert_se(streq(temporarily_const_error.name, second.name));
      75           1 :         assert_se(streq(temporarily_const_error.message, second.message));
      76           1 :         assert_se(sd_bus_error_get_errno(&second) == EACCES);
      77           1 :         assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_ACCESS_DENIED));
      78           1 :         assert_se(sd_bus_error_is_set(&second));
      79             : 
      80           1 :         assert_se(!sd_bus_error_is_set(&error));
      81           1 :         assert_se(sd_bus_error_set_const(&error, "System.Error.EUCLEAN", "Hallo") == -EUCLEAN);
      82           1 :         assert_se(streq(error.name, "System.Error.EUCLEAN"));
      83           1 :         assert_se(streq(error.message, "Hallo"));
      84           1 :         assert_se(sd_bus_error_has_name(&error, "System.Error.EUCLEAN"));
      85           1 :         assert_se(sd_bus_error_get_errno(&error) == EUCLEAN);
      86           1 :         assert_se(sd_bus_error_is_set(&error));
      87           1 :         sd_bus_error_free(&error);
      88             : 
      89           1 :         assert_se(!sd_bus_error_is_set(&error));
      90           1 :         assert_se(sd_bus_error_set_errno(&error, EBUSY) == -EBUSY);
      91           1 :         assert_se(streq(error.name, "System.Error.EBUSY"));
      92           1 :         assert_se(streq(error.message, strerror_safe(EBUSY)));
      93           1 :         assert_se(sd_bus_error_has_name(&error, "System.Error.EBUSY"));
      94           1 :         assert_se(sd_bus_error_get_errno(&error) == EBUSY);
      95           1 :         assert_se(sd_bus_error_is_set(&error));
      96           1 :         sd_bus_error_free(&error);
      97             : 
      98           1 :         assert_se(!sd_bus_error_is_set(&error));
      99           1 :         assert_se(sd_bus_error_set_errnof(&error, EIO, "Waldi %c", 'X') == -EIO);
     100           1 :         assert_se(streq(error.name, SD_BUS_ERROR_IO_ERROR));
     101           1 :         assert_se(streq(error.message, "Waldi X"));
     102           1 :         assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
     103           1 :         assert_se(sd_bus_error_get_errno(&error) == EIO);
     104           1 :         assert_se(sd_bus_error_is_set(&error));
     105           1 :         sd_bus_error_free(&error);
     106             : 
     107             :         /* Check with no error */
     108           1 :         assert_se(!sd_bus_error_is_set(&error));
     109           1 :         assert_se(sd_bus_error_set_errnof(&error, 0, "Waldi %c", 'X') == 0);
     110           1 :         assert_se(error.name == NULL);
     111           1 :         assert_se(error.message == NULL);
     112           1 :         assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
     113           1 :         assert_se(sd_bus_error_get_errno(&error) == 0);
     114           1 :         assert_se(!sd_bus_error_is_set(&error));
     115           1 : }
     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           1 : static void dump_mapping_table(void) {
     121             :         const sd_bus_error_map *m;
     122             : 
     123           1 :         printf("----- errno mappings ------\n");
     124           1 :         m = ALIGN_TO_PTR(__start_SYSTEMD_BUS_ERROR_MAP, sizeof(void*));
     125         129 :         while (m < __stop_SYSTEMD_BUS_ERROR_MAP) {
     126             : 
     127         128 :                 if (m->code == BUS_ERROR_MAP_END_MARKER) {
     128           4 :                         m = ALIGN_TO_PTR(m + 1, sizeof(void*));
     129           4 :                         continue;
     130             :                 }
     131             : 
     132         124 :                 printf("%s -> %i/%s\n", strna(m->name), m->code, strna(errno_to_name(m->code)));
     133         124 :                 m++;
     134             :         }
     135           1 :         printf("---------------------------\n");
     136           1 : }
     137             : 
     138           1 : static void test_errno_mapping_standard(void) {
     139           1 :         assert_se(sd_bus_error_set(NULL, "System.Error.EUCLEAN", NULL) == -EUCLEAN);
     140           1 :         assert_se(sd_bus_error_set(NULL, "System.Error.EBUSY", NULL) == -EBUSY);
     141           1 :         assert_se(sd_bus_error_set(NULL, "System.Error.EINVAL", NULL) == -EINVAL);
     142           1 :         assert_se(sd_bus_error_set(NULL, "System.Error.WHATSIT", NULL) == -EIO);
     143           1 : }
     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           1 : static void test_errno_mapping_custom(void) {
     181           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error", NULL) == -5);
     182           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
     183           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-x", NULL) == -EIO);
     184           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-33", NULL) == -333);
     185             : 
     186           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -EIO);
     187           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -EIO);
     188           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -EIO);
     189             : 
     190           1 :         assert_se(sd_bus_error_add_map(test_errors3) > 0);
     191           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -888);
     192           1 :         assert_se(sd_bus_error_add_map(test_errors4) > 0);
     193           1 :         assert_se(sd_bus_error_add_map(test_errors4) == 0);
     194           1 :         assert_se(sd_bus_error_add_map(test_errors3) == 0);
     195             : 
     196           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -999);
     197           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -777);
     198           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-78", NULL) == -778);
     199           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
     200           1 :         assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-y", NULL) == -EIO);
     201             : 
     202           1 :         assert_se(sd_bus_error_set(NULL, BUS_ERROR_NO_SUCH_UNIT, NULL) == -ENOENT);
     203             : 
     204           1 :         assert_se(sd_bus_error_add_map(test_errors_bad1) == -EINVAL);
     205           1 :         assert_se(sd_bus_error_add_map(test_errors_bad2) == -EINVAL);
     206           1 : }
     207             : 
     208           1 : int main(int argc, char *argv[]) {
     209           1 :         dump_mapping_table();
     210             : 
     211           1 :         test_error();
     212           1 :         test_errno_mapping_standard();
     213           1 :         test_errno_mapping_custom();
     214             : 
     215           1 :         return 0;
     216             : }

Generated by: LCOV version 1.14